1、http://www.oschina.net/question/132421_18650?sort=time&p=1
vim是一个很强的神器,对于我只用到其中的一小部分内容,接下来是我打造 php IDE的全过程,希望有兄弟能指点我其中的不足,要学习的兄弟能跟我一起努力学习。
第一步:配_vimrc,配成自己喜欢的样式。
代码:
set nocompatible "关闭 vi 兼容模式
syntax on " 自动语法高亮
hi LineNr guifg=black
:set background=dark
:colorscheme evening
set number " 显示行号
set cursorline " 突出显示当前行
set ruler " 打开状态栏标尺
set nobackup " 覆盖文件时不备份
set autochdir " 自动切换当前目录为当前文件所在的目录
filetype plugin indent on " 开启插件
set backupcopy=yes " 设置备份时的行为为覆盖
set ignorecase smartcase " 搜索时忽略大小写,但在有一个或以上大写字母时仍保持对大小写敏感
set nowrapscan " 禁止在搜索到文件两端时重新搜索
set incsearch " 输入搜索内容时就显示搜索结果
set hlsearch " 搜索时高亮显示被找到的文本
set noerrorbells " 关闭错误信息响铃
set novisualbell " 关闭使用可视响铃代替呼叫
set t_vb= " 置空错误铃声的终端代码
" set showmatch " 插入括号时,短暂地跳转到匹配的对应括号
" set matchtime=2 " 短暂跳转到匹配括号的时间
set magic " 设置魔术
set hidden " 允许在有未保存的修改时切换缓冲区,此时的修改由 vim 负责保存
set guioptions-=T " 隐藏工具栏
set guioptions-=m " 隐藏菜单栏
set smartindent " 开启新行时使用智能自动缩进
set backspace=indent,eol,start
" 不设定在插入状态无法用退格键和 Delete 键删除回车符
set cmdheight=1 " 设定命令行的行数为 1
set laststatus=2 " 显示状态栏 (默认值为 1, 无法显示状态栏)
set statusline=\ %<%F[%1*%M%*%n%R%H]%=\ %y\ %0(%{&fileformat}\ %{&encoding}\ %c:%l/%L%)\
" 设置在状态行显示的信息
set foldenable " 开始折叠
set foldmethod=marker " 设置语法折叠
set foldcolumn=4 " 设置折叠区域的宽度
setlocal foldlevel=3 " 设置折叠层数为
:set foldopen=all
:set foldclose=all " 设置为自动关闭折叠
" nnoremap <space> @=((foldclosed(line('.')) < 0) ? 'zc' : 'zo')<CR>
" 用空格键来开关折叠
" return OS type, eg: windows, or linux, mac, et.st..
function! MySys()
if has("win16") || has("win32") || has("win64") || has("win95")
return "windows"
elseif has("unix")
return "linux"
endif
endfunction
" 用户目录变量$VIMFILES
if MySys() == "windows"
let $VIMFILES = $VIM.'/vimfiles'
elseif MySys() == "linux"
let $VIMFILES = $HOME.'/.vim'
endif
" 设定doc文档目录
let helptags=$VIMFILES.'/doc'
" 设置字体 以及中文支持
if has("win32")
set guifont=Inconsolata:h12:cANSI
endif
" 配置多语言环境
if has("multi_byte")
" UTF-8 编码
set encoding=utf-8
set termencoding=utf-8
set formatoptions+=mM
set fencs=utf-8,gbk
if v:lang =~? '^\(zh\)\|\(ja\)\|\(ko\)'
set ambiwidth=double
endif
if has("win32")
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
language messages zh_CN.utf-8
endif
else
echoerr "Sorry, this version of (g)vim was not compiled with +multi_byte"
endif
" Buffers操作快捷方式!
nnoremap <C-RETURN> :bnext<CR>
nnoremap <C-S-RETURN> :bprevious<CR>
" Tab操作快捷方式!
nnoremap <C-TAB> :tabnext<CR>
nnoremap <C-S-TAB> :tabprev<CR>
"关于tab的快捷键
" map tn :tabnext<cr>
" map tp :tabprevious<cr>
" map td :tabnew .<cr>
" map te :tabedit
" map tc :tabclose<cr>
"窗口分割时,进行切换的按键热键需要连接两次,比如从下方窗口移动
"光标到上方窗口,需要<c-w><c-w>k,非常麻烦,现在重映射为<c-k>,切换的
"时候会变得非常方便.
nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l
" 让 Tohtml 产生有 CSS 语法的 html
" syntax/2html.vim,可以用:runtime! syntax/2html.vim
let html_use_css=1
" Python 文件的一般设置,比如不要 tab 等
autocmd FileType python set tabstop=4 shiftwidth=4 expandtab
autocmd FileType python map <F12> :!python %<CR>
" 选中状态下 Ctrl+c 复制
vmap <C-c> "+y
" 打开javascript折叠
let b:javascript_fold=1
" 打开javascript对dom、html和css的支持
let javascript_enable_domhtmlcss=1
" 设置字典 ~/.vim/dict/文件的路径
autocmd filetype javascript set dictionary=$VIMFILES/dict/javascript.dict
autocmd filetype css set dictionary=$VIMFILES/dict/css.dict
autocmd filetype php set dictionary=$VIMFILES/dict/php.dict
"-----------------------------------------------------------------
" plugin - bufexplorer.vim Buffers切换
" \be 全屏方式查看全部打开的文件列表
" \bv 左右方式查看 \bs 上下方式查看
"-----------------------------------------------------------------
"-----------------------------------------------------------------
" plugin - taglist.vim 查看函数列表,需要ctags程序
" F4 打开隐藏taglist窗口
"-----------------------------------------------------------------
if MySys() == "windows" " 设定windows系统中ctags程序的位置
let Tlist_Ctags_Cmd = '"'.$VIMRUNTIME.'/ctags.exe"'
elseif MySys() == "linux" " 设定windows系统中ctags程序的位置
let Tlist_Ctags_Cmd = '/usr/bin/ctags'
endif
nnoremap <silent><F4> :TlistToggle<CR>
let Tlist_Show_One_File = 1 " 不同时显示多个文件的tag,只显示当前文件的
let Tlist_Exit_OnlyWindow = 1 " 如果taglist窗口是最后一个窗口,则退出vim
let Tlist_Use_Right_Window = 1 " 在右侧窗口中显示taglist窗口
let Tlist_File_Fold_Auto_Close=1 " 自动折叠当前非编辑文件的方法列表
let Tlist_Auto_Open = 0
let Tlist_Auto_Update = 1
let Tlist_Hightlight_Tag_On_BufEnter = 1
let Tlist_Enable_Fold_Column = 0
let Tlist_Process_File_Always = 1
let Tlist_Display_Prototype = 0
let Tlist_Compact_Format = 1
"-----------------------------------------------------------------
" plugin - mark.vim 给各种tags标记不同的颜色,便于观看调式的插件。
" \m mark or unmark the word under (or before) the cursor
" \r manually input a regular expression. 用于搜索.
" \n clear this mark (i.e. the mark under the cursor), or clear all highlighted marks .
" \* 当前MarkWord的下一个 \# 当前MarkWord的上一个
" \/ 所有MarkWords的下一个 \? 所有MarkWords的上一个
"-----------------------------------------------------------------
"-----------------------------------------------------------------
" plugin - NERD_tree.vim 以树状方式浏览系统中的文件和目录
" :ERDtree 打开NERD_tree :NERDtreeClose 关闭NERD_tree
" o 打开关闭文件或者目录 t 在标签页中打开
" T 在后台标签页中打开 ! 执行此文件
" p 到上层目录 P 到根目录
" K 到第一个节点 J 到最后一个节点
" u 打开上层目录 m 显示文件系统菜单(添加、删除、移动操作)
" r 递归刷新当前目录 R 递归刷新当前根目录
"-----------------------------------------------------------------
" F3 NERDTree 切换
map <F3> :NERDTreeToggle<CR>
imap <F3> <ESC>:NERDTreeToggle<CR>
"-----------------------------------------------------------------
" plugin - NERD_commenter.vim 注释代码用的,
" [count],cc 光标以下count行逐行添加注释(7,cc)
" [count],cu 光标以下count行逐行取消注释(7,cu)
" [count],cm 光标以下count行尝试添加块注释(7,cm)
" ,cA 在行尾插入 /* */,并且进入插入模式。 这个命令方便写注释。
" 注:count参数可选,无则默认为选中行或当前行
"-----------------------------------------------------------------
let NERDSpaceDelims=1 " 让注释符与语句之间留一个空格
let NERDCompactSexyComs=1 " 多行注释时样子更好看
"-----------------------------------------------------------------
" plugin - DoxygenToolkit.vim 由注释生成文档,并且能够快速生成函数标准注释
"-----------------------------------------------------------------
let g:DoxygenToolkit_authorName="Asins - asinsimple AT gmail DOT com"
let g:DoxygenToolkit_briefTag_funcName="yes"
map <leader>da :DoxAuthor<CR>
map <leader>df :Dox<CR>
map <leader>db :DoxBlock<CR>
map <leader>dc a /* */<LEFT><LEFT><LEFT>
"-----------------------------------------------------------------
" plugin – ZenCoding.vim 很酷的插件,HTML代码生成
" 插件最新版:http://github.com/mattn/zencoding-vim
" 常用命令可看:http://nootn.com/blog/Tool/23/
"-----------------------------------------------------------------
"-----------------------------------------------------------------
" plugin – checksyntax.vim JavaScript常见语法错误检查
" 默认快捷方式为 F5
"-----------------------------------------------------------------
let g:checksyntax_auto = 0 " 不自动检查
"-----------------------------------------------------------------
" plugin - NeoComplCache.vim 自动补全插件
"-----------------------------------------------------------------
let g:AutoComplPop_NotEnableAtStartup = 1
let g:NeoComplCache_EnableAtStartup = 1
let g:NeoComplCache_SmartCase = 1
let g:NeoComplCache_TagsAutoUpdate = 1
let g:NeoComplCache_EnableInfo = 1
let g:NeoComplCache_EnableCamelCaseCompletion = 1
let g:NeoComplCache_MinSyntaxLength = 3
let g:NeoComplCache_EnableSkipCompletion = 1
let g:NeoComplCache_SkipInputTime = '0.5'
let g:NeoComplCache_SnippetsDir = $VIMFILES.'/snippets'
" <TAB> completion.
inoremap <expr><TAB> pumvisible() ? "\<C-n>" : "\<TAB>"
" snippets expand key
imap <silent> <C-e> <Plug>(neocomplcache_snippets_expand)
smap <silent> <C-e> <Plug>(neocomplcache_snippets_expand)
"-----------------------------------------------------------------
" plugin - matchit.vim 对%命令进行扩展使得能在嵌套标签和语句之间跳转
" % 正向匹配 g% 反向匹配
" [% 定位块首 ]% 定位块尾
"-----------------------------------------------------------------
"-----------------------------------------------------------------
" plugin - vcscommand.vim 对%命令进行扩展使得能在嵌套标签和语句之间跳转
" SVN/git管理工具
"-----------------------------------------------------------------
"-----------------------------------------------------------------
" plugin – a.vim
"-----------------------------------------------------------------
:set autowrite
" NERDTree
map <F10> :NERDTreeToggle<CR>
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Plugin configuration
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" taglist
let Tlist_Auto_Highlight_Tag = 1
let Tlist_Auto_Open = 1
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 = 0
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 = 0
let Tlist_Show_One_File = 0
let Tlist_Sort_Type = "order"
let Tlist_Use_Horiz_Window = 0
let Tlist_Use_Right_Window = 1
let Tlist_WinWidth = 40
let tlist_php_settings = 'php;c:class;i:interfaces;d:constant;f:function'
source $VIMRUNTIME/vimrc_example.vim
source $VIMRUNTIME/mswin.vim
behave mswin
set diffexpr=MyDiff()
function MyDiff()
let opt = '-a --binary '
if &diffopt =~ 'icase' | let opt = opt . '-i ' | endif
if &diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif
let arg1 = v:fname_in
if arg1 =~ ' ' | let arg1 = '"' . arg1 . '"' | endif
let arg2 = v:fname_new
if arg2 =~ ' ' | let arg2 = '"' . arg2 . '"' | endif
let arg3 = v:fname_out
if arg3 =~ ' ' | let arg3 = '"' . arg3 . '"' | endif
let eq = ''
if $VIMRUNTIME =~ ' '
if &sh =~ '\<cmd'
let cmd = '""' . $VIMRUNTIME . '\diff"'
let eq = '"'
else
let cmd = substitute($VIMRUNTIME, ' ', '" ', '') . '\diff"'
endif
else
let cmd = $VIMRUNTIME . '\diff'
endif
silent execute '!' . cmd . ' ' . opt . arg1 . ' ' . arg2 . ' > ' . arg3 . eq
endfunction
set runtimepath+=D:\php-manual /*这是我自己的目录,大家配的话要修改的*/
autocmd BufNewFile,Bufread *.module,*.inc,*.php set keywordprg="help"
"搜索函数定义的位置
map <C-g> :cs find g <C-R>=expand("<cword>")<CR>
里面有很多插件的代码配置,因为太多了,需要的话自己取舍一下。
第二步:装插件,这里我引用几个我学习的网站。
http://apps.hi.baidu.com/share/detail/7867082 这里面是配置IDE的第一步,到这一步为止,vim就像这样的了
做开发光有界面还不行,我们还需要代码自动补全:http://wiki.geckos.cn/index.php/Vim%E4%B8%AD%E7%9A%84%E4%BB%A3%E7%A0%81%E8%A1%A5%E5%85%A8
第三步:把php manaul融入vim中,这样的好处就很方便的打开php帮助文档的了
http://www.laruence.com/2010/08/18/1718.html
ps:这里注意一点的就是manaul保存的目录,目录名之间不能有空格的
到目前为止,我需要的东西基本就配的差不多,觉得已经够我用的,接下来就是能熟练使用。
2、http://www.cfanz.cn/index.php?c=article&a=read&id=81066
在终端上,界面非常之简洁,如果你需要更加复杂的界面以及使用Vim更多的特性,需要下载客户端安装。在Mac上目前存在两个版本的Vim客户端:
1、MacVim。使用Cocoa GUI,这是Mac上更新还很活跃的版本,也是Mac上最多人使用的版本。下载地址:http://code.google.com/p/macvim/
2、使用Carbon GUI的版本,但是这个版本目前基本上不再更新。下载地址:http://sourceforge.net/projects/macosxvim/files/
本文主要介绍MacVim,MacVim支持多窗口标签编辑以及全屏等新特性。下载了相应MacVim压缩包,解压以后将MacVim.app拖入/Applications目录下。启动MacVim,输入":h mvim", 按照提示,需要将mvim脚本文件拷贝到"/usr/local/bin"目录下。打开终端,输入命令 "cd /usr/local"以及"sudo mkdir bin",最后输入"sudo cp -f /Users/ericli/SoftWare/MacVim-snapshot-66/mvim /usr/local/bin/",这样就可以在终端输入命令"mvim"来快速启动MacVim 。如果你不想将MacVim.app放到/Applications目录下,只需要在终端设置VIM_APP_DIR变量为你想放置MacVim.app的目录并导入到$HOME/.bash_profile中即可,比如:export VIM_APP_DIR=$HOME/SoftWare/MacVim-snapshot-66/。在MacVim输入":h macvim",可以查看MacVim的使用帮助介绍文档。
现在MacVime的界面还是很简陋,下面开始介绍如何简单配置MacVim:
1、创建~/.bashrc文件
在终端键入"cd $HOME" 和“touch .bashrc”,即创建成功。打开文件,输入“alias vim=mvim”,并保存别名变量。然后再在终端键入“source .bashrc”使.bashrc文件生效。这样,在终端输入vim和mvim都可以启动MacVim.app了。
在这里稍微解释下几个文件的作用,/etc/bashrc、/etc/profile是系统全局环境变量设置,给所有用户使用,~/.bashrc、~/.bash_profile、~/.bash_login、~/.profile是用户目录下的私有变量设置。当进入系统运行一个bash shell进程时,读取环境设定过程如下:1、读取全局环境变量设置/etc/profile,然后根据其内容读取/etc/profile.d、/etc/bashrc等设定,但是注意/etc/profile只在第一次运行bash shell时读取一次,而/etc/bashrc在每次运行bash shell都读取;2、然后读取当前用户目录下的~/.bash_profile、~/.bash_login或~/.profile三个中的其中一个文件的局部变量设置,而且只在第一次运行bash shell时读取,只有读取~/.bash_profile失败才会读取~/.bash_login,如果前边两文件读取失败才会读取~/.profile;3、最后根据~/.bash_profile的内容读取当前用户目录下的~/.bashrc文件中的局部环境变量设置,~/.bashrc文件在每次打开新的bash shell都读取一次。总结一下,/etc/bashrc、/etc/profile、~/.bashrc、~/.bash_profile、~/.bash_login、~/.profile都能设置环境变量,而/etc/profile、~/.bash_profile、~/.bash_login、~/.profile可以设定路径、环境变量等,只能登入的时候执行一次;/etc/bashrc、~/.bashrc保存路径、命令别名等,每次打开新的bash shell都会执行一次,通常前者/etc/profile、~/.bash_profile调用后者/etc/bashrc、~/.bashrc。更详细的资料可以参考该链接:http://blog.chinaunix.net/uid-24591881-id-2124780.html 。
2.配置~/.vimrc和~/.gvimrc
首先,在MacVim编辑器中输入“:version”,看到如下图示信息:
从上图可以看出一些MacVim的配置信息:
$VIM系统变量的路径为:"/Applications/MacVim.app/Contents/Resources/vim"
MacVim的系统配置文件vimrc的路径:“$VIM/vimrc”
用户配置文件vimrc的路径:"$HOME/.vimrc"
MacVim编辑器的用户初始化配置文件的路径:"$HOME/.exrc" (默认不存在,如果需要使用则在终端输入 “touch $HOME/.vimrc”创建)
MacVim的系统配置文件gvimrc的路径:"$VIM/gvimrc"
用户配置文件gvimrc的路径:"$HOME/.gvimrc"
MacVim的菜单文件的路径:"$VIMRUNTIME/menu.vim"
另外解释下, $HOME为当前用户目录的路径,$VIMRUNTIME路径为"/Applications/MacVim.app/Contents/Resources/vim" . 可以在MacVim中输入”:echo $VIMRUNTIME“来查看这些系统变量的路径。
其次,从系统文件vimrc_example.vim和gvimrc_example.vim中copy标准的内容,保存到用户的配置文件~/.vimrc和~/.gvimrc中。在MacVim中输入如下命令:
:e $VIMRUNTIME/vimrc_example.vim :saveas ~/.vimrc :e $VIMRUNTIME/gvimrc_example.vim :saveas ~/.gvimrc
3、添加插件
通常有如下两种方式添加插件:
其一:拷贝该 plugin_name.vim插件到你个人插件目录~/.vim/plugin/下,拷贝plugin_help.txt到你个人文档目录~/.vim/doc/下,若存在该插件syntax的vim支持文件则放到~/.vim/syntax/目录下,如果以上目录不存在到终端输入如下命令创建:
</pre><pre name="code" class="html" style="margin-top: 0px; margin-bottom: 0px; padding: 0px; white-space: pre-line; word-break: break-all; color: rgb(54, 54, 54); font-size: 14px; line-height: 24px; background-color: rgb(255, 255, 255);">
cd $HOME mkdir .vim mkdir .vim/plugin mkdir .vim/doc mkdir .vim/syntax
比如,拷贝matchit.txt到~/.vim/doc/下,拷贝matchit.vim到目录~/.vim/plugin/下,
其二,在你的vimrc配置文件最后加一行命令:
source $VIMRUNTIME/macros/matchit.vim0
最后,还有一种不常用的方式可以安装插件,将插件、文档、syntax支持文件分别放到$VIMRUNTIME/plugin/ 、$VIMRUNTIME/doc/、$VIMRUNTIME/syntax/三个目录下,或者/usr/share/vim/vim73/plugin/、/usr/share/vim/vim73/doc/、/usr/share/vim/vim73/syntax三个目录下都可以使MacVim自动加载插件。
以上安装插件的方法都比较麻烦,并且每个插件的文件分散到几个文件夹去,不方便管理。在这里给各位推荐一个很方便管理插件的Vim插件vundle:https://github.com/gmarik/vundle。vundle可以使得安装的插件的文件都放到同一个目录下,并且简单设置就可使用。安装方法如下:
首先,在终端输入如下命令:
git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle
然后,在~/.vimrc里写入以下配置:
set nocompatible " be iMproved filetype off " required! set rtp+=~/.vim/bundle/vundle/ call vundle#rc() " let Vundle manage Vundle " required! "这是vundle本身的设置 Bundle 'gmarik/vundle' " My Bundles here: "这里是设置你自己自定义的插件的设置vundle设置,注意:下载的插件git为:https://github.com/godlygeek/tabular.git,则设置为Bundle 'godlygeek/tabular';https://github.com/gmarik/vundle.git设置则为 Bundle 'gmarik/vundle' " original repos on github Bundle 'godlygeek/tabular' " vim-scripts repos,vim-scripts的访问地址,格式则如下: Bundle 'L9' Bundle 'FuzzyFinder' " non github repos ,非git的访问地址的,格式如下: Bundle 'git://git.wincent.com/command-t.git' " ... filetype plugin indent on " required! " " Brief help " :BundleList - list configured bundles " :BundleInstall(!) - install(update) bundles " :BundleSearch(!) foo - search(or refresh cache first) for foo " :BundleClean(!) - confirm(or auto-approve) removal of unused bundles " " see :h vundle for more details or wiki for FAQ " NOTE: comments after Bundle command are not allowed..
最后,登陆MacVim,运行
:BundleInstall命令。
这样,Vundle.vim管理插件就安装成功。接下来继续简单介绍下,Vundle插件的使用:
搜索新的插件:
:BundleSearch matchit
安装新的插件:
:BundleInstall matchit.zip
最后在~/.vimrc中的注释" vim-scripts repos下,加入如下命令并保存.vimrc文件,这样一个插件就安装成功了:
Bundle 'matchit.zip'
更新所有安装的插件(这个命令会根据~/.vimrc的Bundle 设置来更新插件):
:BundleInstall
列出所有安装的插件列表:
:BundleList
清除插件命名(这个命令我测试有些插件删除不了,手动删除~/.vim/bundle的相关插件的目录,并将~/.vimrc中的相关配置去掉即可):
:BundleClean
上述中的Tabular插件是用于编码中的字符对齐的,关于其具体用法见链接:https://github.com/godlygeek/tabular.用法是选定一段文本,然后输入相应的命令来根据相应的字符对齐。几个常用的命令如下:
:Tab /= :Tab /: :Tab /:\zs :Tab /|
分别是选定文本按=、:、:\zs、|等符号对齐。
推荐一些插件:
NERD_tree : 一个文件管理插件,一些常用命令: 打开一个目录树( :NERDTree <启动目录> | <bookmark> ) 关闭目录树栏(:NERDTreeClose);切换目录树栏(:NERDTreeToggle); 定义标签(:Bookmark <name>);定义Root标签(:BookmarkToRoot <bookmark>)。。。。。。更多命令和用法见 :help NERD_tree。
word_complete :代码自动补全
SuperTab :省去Ctrl-n或Ctrl-p快捷键,通过按tab键快速显示补全代码.
xptemplate : 快速自动完成一些if、switch、for、while结构模板代码,支持c、c++、Lua、Ruby、Php、html、css、javascript等多种语言。一般是输入结构体的关键字后,再按Ctrl-\组合键即可完成代码补全,然后按Tab键跳转到不同的位置替换模板内容。比如:输入for后按Ctrl-\组合键即可快速完成for结构的模板代码。
ctags : 一个扫描记录代码的语法元素,并记录为tag,方便代码定位跳转等操作,MacVim自带,但是据说有点问题,笔者用Vundle安装的貌似也有问题,推荐用MacPorts安装,然后在~/.gvimrc配置中加入: let Tlist_Ctags_Cmd="/opt/local/bin/ctags"。用法:在终端 cd 进入到你的项目根目录,输入语句即可将项目所有代码文件打上tag:
ctags -R --c++-kinds=+px --fields=+iaS --extra=+q .
taglist: 可以用Vundle安装,在编辑代码文件时,输入命令":TlistToggle"在右边就会出现当前类的函数或变量列表。输入命令“:tag <函数名或变量、类>”,如果只有一个文件定义了该函数或变量、类,vim打开该文件并将光标定位到对应的位置;如果多个文件有这个函数名或变量、类的tag,将给提示,并可输入“:tselect” ,显示可选的文件。快捷键跳转Ctrl+],Ctrl-o。
Cscope: 功能跟ctags差不多,不过更加强大,MacVim默认已经支持,输入“:version”命令查看.
OmniCppComplete:功能跟taglist差不多。
a.vim: 在.cpp文件和.h头文件间快速切换的插件。
grep.vim: 在工程中查找词汇的插件。
minibufexplorerpp:操作缓存buffer窗口。
quickfix:MacVim内置安装好了,不需要重新安装。显示一些命令查询结果以及编译错误等信息。
Command-t:用Commad-t命令快速查找切换文件。如果是用Vundle安装的话,还不能使用,在MacVim中输入“:CommandT”命令会报错。用Vundle安装好打开终端,输入如下命令,等待编译完毕后就可以使用了:
cd ~/.vim/bundle/Command-T/ruby/command-t ruby extconf.rb make
NERD_commenter.vim: 注释插件。
DoxygenToolkit.vim: 用于快速生成注释,并由注释生成文档。
winmanager: 可以用Vundle安装,管理窗口的插件,可以跟NERD_tree、Taglist插件结合,打造一个类似IDE的界面。只需要在NERD_tree.vim中加入如下代码:
let g:NERDTree_title = "NERDTree" function! NERDTree_Start() exec 'NERDTree' endfunction function! NERDTree_IsValid() return 1 endfunction
并且在winmanager.vim的找到下面代码,增加一句代码:
" toggle showing the explorer plugins. function! <SID>ToggleWindowsManager() if IsWinManagerVisible() call s:CloseWindowsManager() else call s:StartWindowsManager() <span style="background-color: rgb(255, 102, 102);">"NERDTree 打开的时候有一个空白窗口,需要关闭 exec 'q'</span> end endfunction
最后在~/.gvimrc中加入如下配置:
"在vim左侧显示窗口Taglist和文件列表窗口 "let g:winManagerWindowLayout='FileExplorer,BufExplorer|TagList' let g:winManagerWindowLayout='NERDTree, BufExplorer|TagList' "打开vim时自动打开winmanager let g:AutoOpenWinManager = 1 "定义打开关闭winmanager的快捷键为 wt组合键命令 nmap wt :WMToggle<cr>
重启,即可看到一个类似IDE的Vim界面。
4、Vim的模式与一些常用命令
i、Vim的模式
Vim有三种模式,Normal 、Insert 、 Visual。在Normal模式下,可以输入运行命令;在Insert模式下,可以输入编辑文本;在Visual模式下,可以对选定的文本运行命令操作并该命令仅仅作用于选定文本。启动Vim的默认模式是Normal模式,输入 i、I、a、A、o、O、s、S、r、R可以进入Insert模式,其中区别在于:
命令 | 区别 |
---|---|
i | 在光标之前插入字符 |
I | 在光标所在行的所有字符开头之前插入字符 |
a | 在光标之后插入字符 |
A | 在光标所在行的所有字符之后插入字符 |
o | 在当前光标的下面打开新的一行 |
O | 在当前光标的上面打开新的一行 |
s | 删除当前光标下的字符 |
S | 删除当前光标所在行的所有字符 |
r | 用新输入的字符替换当前光标所在字符,然后立即返回Normal模式 |
R | 在当前光标位置所在字符开始往后一直用新输入的字符替换所有原有字符 |
在Nomal模式中输入v进入Visual模式。 在Insert模式或Visual模式中按Esc键即返回Normal模式。
ii、VIm的常用命令(不做特殊注释的话,下面的命令一般在Normal模式生效,一般对文本操作的命令在Visual模式下也同样生效)
(1)、光标的移动:
h(左)、j(下)、k(上)、l(右)移动光标。还可以在命令之前输入数字,指定要移动多少行。比如:7h表示左移7个光标,6j表示光标下移6行。
光标向前跳多个词到达词首,比如5个词,输入5w;光标向后跳7个词到达词首,输入7b。跳到3个单词后的词末,输入3e;跳到3个单词前的词末,输入3ge。
移动到行首第一个非空字符,输入"^"或按Home键;移动到光标所在行的第一个字符(包括空格);移动到行尾,输入"$"或按End键。注意,这个只有"$"或按End键之前加数字会生效。
向前移动到某个指定的字符,比如向前找第三个“h”,输入”3fh“;向前把光标移动到第四个"b"字符的前一个字符上,输入”4tb“。向后移动到某个指定的字符,比如向后查找第三个”h“,输入”3Fh“;向后把光标移动到第四个”b“的后一个字符上,输入”4Tb“。这四个命令都可以使用”;“命令重复,","命令反向重复。光标不会移出当前行。
"%"命令可以将当前光标所在的括弧移动到匹配的括弧的位置,比如:从”)“移动到”(“,反之亦然。
gd命令到达光标所在处函数或变量定义之处。
”*“和”#“命令匹配当前光标所在单词, ”*“移动光标的下一个匹配单词,而”#“命令是移动光标到上一个匹配单词。
移动到指定行,比如想移动到第30行,输入30G或输入30gg。没有数字限制的话,G命令将光标移动到文件的尾部,gg命令移动光标到文件开始。
移动都某部分,比如到文件大约10%的行位置,输入”10%“。
H命令移动光标到视野内的第一行,M移动到视野内的中部,L移动光标到视野内的最后一行。
确定光标的位置,输入Ctrl-G命令。
Ctrl-u命令光标向上移动半屏,Ctrl-d光标向下移动半屏。
Ctrl-e上滚一行,Ctrl-y下滚一行。
Ctrl-f光标向前移动一整屏,Ctrl-b光标向后移动一整屏。
”zt“命令将光标所在行移动到屏幕的顶部,”zz“命令将光标所在行移动到屏幕的中部,”zb“将光标移动到屏幕的底部。
(2)、删除字符:
删除某个字符,移动光标到所在字符,然后输入x或dl(光标下的字符)、X或dh(光标签的字符);删除多个字符,可以在x之前加数字;
删除从当前光标到所在行上指定的某个字符之间的所有字符(包括该指定字符)
删除某行,移动光标到所在行,然后输入dd;
删除换行符将两行连起来,光标移动到要合并的两行的第一行,然后输入J。
利用命令组合模式,操作符-动作。d命令后跟一个光标移动动作,将删除从当前位置到光标移动到的目标位置的全部内容。例如:删除从当前光标向前的5个单词,命令为d5w;删除从当前光标位置到行尾的字符,命令为d$。
db表示从当前位置删除到前一个单词的开头。diw表示删除光标上的单词(不包括空格)。daw表示删除光标上的单词(包括空格)。
从当前光标位置上的字符一直删除到指定的字符(包括指定字符),用df命令,比如,删除到r,命令为dfr。从当前光标位置删除到指定字符的前一个字符,用dt命令,比如:dtr。
dG 表示从当前光标位置一直删除到文件的末尾。dgg表示从当前光标位置一直删除到文件的开始。
(3)、修改字符:
修改字符的操作命令是c。作用是删除字符后自动切换到Insert模式,比删除操作命令多了一个切换到Insert模式的功能。
修改光标下的 字符,cl.
修改光标前的字符,ch.
修改当前光标后的3个词,组合命令是c3w。
修改当前光标之前的单词,cb.
修改光标上的单词,不包括空格,ciw。
修改光标上的单词,包括空格,caw。
修改到指定字符(包括指定字符),比如修改到e,命令为cfe。
修改到指定字符之前一个字符,比如,修改到e之前的字符,cte.
修改光标所在行一整行,cc。
从当前光标位置修改到行尾,c$。
cG,修改到文件的末尾。
cgg,修改到文件的开头。
(4)、替换字符
r命令是进入Insert模式的命令之一,进入Insert模式等待你输入一个字符替换当前光标上的字符后自动返回Normal模式。
在r命令之前加入数字前缀,可以用一个字符替换当前光标后的多个字符。比如:3rp。但是例外的是,如果替换的字符是回车键,则只会用一个换行符替换多个字符。
使用R命令启动Replace模式, 这个模式下在当前光标位置所在字符开始往后一直可以持续用新输入的字符替换所有原有字符,直到你退出Replace模式。在这个模式下,使用退格键Backspace,原来被替换的字符会恢复。
(5)、查询字符:
从当前光标位置向前查找当前行上的某个指定字符的第一个字符,命令是f。比如: 查找w,fw。F也和f命令一样,但是查找方向相反。
从当前光标位置向前查找当前行上的某个指定字符的前一个字符,命令是t。比如: 查找o之前的字符,to。T也和t命令一样,但是查找方向相反。
向前查找字符单词命令, ”/“后加上想查找的字符单词。比如:”/a“ 就是查找字符”a“。想要向前查找当前光标后第三个匹配的a,还需要输入”3n“命令。向后第三个则输入”3N“。
向后查找字符,”?“后加上想查找的字符。想要向前查找光标后第三个匹配的字符,还需输入”3N“。向后第三个则输入”3n“。
查找字符通常区分大小写的,如果不想区分大小写,可在~/.vimrc文件中加入命令"set ignorecase"命令。
还可以将光标移动要查找的单词上,然后输入”*“命令,这样将取得当前光标上的单词并向前查找该单词。想要向前查找光标后第2个单词,可以输入"2*"。
向后查找当前光标上的单词,则可以输入”#“。想要向后查找当前光标的第2个单词,可以输入”2#“。
输入”/di“,也可能查找到单词”media“。如果想限定di只匹配单词开头,可以输入”/<di“。如果只想查找以di结尾的单词,则可以输入”/di>“。如果只想查找完整的单词"di",输入”/<di>“。注意,”*“和”#“命令也是匹配整个单词查找的,如果想要部分匹配,输入”g*“和”g#“。
"/^di",只匹配行首。"/di$"只匹配行未。”/^di$“仅仅匹配包括”di“的行并不带空格。
”/d.i“只匹配第一个字符是”d“,第二个字符是任意字符,第三个字符是”i“的字符串。
”/di/.“匹配带特殊字符”.“的字符串”di.“。
(6)、复制字符
使用d、x或其它命令删除文本的时候,这些被删除的文字将会被Vim缓存起来。可以使用p命令将该被删除的文本在当前光标的前面(比如前一行)重新粘贴出来。
使用y(yank:抽出)操作符命令可直接把文字拷贝到寄存器中,然后用p命令粘贴到其他地方。比如:拷贝4个单词,4yw(包括了单词后面的空格,用ye则不包括单词后的空格)。
yl拷贝当前光标下的字符,yh拷贝当前光标之前的字符。
yw拷贝当前光标到下一个单词的开头,yb拷贝当前光标到上一个单词的开头。yiw,拷贝光标上的单词(不包括空格)。yaw,拷贝光标上的单词(包括空格)。
y$拷贝到行尾。
yy命令拷贝一整行,快捷方式为Y。
yG,拷贝到文件的末尾。
ygg,拷贝到文件的开头。
(7)、文本对象
当处于某个单词或句子的中间,而又想删除整个单词或句子时,可以使用文本对象。比如:diw可以删除一整个单词(iw表示Inner word,不包括单词后的空格),如果想要包含单词后的空格也删除,可用命令daw。同样地,cis表示修改一整个句子(is表示Inner Sentence,不包括句子后的空格),如果想要包含句子后的空格也修改,则用命令cas。
同样地,在Visual模式下,也可以用文本对象命令来选中更多的文本。比如使用aw选中当前的整个单词,再次使用则选中多一个单词。
文本对象的表达式:<操作命令>a<文本对象>或<操作命令>i<文本对象>,操作命令可以是任何命令,如d,y,c;文本对象可以是一个单词w,一个句子s,一个段落p,也可以是一个特殊的字符:"、'、)、}、]。
使用 :help text-objects 可以在帮助里查看更多的文本对象的更多命令内容。
使用:help operator 可以在帮助里查看更多的操作符命令内容。
(8)、撤销与重做:
撤销上一个编辑操作,输入u;撤销所有在前一个编辑行上的操作,输入U;重做,输入Ctrl+r。
"."命令表示重复最后一次除u命令、Ctrl-r命令和冒号命令之外的任何操作命令。
(9)、查找命令
输入"/"、”?“、”:"后,按方向键上箭头或下箭头,可以查找同样的历史命令记录。
(10)、命令次数:
可以在很多命令之前加上数字,表示执行该命令的次数。
在组合命令的中,数字可以放在不同的地方。比如:修改5个单词,5cw和c5w都一样;删除10个单词,可以写成10cw、c10w,或者2c5w、5c2w。其中的差别在于数字修饰的命令不一样,但是作用是一样的。
(11)、退出:
保存文件并退出,输入ZZ或":wq"或“:x”;放弃修改并退出,输入“:q!”;强制退出所有打开的文件,输入“:qa!”
(12)、放弃执行命令:
Esc按键可以终止大部分命令。
(13)、帮助:
输入“:help”进入帮助窗口;输入ZZ,退出帮助窗口。
要获得具体的帮助,比如关于u命令的帮助,输入类似“:help u”。
默认显示Normal模式的帮助,要显示其他模式的命令,可以使用“i_”前缀。
获取命令参数的帮助,比如:“:help -e”.
使用“:helptags ~/.vim/doc” 命令产生插件的本地tags文件,从而可以在帮助中查询插件的文档。
(14)、标签跳转:
被 [ ]包起来的文字是一个标签链接,光标移动到 [ ]之间,按Ctrl+]组合键跳转到标签链接的地方。Ctrl+t或 Ctrl + O跳回前一个标签。
使用G命令或者”n“命令或者查找”/“命令跳到其他行后,Vim会记录下你跳过来的地方,使用两个单引号('')即可跳回原来的地方;或者使用Ctrl-o命令跳到较旧的地方;Ctrl-i命令或Tab键跳到较新的地方。输入":jumps"命令可以看到光标跳转的位置列表信息。
使用”m“命令标记当前光标的位置,位置的名称只能为a~z的单个字母(区分大小写)。比如:定义当前光标的位置为”E“,命令为"mE"。设置后可以通过单引号'+光标名称,或者上句号`+光标名称可以跳到指定的光标位置,区别是单引号 ’E命令跳转到标记光标位置所在行的首个非空字符(列的位置跟标记的时候不同),而上句号 `E跳转到标记的光标原来位置(包括行和列的位置都跟标记的时候一样)。输入”:marks“命令可以查看所有带名称的标记信息列表,其中有几个特殊的标记。比如:单引号 ' ,表示跳转前的位置。双引号 "表示Normal模式最后编辑的位置。中括号 [表示文件第一行的第一列。 中括号 ]表示文件最后一行的第一列。 ^ 表示Insert模式下最后修改的位置。 . 表示无论是Insert模式或Normal模式最后修改的位置的开头。
(15)、显示Vim相关的文件路径
:scriptnames命令可以查找~/.vimrc或~/.gvimrc或插件等文件的路径。
(16)、在vim中打开编辑文件命令:
:e! ~/.vimrc
保存文件:
:w
另存为:
:saveas pathFile
当同时打开多个文件,在多个文件间切换命令:
:bn //下一个文件 :bp //前一个文件
(17)、Visual模式
之前介绍过,在Normal模式下,输入v,进入Visual模式。这样,你对光标作任何移动操作,从当前光标位置到移动到的位置之间的文本都会高亮,此时输入操作命令,比如删除命令d,则高亮部分文本会被删除。
在Visual模式下光标的移动操作跟Normal模式差不多。注意,在Visual模式下,"o"命令表示返回到选中文字的另一端,这跟Normal模式不同。
(18)、快捷键与一些常用的命令:
一些经常使用的组合命令,存在等价的快捷单字符命令:
dl 的等价快捷键为 x,作用删除当前光标下的字符。
dh的等价快捷键为 X,作用删除光标左边的字符。
d$的等价快捷键为D,作用删除到行尾。
cl的等价快捷键为s,作用修改当前光标的字符。
cc的等价快捷键为S,作用修改一整行。
c$的等价快捷键为C, 作用修改到行尾。
yy的等价快捷键为Y,作用拷贝一整行。
一些常用的命令的如下:
c 修改操作命令
d 删除操作命令
y 复制到寄存器的操作命令
~ 修改选中的字符的大小写,原来大写的转换成小写,原来小写的转成大写。在Visual模式和Normal模式下都能生效。 注意,只有tiledeop设置后,这个才能成为一个操作命令,才可用该命令与其他光标移动的命令组合使用。
g~ 修改选中的字符的大小写操作命令,原来大写的转换成小写,原来小写的转成大写。
gu 修改选中的字符为小写操作命令。
gU 修改选中的字符为大写操作命令。
! 过滤警告操作命令
gq 选中文本格式化,文本拼接组合成句子或段落命令。在Normal模式和Visual模式下都能生效。
> 选中文本向右Tab缩进。在Normal模式和Visual模式下都能生效。
< 选中文本向左Tab缩进。在Normal模式和Visual模式下都能生效。
gd 到达光标所在处函数或变量定义之处。
块操作命令过程: 移动到想要进行操作的位置,比如行首或行尾;按组合键Ctrl-v,进入块操作模式;移动光标到任何地方,选定块操作的范围,比如:hjkl命令;最后输入I(在块的每一行首插入字符)或A(块的每一行尾部插入)进入Insert模式,然后输入想要插入的字符,按Esc键使块的每一行同样的位置生效。
自动补全功能:在Insert模式下,输入一个词的开头,然后按组合键Ctrl-n或Ctrl-p,就出现自动补全的提示。
宏录制:q + <宏> + 操作队列 + q ,@<宏> , @@。<宏> 可以是任意单个字母(区分大小写)或任意单个数字, q<宏> 进入recording模式,该模式下你的操作记录会保存到寄存器<宏> 中;然后输入@<宏>操作命令将重新执行被记录到寄存器<宏>中的命令;@@命令跟@<宏>的作用一样。
可视化选择:v,V,Ctrl-v. v,V都可以进入Visual模式,而Ctrl-v可以进入Visual Block模式(即块操作模式),在这两个模式下,都可以移动光标选定编辑文本。对选定文本执行c,y,d等操作,下面有几个常用的对选定文本的操作:
- J:把所有行连起来变成一行。
- >或<操作,文本向左右Tab缩进。
- =操作:选中文本自动缩进。
au FileType cpp setlocal dict+=~/.vim/dict/cpp_function_list.txt
(19)菜单快捷键
编辑菜单:
Undo 快捷键 command+z
Redo 快捷键 shift+command+z
Cut 快捷键 command+x (剪切的文本可以粘贴于其他程序或vim)
Copy 快捷键 command+c (复制的文本可以粘贴于其他程序或vim)
Paste 快捷键 command+v
Select All 快捷键 command+a
New window 快捷键 Command+n
New Tab 快捷键 Command+t
Open New File 快捷键爱你 Command+o
Save 快捷键 Command+s
Save as 快捷键 shifit+Command+s
Close window 快捷键 Shift+Command+w
Close 快捷键 Command+w
5、最后贴出本人的~/.vimrc和~/.gvimrc配置:
~/.vimrc配置如下:
" An example for a vimrc file.一般设置cli相关设置,即命令行相关设置,插件相关设置。原因加载顺序是先读取vimrc配置,然后读取plugin插件,然后加载GUI,最后再读取gvimrc配置文件。所以,GUI以及快捷键一般放到gvimrc里设置,有时候在vimrc设置跟界面显示相关的没作用,要在gvimrc里设置才有用。vimrc配置是vim,gvimrc配置文件是gvim,如果想要vim也有配色等,可以将界面相关的设置放在vimrc文件里重新设置一下。 "------------------------------------------------------------------------------- " 基本设置 "------------------------------------------------------------------------------- " When started as "evim", evim.vim will already have done these settings. if v:progname =~? "evim" finish endif "启用Vim的特性,而不是Vi的(必须放到配置的最前边) set nocompatible " 设置编码 set encoding=utf-8 set fenc=utf-8 set fileencodings=ucs-bom,utf-8,cp936,gb2312,gb18030,big5 "显示行号 set number "设置默认打开窗口大小 set lines=70 columns=100 "设置窗口透明度 set transparency=10 "设置背景色 "set bg=dark "用 koehler 调色板 colorscheme koehler "隐藏工具栏和滑动条 set guioptions=aAce "设置标签栏 "最多30个标签 set tabpagemax=30 "显示标签栏 set showtabline=2 "设定文件浏览器目录为当前目录 "set bsdir=buffer "set autochdir "保存100条命令历史记录 set history=100 "总是在窗口右下角显示光标的位置 set ruler "在Vim窗口右下角显示未完成的命令 set showcmd " 启用鼠标 if has('mouse') set mouse=a endif "设置语法高亮 if &t_Co > 2 || has("gui_running") syntax on endif "------------------------------------------------------------------------------- " 文本操作设置 "------------------------------------------------------------------------------- "设置字体 set gfn=Courier:h15 "设置自动缩进 "设置智能缩进 set tabstop=4 set shiftwidth=4 set softtabstop=4 set expandtab set smarttab "设置Tab键跟行尾符显示出来 set list lcs=tab:>-,trail:- "设置自动换行 set wrap "设置Insert模式和Normal模式下Left和Right箭头键左右移动可以超出当前行 set whichwrap=b,s,<,>,[,] "设置光标移动到屏幕之外时,自动向右滚动10个字符 set sidescroll=10 "设置使~命令成为操作符命令,从而使~命令可以跟光标移动命令组合使用 set tildeop "在Insert模式下,设置Backspace键如何删除光标前边的字符。这里三个值分别表示空白字符,分行符和插入模式之前的字符。 set backspace=indent,eol,start "定义键映射,不使用Q命令启动Ex模式,令Q命令完成gq命令的功能---即文本格式化。 map Q gq " CTRL-U 在Insert模式下可以删除当前光标所在行所在列之前的所有字符. Insert模式下,在Enter换行之后,可以立即使用CTRL-U命令删除换行符。 inoremap <C-U> <C-G>u<C-U> "使 "p" 命令在Visual模式下用拷贝的字符覆盖被选中的字符。 vnoremap p <Esc>:let current_reg = @"<CR>gvs<C-R>=current_reg<CR><Esc> "------------------------------------------------------------------------------- " 搜索设置 "------------------------------------------------------------------------------- "打开搜索高亮 set hlsearch "忽略大小写 set ignorecase "在查找时输入字符过程中就高亮显示匹配点。然后回车跳到该匹配点。 set incsearch "设置查找到文件尾部后折返开头或查找到开头后折返尾部。 set wrapscan "------------------------------------------------------------------------------- " 文件设置 "------------------------------------------------------------------------------- "设置当Vim覆盖一个文件的时候保持一个备份文件,但vms除外(vms会自动备份。备份文件的名称是在原来的文件名上加上 "~" 字符 if has("vms") set nobackup else set backup endif if has("autocmd") "启用文件类型检测并启用文件类型相关插件,不同类型的文件需要不同的插件支持,同时加载缩进设置文件, 用于自动根据语言特点自动缩进. filetype plugin indent on "将下面脚本命令放到自动命令分组里,这样可以很方便地删除这些命令. augroup vimrcEx au! "删除原来组的自动命令 "对于所有文件类型,设置textwidth为78个字符. autocmd FileType text setlocal textwidth=78 //vim启动后自动打开NerdTree autocmd vimenter * NERDTree autocmd vimenter * if !argc() | NERDTree | endif "设置关闭vim NerdTree窗口 autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTreeType") && b:NERDTreeType == "primary") | q | endif "当打开编辑文件时总是自动执行该脚本,跳转到最后一个有效的光标位置Mark标记。当一个事件正在处理时,不执行该脚本命令。 "行首的反斜杠用于把所有语句连接成一行,避免一行写得太长. autocmd BufReadPost * \ if line("'\"") > 1 && line("'\"") <= line("$") | \ exe "normal! g`\"" | \ endif augroup END else "Enter换行时总是使用与前一行的缩进等自动缩进。 set autoindent "设置智能缩进 set smartindent endif "编辑一个文件时,你所编辑的内容没保存的情况下,可以把现在的文件内容与编辑之前的文件内容进行对比,不同的内容将高亮显示 if !exists(":DiffOrig") command DiffOrig vert new | set bt=nofile | r ++edit # | 0d_ | diffthis \ | wincmd p | diffthis endif "------------------------------------------------------------------------------- " 插件设置 "------------------------------------------------------------------------------- "插件相关的设置 "matchit 的字符匹配自定义设置 let b:match_words = '\<if\>:\<endif\>,' \ . '\<while\>:\<continue\>:\<break\>:\<endwhile\>' "Vundle 的配置 filetype off " required! set rtp+=~/.vim/bundle/vundle/ call vundle#rc() " let Vundle manage Vundle " required! "管理Vim插件 Bundle 'gmarik/vundle' " My Bundles here: " original repos on github "文本按字符对齐 Bundle 'godlygeek/tabular' " vim-scripts repos "实现“begin”/“end”类似地匹配,~/.vimrc文件中添加自定义的设置:let b:match_words = '\<if\>:\<endif\>,' \ . '\<while\>:\<continue\>:\<break\>:\<endwhile\>' Bundle 'matchit.zip' Bundle 'moria' Bundle 'word_complete.vim' Bundle 'SuperTab' Bundle 'xptemplate' Bundle 'ctags.vim' Bundle 'taglist.vim' Bundle 'winmanager' Bundle 'Command-T' " non github repos "Bundle 'git://git.wincent.com/command-t.git' " ... Bundle 'https://github.com/scrooloose/nerdtree.git' filetype plugin indent on " required! " " Brief help " :BundleList - list configured bundles " :BundleInstall(!) - install(update) bundles " :BundleSearch(!) foo - search(or refresh cache first) for foo " :BundleClean(!) - confirm(or auto-approve) removal of unused bundles " " see :h vundle for more details or wiki for FAQ " NOTE: comments after Bundle command are not allowed..
" An example for a gvimrc file.一般设置GUI和快捷键等 "------------------------------------------------------------------------------- " gvimrc导入的默认设置 "------------------------------------------------------------------------------- " 设置窗口底部命令有两行 set ch=2 " 输入文本时隐藏鼠标 set mousehide "键位映射,使shift-insert快捷键像在 Xterm程序中一样工作 map <S-Insert> <MiddleMouse> "鼠标中键代表快捷粘贴 map! <S-Insert> <MiddleMouse> " Vim版本5.0或以上下面脚本工作. if version >= 500 "高亮C注释字符串 let c_comment_strings=1 "如果没启动语法高亮,启动语法高亮 if !exists("syntax_on") syntax on endif "启动搜索高亮. set hlsearch " 设置颜色 " 文本背景为浅灰色 " 文本的最后一行为深灰色 " 光标设置成绿色, C当 ":lmap"映射激活时变成青色 " 常量设置为没有底线,但常量的背景颜色浅一些 highlight Normal guibg=grey90 highlight Cursor guibg=Green guifg=NONE highlight lCursor guibg=Cyan guifg=NONE highlight NonText guibg=grey80 highlight Constant gui=NONE guibg=grey95 highlight Special gui=NONE guibg=grey95 endif "------------------------------------------------------------------------------- " 基本设置 "------------------------------------------------------------------------------- " When started as "evim", evim.vim will already have done these settings. " 设置编码 set encoding=utf-8 set fenc=utf-8 set fileencodings=ucs-bom,utf-8,cp936,gb2312,gb18030,big5 "显示行号 set number "设置默认打开窗口大小 set lines=70 columns=100 "设置窗口透明度 set transparency=10 "设置背景色 "set bg=dark "用 koehler 调色板 colorscheme koehler "隐藏工具栏和滑动条 set guioptions=aAce "开启自带的tab栏 set showtabline=2 "总是在窗口右下角显示光标的位置 set ruler "在Vim窗口右下角显示未完成的命令 set showcmd "设置语法高亮 if &t_Co > 2 || has("gui_running") syntax on endif "------------------------------------------------------------------------------- " 文本操作设置 "------------------------------------------------------------------------------- "设置字体 set gfn=Courier:h15 "设置自动缩进 set tabstop=4 set shiftwidth=4 set softtabstop=4 set noexpandtab "设置Tab键跟行尾符显示出来 set list lcs=tab:>-,trail:- "设置自动换行 set wrap "设置光标移动到屏幕之外时,自动向右滚动10个字符 set sidescroll=10 "------------------------------------------------------------------------------- " 搜索设置 "------------------------------------------------------------------------------- "打开搜索高亮 set hlsearch "忽略大小写 set ignorecase "在查找时输入字符过程中就高亮显示匹配点。然后回车跳到该匹配点。 set incsearch "设置查找到文件尾部后折返开头或查找到开头后折返尾部。 set wrapscan "------------------------------------------------------------------------------- " 文件设置 "------------------------------------------------------------------------------- "------------------------------------------------------------------------------- " 插件界面设置 "------------------------------------------------------------------------------- "ctags的设置,这里的ctags是用MacPorts安装的,用Vundle安装的'ctags.vim'有问题,系统自带的ctags也有点问题 let Tlist_Ctags_Cmd="/opt/local/bin/ctags" let Tlist_Exist_OnlyWindow=1 " 如果taglist窗口是最后一个窗口,则退出vim let Tlist_Auto_Update " Update the tag list automatically "在vim左侧显示窗口Taglist和文件列表窗口 "let g:winManagerWindowLayout='FileExplorer,BufExplorer|TagList' let g:winManagerWindowLayout='NERDTree, BufExplorer|TagList' "打开vim时自动打开winmanager let g:AutoOpenWinManager = 1 "定义打开关闭winmanager的快捷键 nmap wt :WMToggle<cr>
本文走马观花地带领大家快速浏览了MacVIm的一些基本功能,也相当于笔者的一个学习总结。实际上,上边谈到的每一个内容都可以独立写成一篇博客来介绍,对于Vim的更多具体用法还需要去进行更深入的学习。写这篇文章,笔者参考了很多资料,在这里罗列一些出来供读者参考。
参考资料:
vim基本命令
vim 命令(全)
手把手教你把Vim改装成一个IDE编程环境(图文)
把VIM打造成一个真正的IDE(3)
将Vim改造为强大的IDE—Vim集成Ctags/Taglist/Cscope/Winmanager/NERDTree/OmniCppComplete(有图有真相)
简明 Vim 练级攻略
一、首先确认电脑或服务器上已经安装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的程序世界
《手把手教你把Vim改装成一个IDE编程环境 Ver: 0.7》
http://blog.csdn.net/wooin/article/details/2844868
4、http://blog.163.com/shangshujie_1005/blog/static/186713514201171511835578/5、http://blog.sina.com.cn/s/blog_5a6efa330101cumx.html
6、http://www.7do.net/resources-10250-1-1.html