Vim本质上只是一个编辑器。但只要配合一些适当的插件,vim也能变成一个全功能的IDE。笔者使用vim已经有挺长一段时间了,经过反复的试验,配置了一个高效的PHP开发环境,实为居家旅行、谋财害命、杀人越货必备之良品。
安装Vim GVIM
sudo apt-get install vim
sudo apt-get install gvim
开始配置vim
Linux 下 vim 默认配置文件 /etc/vim/vimrc
用户默认配置文件 ~/.vimrc
如果想一次配置,所有用户都能使用,那就修改 /etc/vim/vimrc,如果只想当前用户可以使用,则修改 ~/.vim
针对开发配置:
au FileType php,c,java,javascript,html,htm call SetPhpOption()
function! SetPhpOption()
set expandtab " 使用空格代替tab
set shiftwidth=4 " 设定 << 和 >> 命令移动时的宽度为 4
set tabstop=4 " 用4个空格代替1个tab
set sts=4 " 设置softtabstop 为 4,输入tab后就跳了4格.
set cindent " C语言方式缩进
set smartindent " 智能缩进
set autoindent " 自动缩进
set smarttab " 只在行首用tab,其他地方的tab都用空格代替
set showmatch " 在输入括号时光标会短暂地跳到与之相匹配的括号处
" set fdm=indent " 代码折叠
set lbr
set tw=500
set wrap " 自动换行
endfunction
这时tpl还是不行的,我们应该把tpl当成html处理
修改/vim/vim72/filtype.vim 加入
au BufNewFile,BufRead *.tpl setf html
用NERDTree实现目录和文件导航
在进行PHP应用开发时,同时编辑多个文件是很正常的事情。所以必须有一个方便的目录导航工具,以便在目录结构间快速切换,找到需要编辑的文件。
vim中提供该类功能的插件很多,比较知名的有project、winmanager等。但笔者个人认为最好用的还是The NERD Tree这个插件。NERDTree不但可以显示完整的目录树结构,还可以将任何一个目录设置为根目录。并且提供了目录导航的书签功能,可谓非常方便。
下载地址:http://www.vim.org/scripts/script.php?script_id=1658
下载文件:NERD_tree.zip
解压缩时,要把压缩包中的目录结构完整的解压缩到 ~/.vim/ 目录中。完成后,应该分别找到 ~/.vim/doc/NERD_tree.txt 文件和 ~/.vim/plugin/NERD_tree.vim 文件。然后在vim中输入命令: helptags ~/.vim/doc,将NERDTree的帮助文档添加到vim中。
现在,命令模式下输入:NERDTreeToggle便可打开或关闭NERDTree
注意: 使用过程中,你可能会因为删除一个文件夹,而没有删除这个文件夹所绑定的标签,出现以下错误
NERDTree: 1 invalid bookmarks w...
解决: 打开~/.vim/.NERDTreeBookmarks,删除里面无用的标签即可。
用taglist实现代码导航
解决了目录和文件导航问题,我们还要为代码之间的跳转提供辅助手段,taglist就是这样一个插件。taglist可以列出已打开文件中定义的类 、函数 、常量 ,甚至变量 。
下载地址:http://www.vim.org/scripts/script.php?script_id=273
下载文件:taglist_45.zip
压缩包需要完整解压缩到 ~/.vim/ 目录,并且用:helptags ~/.vim/doc命令索引taglist插件的帮助文档。
taglist插件需要依赖ctags程序才能工作。目前常用的ctags版本是Exuberant Ctags。
安装ctags
下载地址:http://ctags.sourceforge.net/
下载文件:ctags-5.8.tar.gz
解压ctags:tar -zxcf ctags-5.8.tar.gz
进入ctags:cd ctags-5.8
打上PHP补丁 (否则按下ctrl+n,连基本的function include等函数都出不来):
wget http://svn.bitflux.ch/repos/public/misc/ctags-php5.patch
编译安装:
./configure
make
sudo make install
经过这三步后就生成 /usr/local/bin/ctags
继续回来修改~/.vim/plugin/taglist.vim
在 if !exists('loaded_taglist')上面加入
let Tlist_Ctags_Cmd="/usr/local/bin/ctags"
或加在~/.vim/.vimrc文件,只要能让vim开启时加载的*.vim文件即可
此时Ctags和Taglist已经结合起来。
在相应的源码目录运行ctags -R产生相应的tags文件
cd ctags:cd ctags-5.8
ctags -R
拷贝到 ~/.vim/ 目录下
cp tags ~/.vim/
将tags文件在vim运行时导入。可以修改~/.vimrc,以后每次启动vim将自动导入此tags文件
:set tags=~/.vim/tags
并设置语法高亮
syntax enable
syntax on
此时再用vim编辑php文件,就会在右边出现一个当前文件的 类 函数 变量 等东西
使用ctags时, ctrl+] 可查看函数的定义。 ctrl+o 返回源文件。
小技巧:
细心的朋友可能会发现,作为一个强大的IDE,还应该解决以下几个问题:
1.左边目录树结构不变。
2.代码块注释,删除注释。
3.代码块缩进,删除缩进。
解决问题:
1.一般情况下,我们会以标签的方式打开一个文件(让光标停留在一个要打开的文件上,按 t ),此时左边没有目录树,输入 :NERDTreeToggle打开目录树,此目录树为新建的,和第一个文件的目录树结构不同,这不符合我们普通IDE的习惯,还记得我们用Netbeans之类的编辑器吗?左边的目录书结构一直没变,其实是所有文件共享一颗树的原因,NERDTree也允许我们共享树,命令是 :NERDTreeMirror,结合Tlist,我的快捷方式定义如下:
map <F2> :NERDTreeToggle<CR>
map <F3> :TlistToggle<CR>
map <F4> t :NERDTreeMirror<CR>
现在,看看我写代码的习惯:
首先,打开vi编辑器。
按<F2> 打开目录树
把光标停留在需要建立标签的文件夹上, :Bookmark 收藏名。
以后只需要 <F2>打开目录树,Shift+B打开收藏标签,双击一下想打开的标签,再按一次Shift+B关闭收藏标签。
鼠标选中需要打开的文件,按快捷键 <F4>,此时,vi会先执行 t (标签方式打开文件),再执行:NERDTreeMirror共享第一棵树。
怎么样,效果和大型IDE差不多了吧。
2.代码块注释,删除注释
注释:ctrl+v 进入列编辑模式,向上或向下移动光标,把需要注释的行的开头标记起来,然后按大写的I,再插入注释符,比如"//",再按Esc,就会全部注释了。
删除:ctrl+v 进入列编辑模式,选中注释部分,然后按d,就会删除注释符号。
3.代码块缩进,删除缩进。
缩进:选择需要缩进的代码行(键盘鼠标都可以,选中了就行),>(shift+.)
删除:选择需要缩进的代码行(键盘鼠标都可以,选中了就行),<(shift+,)
下面是我一直使用的配置文件,有兴趣的朋友可以参考一下
- " An example for a vimrc file.
- " disable VI's compatible mode..
- set nocompatible
- " set encoding
- set encoding = utf8
- " running in gui
- if has("gui_running")
- " set color schema
- colorscheme rootwater
- endif
- " allow backspacing over everything in insert mode
- set backspace = indent ,eol,start
- " Enable syntax highlight
- syntax enable
- syntax on
- set tags =~/.vim/tags " tagslist文件
- " Basic editing options
- set history = 50 " keep 50 lines of command line history
- set ruler " show the cursor position all the time
- set showcmd " display incomplete commands
- set number " Show line number
- set mouse = a " Have the mouse enabled all the time
- set incsearch " do incremental searching
- " set sts = 4
- set linebreak
- " Develop editing options
- au FileType vim setl shiftwidth = 2
- au FileType vim setl tabstop = 2
- au FileType html,c,javascript,java,php setl shiftwidth = 4 " 当行之间交错时使用4个空格
- au FileType html,c,javascript,java,php setl tabstop = 4 " 用4个空格代替1个tab
- au FileType html,c,javascript,java,php setl expandtab " 使用空格代替tab
- " au FileType java,php setl cursorline " 高亮当前行
- au FileType html,c,javascript,java,php setl nobackup " 不备份
- au FileType html,c,javascript,java,php setl hlsearch " 高亮显示所有匹配
- " au FileType html,c,javascript,java,php setl fdm = indent " 代码折叠
- " au FileType html,c,javascript,java,php setl showmatch " 匹配模式,如:输入一个左括号,右括号自动加上
- "au FileType php setl dictionary- =~/.funclist.txt
- "au FileType php setl dictionary+=~/.funclist.txt
- "au FileType php setl complete- = k
- "au FileType php setl complete+=k
- set dictionary- =~/.vim/funclist.txt dictionary+=~/.vim/funclist.txt
- set complete- = k complete+=k
- " Only do this part when compiled with support for autocommands.
- if has("autocmd")
- " Enable file type detection.
- " Use the default filetype settings, so that mail gets 'tw' set to 72,
- " 'cindent' is on in C files, etc.
- " Also load indent files, to automatically do language-dependent indenting.
- filetype plugin indent on
- " Put these in an autocmd group, so that we can delete them easily.
- augroup vimrcEx
- au!
- " For all text files set 'textwidth' to 78 characters.
- autocmd FileType text setlocal textwidth = 78
- " When editing a file, always jump to the last known cursor position.
- " Don't do it when the position is invalid or when inside an event handler
- " (happens when dropping a file on gvim).
- autocmd BufReadPost *
- / if line("'/"") > 0 && line("'/"") < = line("$") |
- / exe "normal! g`/"" |
- / endif
- augroup END
- else
- set autoindent " always set autoindenting on
- endif " has("autocmd")
- source ~/.vim/map.vim " 导入快捷键映射文件
- source ~/.vim/taglist.vim " 导入taglist配置文件
- " gd 模式,左:h 右:l 上:j 下:k
- map Q gq
- " switch buffers with Tab
- map < C-Tab > :bn < CR >
- map < S-Tab > :bp < CR >
- " NERDTree
- map < F2 > :NERDTreeToggle < CR >
- map < F3 > :TlistToggle<CR>
- map <F4> t :NERDTreeMirror<CR>
- nmap < silent > < F8 > :call SvnDiffToggle()<CR>
- nmap < silent > g < F8 > :new __SVN_DIFF__ < CR > :read !svn diff < CR > :set syntax = diff buftype = nofile < CR > gg
- function SvnDiffToggle()
- if bufexists("__SVN_DIFF__")
- bwipeout __SVN_DIFF__
- else
- if exists("t:flwsvndiff")
- diffoff!
- let l:fileName = t :flwsvndiff
- unlet t:flwsvndiff
- exec "bwipeout " . l:fileName
- else
- let t:flwsvndiff = expand ("%:h") . "/.svn/text-base/" . expand("%:t") . ".svn-base"
- let l:ft = &ft
- exec "silent vert diffsplit " . t:flwsvndiff
- set readonly
- set buftype = nofile
- exec "set ft =" . l:ft
- wincmd p
- autocmd VimResized * :wincmd =
- endif
- endif
- endfunction
- """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
- " => Plugin configuration
- """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
- " taglist
- set tags=~/.vim/tags
- let Tlist_Ctags_Cmd="/usr/local/bin/ctags"
- let Tlist_Auto_Highlight_Tag = 1
- let Tlist_Auto_Open = 0
- let Tlist_Auto_Update = 1
- let Tlist_Close_On_Select = 0
- let Tlist_Compact_Format = 0
- let Tlist_Display_Prototype = 0
- let Tlist_Display_Tag_Scope = 1
- let Tlist_Enable_Fold_Column = 0
- let Tlist_Exit_OnlyWindow = 1
- let Tlist_File_Fold_Auto_Close = 0
- let Tlist_GainFocus_On_ToggleOpen = 1
- let Tlist_Hightlight_Tag_On_BufEnter = 1
- let Tlist_Inc_Winwidth = 0
- let Tlist_Max_Submenu_Items = 1
- let Tlist_Max_Tag_Length = 30
- let Tlist_Process_File_Always = 0
- let Tlist_Show_Menu = 1
- let Tlist_Show_One_File = 1
- let Tlist_Sort_Type = "order"
- let Tlist_Use_Horiz_Window = 0
- let Tlist_Use_Right_Window = 1
- let Tlist_WinWidth = 30
- let tlist_php_settings = 'php;c:class;i:interfaces;d:constant;f:function'