您的位置:首页 > 其它

Vim函数自动补齐(包括库函数)

2014-01-09 14:09 435 查看
我用的是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 <C-F12> :!ctags -R --c++-kinds=+pl --fields=+iaS --extra=+q .<CR>


前面两句就是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 ( ()<ESC>i
:inoremap ) <c-r>=ClosePair(')')<CR>
:inoremap { {<CR>}<ESC>O
: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
endfunction


就可以了。

在vim中调用g++,gcc,gdb什么的。

map <F5> :call CompileRun()<CR>
func! CompileRun()
exec "w"
exec "! g++ -o %< %"
exec "! ./%<"
endfunc
map <F8> :call RunGdb()<CR>
func! RunGdb()
exec "w"
exec "!g++ -g -o %< %"
exec "!gdb ./%<"
endfunc


在命令模式下按下F5调用CompileRun(),第一句是保存文件,第二句就是调用g++ ,%就是当前文件,比如叫test.cpp,%<就是test。我在我电脑上是通过了的,没有弄c的编译选项,加上应该很easy。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: