为了更好的使用VIM编写C/C++程序。想打造一个类似VS的IDE环境。
ctags:生成tag文件,这个是其他工具的基础。
taglist:需要先装ctags,高效地浏览源码, 其功能就像vc中的workpace, 那里面列出了当前文件中的所有宏,全局变量, 函数名等.
omnicppcomplete:需要先装ctags,类似于VS智能感知,需采用(Ctrl+X)+(Ctrl+O)组合键。autocomplpop:先要装omnicppcomplete,类似VS直接可以跳出相关函数,不需要组合键。
scope:cscope 比较强大,可以对函数以及部分类型定义进行跳转,但有些BUG,好像在某些条件下无法正确找到分析枚举的定义。
globe:貌似和cscope,taglist功能一样,据说对于大型的工程表现不错(目前未介绍)。
直接使用yum install ctags就可以了。我现在装的是ctags5.6版本。
配置:$HOME/.vimrc上增加
set tags=/home/yaqin/fbf/tags
set tags+=./tags,tags,../tags,../../tags使用:C/C++必须采用以下命令生成tags:
ctags -R --c++-kinds=+p --fields=+iaS --extra=+q
与scope结合起来用(C/C++):
ctags -n -f cppcomplete.tags --fields=+ai --C++-types=+p * -L cscope.files如下为使用tag的方法:1) 用命令行。在运行vim的时候加上"-t"参数,例如:
[/home/brimmer/src]$ vim -t foo_bar
这个命令将打开定义"foo_bar"(变量或函数或其它)的文件,并把光标定位到这一行。2) 在vim编辑器内用":ta"命令,例如:
:ta foo_bar
3) 最方便的方法是把光标移到变量名或函数名上,然后按下"Ctrl-]"。用"Ctrl-o"退回原
来的地方。
注意:运行vim的时候,必须在"tags"文件所在的目录下运行。否则,运行vim的时候还要
用":set tags="命令设定"tags"文件的路径,这样vim才能找到"tags"文件。在函数中移动光标
[{ 转到上一个位于第一列的"{"
}] 转到下一个位于第一列的"{"
{ 转到上一个空行
} 转到下一个空行 ([ and ] 也分别是两个指令)
gd 转到当前光标所指的局部变量的定义
* 转到当前光标所指的单词下一次出现的地方
# 转到当前光标所指的单词上一次出现的地方
taglist 的下载地址:
http://www.vim.org/scripts/script.php?script_id=273下载后,把该文件在~/.vim/目录中解压缩,这会在你的~/.vim/plugin和~/.vim/doc目录中各放入一个文件:
plugin/taglist.vim – taglist插件
doc/taglist.txt - taglist帮助文件
注:windows用户需要把这个插件解压在你的$VIM/vimfiles或$HOME/vimfiles目录。
使用下面的命令生成帮助标签(下面的操作在VIM中进行):
:helptags ~/.vim/doc
生成帮助标签后,你就可以用下面的命令查看taglist的帮助了:
:help taglist.txt
Taglist提供了相当多的功能,我的vimrc中这样配置:
""""""""""""""""""""""""""""""
" Tag list (ctags)
""""""""""""""""""""""""""""""
if MySys() == "windows" "设定windows系统中ctags程序的位置
let Tlist_Ctags_Cmd = 'ctags'
elseif MySys() == "linux" "设定windows系统中ctags程序的位置
let Tlist_Ctags_Cmd = '/usr/bin/ctags'
endif
let Tlist_Show_One_File = 1 "不同时显示多个文件的tag,只显示当前文件的
let Tlist_Exit_OnlyWindow = 1 "如果taglist窗口是最后一个窗口,则退出vim
let Tlist_Use_Right_Window = 1 "在右侧窗口中显示taglist窗口
这样配置后,当你输入“:TlistOpen”时,显示如下窗口:
在屏幕右侧出现的就是taglist窗口,你从中可以看到在main.c文件中定义的所有tag:宏、定义、变量、函数等;你也可以双击某个tag,跳到该tag定义的位置;你还可以把某一类的tag折叠起来(使用了VIM的折行功能),方便查看,就像图中macro和variable那样。更多的功能,请查看taglist的帮助页,本文也会介绍一些常用功能。
下面介绍常用的taglist配置选项,你可以根据自己的习惯进行配置:
- Tlist_Ctags_Cmd选项用于指定你的Exuberant ctags程序的位置,如果它没在你PATH变量所定义的路径中,需要使用此选项设置一下;
- 如果你不想同时显示多个文件中的tag,设置Tlist_Show_One_File为1。缺省为显示多个文件中的tag;
- 设置Tlist_Sort_Type为”name”可以使taglist以tag名字进行排序,缺省是按tag在文件中出现的顺序进行排序。按tag出现的范围(即所属的namespace或class)排序,已经加入taglist的TODO List,但尚未支持;
- 如果你在想taglist窗口是最后一个窗口时退出VIM,设置Tlist_Exit_OnlyWindow为1;
- 如果你想taglist窗口出现在右侧,设置Tlist_Use_Right_Window为1。缺省显示在左侧。
- 在gvim中,如果你想显示taglist菜单,设置Tlist_Show_Menu为1。你可以使用Tlist_Max_Submenu_Items和Tlist_Max_Tag_Length来控制菜单条目数和所显示tag名字的长度;
- 缺省情况下,在双击一个tag时,才会跳到该tag定义的位置,如果你想单击tag就跳转,设置Tlist_Use_SingleClick为1;
- 如果你想在启动VIM后,自动打开taglist窗口,设置Tlist_Auto_Open为1;
- 如果你希望在选择了tag后自动关闭taglist窗口,设置Tlist_Close_On_Select为1;
- 当同时显示多个文件中的tag时,设置Tlist_File_Fold_Auto_Close为1,可使taglist只显示当前文件tag,其它文件的tag都被折叠起来。
- 在使用:TlistToggle打开taglist窗口时,如果希望输入焦点在taglist窗口中,设置Tlist_GainFocus_On_ToggleOpen为1;
- 如果希望taglist始终解析文件中的tag,不管taglist窗口有没有打开,设置Tlist_Process_File_Always为1;
- Tlist_WinHeight和Tlist_WinWidth可以设置taglist窗口的高度和宽度。Tlist_Use_Horiz_Window为1设置taglist窗口横向显示;
在taglist窗口中,可以使用下面的快捷键:
<CR> 跳到光标下tag所定义的位置,用鼠标双击此tag功能也一样
o 在一个新打开的窗口中显示光标下tag
<Space> 显示光标下tag的原型定义
u 更新taglist窗口中的tag
s 更改排序方式,在按名字排序和按出现顺序排序间切换
x taglist窗口放大和缩小,方便查看较长的tag
+ 打开一个折叠,同zo
- 将tag折叠起来,同zc
* 打开所有的折叠,同zR
= 将所有tag折叠起来,同zM
[[ 跳到前一个文件
]] 跳到后一个文件
q 关闭taglist窗口
<F1> 显示帮助可以用“:TlistOpen”打开taglist窗口,用“:TlistClose”关闭taglist窗口。或者使用“:TlistToggle”在打开和关闭间切换。在我的vimrc中定义了下面的映射,使用“,tl”键就可以打开/关闭taglist窗口:
map <silent> <leader>tl :TlistToogle<cr>Taglist插件还提供了很多Ex命令,你甚至可以用这些命令创建一个taglist的会话,然后在下次进入VIM时加载此会话。
下载地址:http://www.vim.org/scripts/script.php?script_id=273
从以上地址下载到压缩包后,直接在$HOME/.vim的目录下进行解压。然后重新启动VIM。
你可以继续输入:h omnicppcomplete来查看插件提供的文档,里边有安装和使用的所用方法。
在你的vim配置文件(~/.vimrc或者/etc/vimrc,没有可以新添加一个)加上以下几句:
set nocp
filetype plugin on
map <C-F12> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR>
set completeopt=menu
set cindent
:inoremap ( ()<ESC>i
:inoremap ) <c-r>=ClosePair(')')<CR>
:inoremap { {}<ESC>i
:inoremap } <c-r>=ClosePair('}')<CR>
:inoremap [ []<ESC>i
:inoremap ] <c-r>=ClosePair(']')<CR>
:inoremap < <><ESC>i
:inoremap > <c-r>=ClosePair('>')<CR>
:inoremap " ""<ESC>i
:inoremap ' ''<ESC>i
function ClosePair(char)
if getline('.')[col('.') - 1] == a:char
return "\<Right>"
else
return a:char
endif
endf
使用方法:
omnicppcomplete主要依赖ctags生成的tags文件来判断补全的,所以首先应该生成一定的信息。也就是说应该先把类写好,然后再生成tags,以后出现对象的 ”.” 或 ”->”成员操作时它自动寻找成员函数。
在工程目录 下用vim编辑文件时按Ctrl+F12 ,ctags会把这个文件所在目录以及子目录的所有文件信息收集生成一个名为tags的文件存在当前编辑文件所在目录。然后就可以实现代码自动补全。 在~/.vimrc中添加的 map…… 那句宏就实现这个功能。/*强烈建议不要使用这个:注意,如果要让新编写的文件可以使用则需先写入,命令为 :w */
下载地址:http://www.vim.org/scripts/script.php?script_id=1879
下载的是一个zip文件,解压后会有三个文件夹,分别是autoload,doc,plugin。到Vim的根目录下,找到名字和这三个一样的文件夹。不同系统目录位置不同。我的是/usr/share/vim/vim70,另外该插件对VIM有版本方面的要求。VIM70最好使用插件的2.8.1版本,过新或过旧的插件都是无效的。
按照文件夹对应的把里面的acp.vim和其他的什么文件都copy过去。然后重启Vim。这时候应该会有错误提示,反正我的是有
Error detected while processing /home/carlos/.vim/plugin/acp.vim:
line 13:
***** L9 library must be installed! *****这是插件放出的一个错误提示,查看plugin里的acp.vim可以看到。是缺少L9 library库。这个也是需要下载的。地址在下面
http://www.vim.org/scripts/script.php?script_id=3252
下载下来,它也是一个插件形式,以同样的方式copy到Vim目录下。
安装完后就可以了。
下面说一下个人的其他设置。正常autocomplpop是按字典进行补全的,只有你输入过的单词才可以补全。第一次想要自动补全必须用CTRL+X或CTRL+O来补全。下面的代码可以增强一下自动补全功能,复制到Vim的配置文件vimrc里
let g:AutoComplPop_Behavior = { \ 'c': [ {'command' : "\<C-x>\<C-o>", \ 'pattern' : ".", \ 'repeat' : 0} \ ] \}再就是这个插件默认是没有设置php自动补全的,为了能让其输入$后自动出来补全框。把下面的代码增加到vimrc中
if !exists('g:AutoComplPop_Behavior') let g:AutoComplPop_Behavior = {} let g:AutoComplPop_Behavior['php'] = [] call add(g:AutoComplPop_Behavior['php'], { \ 'command' : "\<C-x>\<C-o>", \ 'pattern' : printf('\(->\|::\|\$\)\k\{%d,}$', 0), \ 'repeat' : 0, \}) endif
http://sourceforge.net/projects/cscope/files/ 下载 Cscope 最新版 15.7a(cscope-15.7a.tar.bz2)直接编译安装 如果 make 时出现“curses.h not found”之类的错误,则需要先安装“libncurses-dev”包 回到 ~ 目录,输入: $ mkdir -p .vim/plugin $ cd .vim/plugin $ wget http://cscope.sourceforge.net/cscope_maps.vim # 安装 cscope_maps.vim 插件如果只希望 Cscope 关联起所有的 .c 文件,那么可以直接到工程的根目录下,输入: $ cscope -Rbq -R 表示递归地把所有子文件夹中的 source file 也关联进来 -b 表示只建立数据库文件 cscope.out,不进入 Cscope 的 GUI 界面 -q 会建立两个额外的 'inverted index' file: cscope.in.out 和 cscope.po.out,以加快查找的速度 如果不希望把 /usr/include 中被工程文件包含的 .h 文件关联进来,就加 -k 如果要关联其他类型的文件(如 .cpp、.java等),就需要我们自己先生成一个 cscope.files,把所有我们希望关联进去的文件都列在里面: $ find /home/edelweiss/nbd/nbd-2.9.15/ -name '*.c' -o -name '*.cpp' -o -name '*.h' \ > /home/edelweiss/cscope.files 注意查找的路径一定要写成绝对路径,这样才能保证写入到 cscope.files 文件中的也是绝对路径。 之后就可以根据 cscope.files 建立数据库了: $ cscope -bq -i /home/edelweiss/cscope.files 如果生成数据库文件后,工程中的代码有所改动,最好重新生成一次那三个文件,否则查找結果可能与实际不匹配。 查看代码时常用的快捷键是 Ctrl+\ s(按住 Ctrl 不放,同时按 \,然后全部松开,按 s)。将光标放到想要查看所有出现位置的 C Symbol 上,按下上述快捷键,屏幕下方就会出现一个列表,输入序号并回车就能到达想去的地方。按下 Ctrl+t 可回到搜索前的位置。 直接在命令行查找可输入 “:cs f s symbol_name” 其他用法可以输入 “:cs” 查看或者参阅 manpage 和官网上的 Vim/Cscope Tutorial。
下载网址: http://www.vim.org/scripts/script.php?script_id=1643 软件功能: 按TAB键实现自动补全 安装方法: [安装]: 下载软件包supertab.vba,用VIM打开后,在Normal Mode下执行:":so %"即可实现自动安装。 [配置]: " 0 - 不记录上次的补全方式 " 1 - 记住上次的补全方式,直到用其他的补全命令改变它 " 2 - 记住上次的补全方式,直到按ESC退出插入模式为止 let g:SuperTabRetainCompletionType=2 " 设置按下<Tab>后默认的补全方式, 默认是<C-P>, " 现在改为<C-X><C-O>. 关于<C-P>的补全方式, " 还有其他的补全方式, 你可以看看下面的一些帮助: " :help ins-completion " :help compl-omni let g:SuperTabDefaultCompletionType="<C-X><C-O>" 常用命令: 注意事项:1)虽然有知名度,但补全的准确度仍不高,如果源文件多,有时会造成按一下Tab键然后等着Vim在那狂搜的情况
详见:http://www.vim.org/scripts/script.php?script_id=2358
命令:ctags -R --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++ cpp_src
.vimrc配置:set tags+=/my/path/to/tags/cpp