首页 > 程序人生 > 使用Vim配置一个高效的PHP开发环境
2014
11-11

使用Vim配置一个高效的PHP开发环境

一、首先确认电脑或服务器上已经安装VIM,如果不行没有的话可以去VIM官网(http://www.vim.org/download.php)载相应的版本进行安装。安装过程不再叙述。

二、开始配置vim

配置之前有几点先说明一下:

    I.为了方便叙述下文中如无特殊说明$VIM均为VIM的安装目录。

    II.下文中的配置安装均在Linux(redhat)下完成,如有不同请自行调节或者给我留言,我会尽力解答。

    III. 双引号 " 为配置文件注释符号

    IV.当加入新doc时,需要执行命令:helptags $VIM/doc ,然后才能 :help ***

1.修改.vimrc后自动生效

在今后使用vim的日子里,你可能会频繁的更改你的.vimrc(VIM配置文件)所以我们先进行一些简单的配置使我们的修改更加方便

打开$VIM目录,可以看到其中有一个.vimrc文件,用vim打开此文件,删除所有内容后,在最后插入三行:

" 配置文件.vimrc更改后自动重新载入使设置生效

autocmd! bufwritepost .vimrc source ~/.vimrc

“设置重新载入.vimrc快捷键

map <silent> <leader>ss :source ~/.vimrc<cr>

“设置快速编辑.vimrc快捷键

map <silent> <leader>ee :e ~/.vimrc<cr>

上述设置让我们通过vim编辑.vimrc文件并保存时,可以自动载入.vimrc文件,使得我们对vim的定制可以立即生效(无需重启vim)。

2.使vim中文化

在.vimrc顶部增加下列文本:

“禁用VI兼容模式

set nocompatible

Vim 的内部编码

set encoding=utf-8

“Vim 在与屏幕/键盘交互时使用的编码(取决于实际的终端的设定)

set termencoding=utf-8

“Vim 当前编辑的文件在存储时的编码

set fileencoding=utf-8

“Vim 打开文件时的尝试使用的编码

set fileencodings=ucs-bom,utf-8,gbk,default,latin1

“设置中文帮助

set helplang=cn

上述代码的作用是禁用vi兼容模式(原始的vi功能太少了,没必要考虑兼容)、按照utf-8、gbk的顺序来检测文件编码,并设置帮助为中文。不过设置set helplang=cn并不能马上看到中文帮助,我们还得下载中文帮助文件。

下载地址:http://vimcdoc.sourceforge.net/
下载文件:vimcdoc-1.8.0.tar.gz

得到中文帮助文件压缩包后,将压缩包中doc子目录的所有文件复制到$VIM/doc/目录中,在VIM中执行执行:helptags $VIM/doc,如果没有doc目录,可先创建doc目录。此时再输入:help命令就可以看到中文帮助了。

3.设置字体

将该设置写入.vimrc文件。

"设置字体

if has("gui_running")

      set guifont=Consolas:h9

endif

上述代码中的if … endif是一个条件判断结构。指示只有当我们使用图形界面版的vim时才设置字体。

4.为编辑PHP代码进行基本设置

现在用vim打开.php文件看上去是很难看的,别说代码高亮,连行号都没有显示。所以还要给.vimrc添加以下内容:

“ 格式化高亮

syntax on

“ 显示行号

set nu

“ 括号匹配

set showmatch

“自动检测文件类型

filetype plugin indent on

“在缩进和遇到 Tab 键时使用空格替代

set expandtab

"根据文件类型设置缩进格式

au FileType html,python,vim,javascript setl shiftwidth=2

au FileType html,python,vim,javascript setl tabstop=2

au FileType java,php setl shiftwidth=4

au FileType java,php setl tabstop=4

" 启动vim时不要自动折叠代码

set foldlevel=100

“自动对齐

set ai

"依据上面的对起格式

set si

set smarttab

set wrap

set lbr

set tw=0

set foldmethod=syntax

上述设置启用了格式化高亮、行号显示,以及括号匹配、自动缩进等编辑功能,对于大多数情况都可以获得理想的编辑体验。不过此时对.php文件的支持还不完善,需要下载专门的php插件。

下载地址:http://www.vim.org/scripts/script.php?script_id=1571
下载文件:php.tar.gz

将其中的php.vim复制到$VIM/syntax/目录中即可。如果没有该目录要先创建该目录。

5.设置喜欢的配色方案

默认的配色方案相信没几个人会喜欢,可以通过下面的网址查看配色方案并下载(有几百个哦)。

下载:http://www.cs.cmu.edu/~maverick/VimColorSchemeTest/index-c.html

这个网址列出了300多个配色方案以及实际的显示效果,点击方案名称即可下载到一个.vim文件。我用的是freya。将该文件放入$VIM/colors目录(如果没有该目录可先创建该目录),然后在vimrc中添加:

" set color schema

colorscheme freya

这两行代码需要加到if has("gui_running") … endif代码块中,例如:

if has("gui_running")

 set guifont=Consolas:h9

 " set color schema

 colorscheme freya

endif

设置后显示效果就漂亮多了:-)­

