我用的是ubantu 64位的.
主要是两个东西,第一个是Ctags,OmniCppComplete.
首先下载Ctags:sudo apt-get install ctags.如果需要安装就安装.
下载OmniCppComplete:http://www.vim.org/scripts/script.php?script_id=1520
网页上有安装说明,我是按照他说的,放到了~/.vim这。
生成ctags:
主要是库函数和当前工程:
1.库函数:
可以参考这个http://vim.wikia.com/wiki/C++_code_completion。先下载modified libstdc++ header,我照着wiki上那样,把这个头文件放到了~/.vim/tags下,
进入到这个目录下执行:
ctags -R --sort=1 --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++ -f cpp cpp_src
这是生成tags的命令,具体的选项的含义可以去网上搜一下,执行完成了之后~/.vim/tags的目录下不仅有那个头文件,还多了一个名字为cpp的文件,这就是我们刚才生成的标准c++库的tags.
我们自己工程的cpp生成tags的方法:
我们在用vim编辑的时候最好,写一段就生成一段.我们可以在vim配置文件中进行设置,编辑代码的时候按下某一些键就可以在我们工程目录下生成tags。
这是我的vim配置:
set tags+=~/.vim/tags/cpp
set tags+=$MyProject/tags
map :!ctags -R --c++-kinds=+pl --fields=+iaS --extra=+q .
前面两句就是tags的路径,$MyProject是我工程的环境变量。最后一句的意思就是我写代码的时候,在命令的模式按下ctrl+F12就会在我工程的路径下生成tags。
然后就是设置OmniCppComplete.可以照着omnicppcomplete给的帮助文档进行设置,我的设置是
filetype plugin on
syntax enable
let OmniCpp_MayCompleteDot = 1 " autocomplete with .
let OmniCpp_MayCompleteArrow = 1 " autocomplete with ->
let OmniCpp_MayCompleteScope = 1 " autocomplete with ::
let OmniCpp_SelectFirstItem = 2
let OmniCpp_NamespaceSearch = 2
let OmniCpp_ShowPrototypeInAbbr = 1
let OmniCpp_GlobalScopeSearch=1
let OmniCpp_DisplayMode=1
let OmniCpp_DefaultNamespaces=["std"]
我在我的MyProject下新建了一个测试的.cpp文件。先测试了一下我自己的类能不能补全。
已经自动补全了。再来测试一下标准库,用vector做为我的例子,如图:
s是一个vector,我输入p就自动进行提示了。
现在只是有补全,还没有函数参数,可以使用code_complete查看链接http://www.vim.org/scripts/script.php?script_id=1764
事实上,vim自己提供了很多的补全函数,可以到vim的目录下,里面有一个autoload(我电脑是/usr/share/vim/vim74)里面你会发现有很多complete函数对应不同的文件类型,
要想使用这些函数,可以在你的vimrc中加入(以python为例,其他类似):autocmd Filetype python set omnifunc=pythoncomplete#Complete,其中omnifunc这个可以使用help omnifunc查看使用方式,这里使用了filetype,前提是filetype plugin on 打开了,后面的函数名字,大家可以打开autoload下的*.vim文件查看函数的名字。
自动添加括号:
打开vim的配置文件,加入以下代码
:inoremap ( ()i
:inoremap ) =ClosePair(')')
:inoremap { {}O
:inoremap } =ClosePair('}')
:inoremap [ []i
:inoremap ] =ClosePair(']')
:inoremap " ""i
:inoremap ' ''i
function! ClosePair(char)
if getline('.')[col('.') - 1] == a:char
return "\"
else
return a:char
endif
endfunction
在vim中调用g++,gcc,gdb什么的。
map :call CompileRun()
func! CompileRun()
exec "w"
exec "! g++ -o %< %"
exec "! ./%<"
endfunc
map :call RunGdb()
func! RunGdb()
exec "w"
exec "!g++ -g -o %< %"
exec "!gdb ./%<"
endfunc
在命令模式下按下F5调用CompileRun(),第一句是保存文件,第二句就是调用g++ ,%就是当前文件,比如叫test.cpp,%<就是test。我在我电脑上是通过了的,没有弄c的编译选项,加上应该很easy。