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

我用的是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文件。先测试了一下我自己的类能不能补全。

Vim函数自动补齐(包括库函数)_第1张图片

已经自动补全了。

再来测试一下标准库,用vector做为我的例子,如图:

Vim函数自动补齐(包括库函数)_第2张图片

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。

你可能感兴趣的:(Linux)