6.更多有用的编辑设置

虽然不是专门针对编辑.php文件的设置,但这些选项可以让vim更好用,所以建议加上(注释不在翻译,基本上大家应该都可以看懂):

" Sets how many lines of history VIM har to remember

set history=400

" Set to auto read when a file is changed from the outside

set autoread

" Have the mouse enabled all the time:

set mouse=a

" Do not redraw, when running macros.. lazyredraw

set lz

" set 7 lines to the curors - when moving vertical..

set so=7

" The commandbar is 2 high

set cmdheight=2

" Change buffer - without saving

set hid

" Ignore case when searching

" set ignorecase

set incsearch

" Set magic on

set magic

" No sound on errors.

set noerrorbells

set novisualbell

set t_vb=

" How many tenths of a second to blink

set mat=4

" Highlight search things

set hlsearch

" Turn backup off

set nobackup

set nowb

set noswapfile

" smart backspace

set backspace=start,indent,eol

" switch buffers with Tab

map <C-Tab> :bn<CR>

map <S-Tab> :bp<CR>

经过一番改造,我们的vim已经可以很顺手的编辑.php文件了。不过要打造php开发环境还有很多工作要做呢。

三、打造自己的PHP IDE

1、配置svn

大多时候我们不是一个人在战斗,所以接下来我们要配置一下vim中的SVN。

首先要下载svn插件svn.vim

下载地址:http://www.vim.org/scripts/script.php?script_id=743

将下载后的文件加压后放到相对应的文件夹里就可以了,如果doc中新加的文件不要忘了:helptags $VIM/doc。

如果配置好了,不知道如何使用可以用:help svn来查看。

一般svn插件中会有一些默认的快捷键,比如

<Leader><LocalLeader>c - Calls :Svn commit

还可以自己定义一些其他快捷键,只要在.vimrc中加入下面代码即可

"更新当前目录的代码
map <F5>    :!svn up <cr>
"提交SVN(当前目录)
map <F7>    :!svn ci -m "" <cr>
"提交SVN(当前文件)7
map <F8>    :!svn ci -m "" %<cr>

"提交SVN(当前文件)前先检查php语法
map <F8>    :!php -l % > /dev/null && svn ci -m "" %<cr>
"仅检测PHP语法
autocmd FileType php map <silent> <F9> :!php -l %<cr>

 2、在程序中跳来跳去tags

先简单介绍一下tag

Tag文件(标签文件)无疑是开发人员的利器之一,有了tag文件的协助,你可以在vim查看函数调用关系,类、结构、宏等的定义,可以在任意标签中跳 转、返回……

对于程序来说,Tag文件中保存了诸如函数、类、结构、宏等的名字,它们所处的文件,以及如何通过Ex命令跳转到这些标签。它是一个纯文本文件,因此你可以手工的编辑它,也可以使用脚本对其进行操作。

通常我们使用名为ctags的程序来生成这样的tag文件。vim能直接使用ctags程序所生成的tag文件。在UNIX系统下的ctags功能比较 少,所以一般我们使用Exuberant Ctags(在大多数Linux系统上,它是缺省的ctags程序),它能够支持多达33种程序语言,足以满足我们开发的需要了。

这里是它的中文手册。如果你的系统上未安装此程序,请到http://ctags.sourceforge.net下载。

   安装好以后去你的项目源码所在目录,我的是在/opt/Site/mpf/

在该目录下运行命令: ctags –R

此时在/opt/Site/mpf/目录下会生成一个 tags 文件

用VIM打开你项目源码中的任意一个文件,再在vim中运行命令: :set tags=/opt/Site/mpf/tags 该命令将tags文件加入到vim中来, 你也可以将这句话放到$VIM/.vimrc中去, 如果你经常在这个项目中编程的话.

3.教你高效地浏览源码 -- 插件: TagList

使用taglist plugin,必须满足 一下三个条件:

a.打开vim的文件类型自动检测功能:filetype on

b.系统中装了Exuberant ctags工具,并且taglist plugin能够找到此工具(因为taglist需要调用它来生成tag文件)

c.你的vim支持system()调用 (一般都会支持)

如果满足以上条件,接下来就可以安装taglist plugin插件了。

下载地址:http://www.vim.org/scripts/script.php?script_id=273 安装完成后可以进行一些简单的配置

if MySys() == "windows"   "设定windows系统中ctags程序的位置

let Tlist_Ctags_Cmd = 'ctags'

elseif MySys() == "linux"  "设定linux系统中ctags程序的位置

let Tlist_Ctags_Cmd = '/usr/bin/ctags‘

endif

"只显示当前文件的

let Tlist_Show_One_File = 1

"如果taglist窗口是最后一个窗口,则退出vim

let Tlist_Exit_OnlyWindow = 1

"在右侧窗口中显示taglist窗口配置好以后

let Tlist_Use_Right_Window = 1

可以用”:TlistOpen“打开taglist窗口

用”:TlistClose“关闭taglist窗口

或者使用”:TlistToggle“在打开和关闭间切换。

也可以在vimrc中定义快捷键,使用<F9>键就可以打开/关闭taglist窗口:

map <silent> <F9> :TlistToggle<cr>

4.文件浏览 netrw

在vim 7.0以前,文件浏览功能由explorer.vim插件提供,在vim 7.0中,这个插件被netrw.vim插件所代替

netrw.vim是vim的标准插件,它已经伴随vim而发行,不需要安装。

我们现在试一下vim文件功能,当你使用vim尝试打开目录时,vim会自动调用netrw.vim插件打开该目录(从操作系统的视角来看,目录其实是一种特殊的文件)。

进入"$VIM "文件夹后运行vim, 然后在vim中运行命令

例如,我们在vim中执行命令”: e~ $VIM“,会显示一个窗口,这个窗口类似于文件管理器,你可以创建、删除、改名文件或目录;在目录上按回车时,会进入该目录;在文件上按回车时,会使用vim打开该文件;可以更改排序方式、排序风格;隐藏目录或文件(使之不在上述窗口中显示)等等。

5.缓冲区浏览 BufExplorer

在开发过程中,经常会打开很多缓冲区,尤其是使用tag文件在不同函数间跳转时,会不知不觉打开很多文件。要知道自己当前打开了哪些缓冲区,可以使用vim的”:ls“Ex命令查看。

开发过程中,又经常需要在不同文件间跳转。我习惯于使用”CTRL-^“来切换文件,这就需要知道文件所在的缓冲区编号。每次都使用”:ls“来找缓冲区编号很麻烦,所以我使用BufExplorer插件来显示缓冲区的信息。

下载:http://vim.sourceforge.net/scripts/script.php?script_id=42

下载后,把该文件在$VIM目录中解压缩,这会在你的$VIM/plugin和$VIM/doc目录中各放入一个文件:

plugin/ bufexplorer.vim - bufexplorer插件

doc/ bufexplorer.txt    - bufexplorer帮助文件

使用下面的命令生成帮助标签(下面的操作在vim中进行):

:helptags $VIM/doc

然后,就可以使用”:help bufexplorer“命令查看BufExplorer的帮助文件了。

下面是我的一些配置

let g:bufExplorerDefaultHelp=0  " Do not show default help.

let g:bufExplorerShowRelativePath=1 " Show relative paths.

let g:bufExplorerSortBy='mru'     " Sort by most recently used.

let g:bufExplorerSplitRight=0        " Split left.

let g:bufExplorerSplitVertical=1     " Split vertically.

let g:bufExplorerSplitVertSize = 30 " Split width

let g:bufExplorerUseCurrentWindow=1 " Open in new window.

autocmd BufWinEnter \[Buf\ List\] setl nonumber

其他的功能就不一一介绍了

6.窗口管理器winmanager插件

winmanager插件可以把上面介绍的netrw插件和BufExplorer插件集成在一起,我们上篇文章中介绍过的taglist插件也提供了对winmanager插件的支持。

下载:http://vim.sourceforge.net/scripts/script.php?script_id=95

下载后,把该文件在$VIM目录中解压缩,这会把winmanager插件解压到$VIM /plugin和$VIM /doc目录中:

plugin/winmanager.vim – winmanager插件

plugin/winfileexplorer.vim - 改良的Explorer插件

plugin/wintagexplorer.vim – winmanager提供的tag插件,用处不大

doc/winmanager.txt – 帮助文件

仍然用”:helptags $VIM/doc“命令来生成帮助标签,然后就可以使用”:help winmanager“来查看帮助了。

使用winmanager插件可以控制各插件在vim窗口中的布局显示。我的vimrc中这样设置:

let g:winManagerWindowLayout = "BufExplorer,FileExplorer|TagList"

let g:winManagerWidth = 30

let g:defaultExplorer = 0

nmap <C-W><C-F> :FirstExplorerWindow<cr>

nmap <C-W><C-B> :BottomExplorerWindow<cr>

nmap <silent> <leader>wm :WMToggle<cr>

g:winManagerWindowLayout变量的值定义winmanager的窗口布局

7. cscope

在前面的文章中介绍了利用tag文件,跳转到标签定义的地方。但如果想查找函数在哪里被调用,或者标签在哪些地方出现过,ctags就无能为力了,这时需要使用更为强大的cscope。

如果你的系统中有cscope命令, 则可以跳过这一小段, 如果没有, 就先跟着我一起安装一个吧. 在Cscope的主页: http://cscope.sourceforge.net/下载一个源码包, 解压后编译安装

跟Ctags一样, 要使用其功能必须先为你的代码生成一个cscope的数据库, 在项目的根目录运行下面的命令:

    cscope -Rbq

这个命令会生成三个文件:cscope.out, cscope.in.out, cscope.po.out。其中cscope.out是基本的符号索引,后两个文件是使用”-q“选项生成的,可以加快cscope的索引速度。

Cscope在生成数据库中,在你的项目目录中未找到的头文件,会自动到/usr/include目录中查找。如果你想阻止它这样做,使用”-k“选项。

Cscope缺省只解析C文件(.c和.h)、lex文件(.l)和yacc文件(.y),虽然它也可以支持C++以及Java,但它在扫描目录时会跳过C++及Java后缀的文件。如果你希望cscope解析C++或Java文件,需要把这些文件的名字和路径保存在一个名为cscope.files的文件。当cscope发现在当前目录中存在cscope.files时,就会为cscope.files中列出的所有文件生成索引数据库。通常我们使用find来生成cscope.files文件,以PHP源码为例:

         cd 项目目录

   find *.php –type f > cscope.files

   cscope -bq

这条命令把项目目录下的所有普通文件都加入了cscope.files,这样,cscope会解析该目录下的每一个文件。上面的cscope命令并没有使用”-R“参数递归查找子目录,因为在cscope.files中已经包含了子目录中的文件

