1. 程式人生 > >Vim函式自動補齊(包括庫函式)

Vim函式自動補齊(包括庫函式)

我用的是ubantu 64位的.

主要是兩個東西,第一個是Ctags,OmniCppComplete.

首先下載Ctags:sudo apt-get install ctags.如果需要安裝就安裝.

網頁上有安裝說明,我是按照他說的,放到了~/.vim這。

生成ctags:

主要是庫函式和當前工程:

1.庫函式:

進入到這個目錄下執行:

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。