注意:find命令输出的文件以相对路径表示,所以cscope.out的索引也相对于当前路径。如果你要在其它路径中使用当前的cscope.out,需要使用下面介绍的-P选项

Cscope只在第一次解析时扫描全部文件,以后再调用cscope,它只扫描那些改动过的文件,这大大提高了cscope生成索引的速度。

下表中列出了cscope的常用选项:

  • -R: 在生成索引文件时,搜索子目录树中的代码
  • -b: 只生成索引文件,不进入cscope的界面
  • -q: 生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度
  • -k: 在生成索引文件时,不搜索/usr/include目录
  • -i: 如果保存文件列表的文件名不是cscope.files时,需要加此选项告诉cscope到哪儿去找源文件列表。可以使用”-“,表示由标准输入获得文件列表。
  • -Idir: 在-I选项指出的目录中查找头文件
  • -u: 扫描所有文件,重新生成交叉索引文件
  • -C: 在搜索时忽略大小写
  • -Ppath: 在以相对路径表示的文件前加上的path,这样,你不用切换到你数据库文件所在的目录也可以使用它了。

在vim中使用cscope非常简单,首先调用”cscope add“命令添加一个cscope数据库,然后就可以调用”cscope find“命令进行查找了。vim支持8种cscope的查询功能,如下:

  • s: 查找C语言符号,即查找函数名、宏、枚举值等出现的地方
  • g: 查找函数、宏、枚举等定义的位置,类似ctags所提供的功能
  • d: 查找本函数调用的函数
  • c: 查找调用本函数的函数
  • t: 查找指定的字符串
  • e: 查找egrep模式,相当于egrep功能,但查找速度快多了
  • f: 查找并打开文件,类似vim的find功能
  • i: 查找包含本文件的文件

例如,我们想在vim 7.0的源代码中查找调用do_cscope()函数的函数,我们可以输入:”:cs find c do_cscope“,回车后发现没有找到匹配的功能,可能并没有函数调用do_cscope()。我们再输入”:cs find s do_cscope“,查找这个C符号出现的位置,现在vim列出了这个符号出现的所有位置。

我们还可以进行字符串查找,它会双引号或单引号括起来的内容中查找。还可以输入一个正则表达式,这类似于egrep程序的功能,但它是在交叉索引数据库中查找,速度要快得多。

vim的手册中给出了使用cscope的建议方法,使用命令”:help cscope-suggestions“查看。

下面是我的vimrc中关于cscope接口的设置:

if has("cscope")

set csprg=/usr/bin/cscope

set csto=1

set cst

  set nocsverb

  " add any database in current directory

   if filereadable("cscope.out")

      cs add cscope.out

  endif

  set csverb

endif

nmap <C-@>s :cs find s <C-R>=expand("<cword>")<CR><CR>

nmap <C-@>g :cs find g <C-R>=expand("<cword>")<CR><CR>

nmap <C-@>c :cs find c <C-R>=expand("<cword>")<CR><CR>

nmap <C-@>t :cs find t <C-R>=expand("<cword>")<CR><CR>

nmap <C-@>e :cs find e <C-R>=expand("<cword>")<CR><CR>

nmap <C-@>f :cs find f <C-R>=expand("<cfile>")<CR><CR>

nmap <C-@>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>

nmap <C-@>d :cs find d <C-R>=expand("<cword>")<CR><CR>

8. QuickFix窗口

在上一节的图10中大家可以看到在窗口下面有一个显示查询结果的窗口, 这个窗口中列出了查询命令的查询结果, 用户可以从这个窗口中选择每个结果进行查看, 这个窗口叫"QuickFix"窗口, 以前也是一个vim的插件来的, 只不过现在成了vim的标准插件, 不用你在去安装了, QuickFix窗口的主要作用就是上面看到的那个功能: 输出一些供选择的结果, 可以被很多命令调用, 更详细的介绍和使用方法请用下面的命令打开QuickFix的手册来学习吧:

:help quickfix

这里我一个常用的例子来再介绍一种QuickFix窗口的使用方法. 这个例子是要模仿平时我们编程时, 当编译出错时, QuickFix会把出错的信息列出来, 供我们一条条地查看和修改.

显然编译会报很多错误, 当编译结束并退出到源码界面时, 刚才编译器报的错误都已经看不到了, 但是我们可以用QuickFix窗口再将错误信息找出来, 用下面的命令调出QuickFix窗口:

:cw

此时你就可以看如下图所示的QuickFix窗口了:

在下面的QuickFix窗口中我们可以找到每一个编译错误, 同样你可以用鼠标点击每一条记录, 代码会马上自动跳转到错误处, 你还可以用下面的命令来跳转:

:cn // 切换到下一个结果

:cp // 切换到上一个结果

如果你经常使用这两个命令, 你还可以给他们设定快捷键, 比如在$VIM/.vimrc中增加:

nmap <F6> :cn<cr>

nmap <F7> :cp<cr>

其还有其他的命令/插件也会用到QuickFix窗口, 但是用法基本上的都是类似的。

9. 在工程中查找 -- 插件: Grep

我们在上面中讲过,cscope可以做为一个快速的grep程序使用,对于我们的软件项目,用cscope生成一个数据库,可以大大加快查找字符串的速度。但cscope需要事先生成一个数据库,对一些简单的查找,不需要专门为之生成数据库,这时候可以使用grep

下载地址: http://www.vim.org/scripts/script.php?script_id=311

Grep有很多命令但是我从来都不用敲那些命令的, 因为我在$VIM/.vimrc中增加了下面这句:

nnoremap <silent> <F3> :Grep<CR>

在最下面的命令行会显示:

Search for pattern: FEAT_QUICKFIX

此时你还可以编辑该行, grep支持正则表达式, 你想全词匹配的话可以改成:

Search for pattern: \<FEAT_QUICKFIX\>

然后按下回车:

在最下面的命令行会显示:

Search in files: *

是问你搜索范围, 默认是该目录下的所有文件, 此时你还可以编辑该行, 比如你只想搜索源码文件:

Search in files: *.c *.h

然后在按下回车, 会在弹出的QuickFix窗口中列出所有符合条件的搜索结果, 你可以在其中查找你想要的结果, 如下图:

10.自动补全

vim也可以做到自动补全的! 下面由我来教你, 该功能要tags文件的支持, 并且是ctags 5.6版本, 可以看看前文介绍tags文件的章节

我这里要介绍的功能叫"new-omni-completion(全能补全)", 你可以用下面的命令看看介绍:

:help new-omni-completion

你还需要在$VIM/.vimrc文件中增加下面两句:

filetype plugin indent on

打开文件类型检测, 加了这句才可以用智能补全

set completeopt=longest,menu “关掉智能补全时的预览窗口

请确定你的Ctags 5.6已经安装好, 并且生成的tags文件已经可以用了, 那么我们就要抄家伙开搞了.用vim打开源文件

$ vi /opt/Site/mpf/index.php

设置tags文件

:set tags=/opt/Site/mpf/tags

随便找一个有成员变量的对象, 比如"parmp", 进入Insert模式, 将光标放在"->"后面, 然后按下"Ctrl+X Ctrl+O", 此时会弹出一个下列菜单, 显示所有匹配的标签,

随便找一个有成员变量的对象, 比如"parmp", 进入Insert模式, 将光标放在"->"后面, 然后按下"Ctrl+X Ctrl+O", 此时会弹出一个下列菜单, 显示所有匹配的标签,

顺便附上我的配置文件和一些插件: /Files/mo-beifeng/myVIM.rar

本文参考:

vi/vim使用进阶

http://easwy.com/blog/archives/advanced-vim-skills-catalog/

Vim 实用技术

http://www.ibm.com/developerworks/cn/linux/l-tip-vim1/index.html

Vimer的程序世界

http://www.vimer.cn/

《手把手教你把Vim改装成一个IDE编程环境 Ver: 0.7》

http://blog.csdn.net/wooin/article/details/2844868

编程技巧