天天看點

【VIM必備】VIM配置成C/C++ IDE的經驗——ctags不能查找系統檔案

經過幾天的試驗與google,終于配置将VIM配置成一個C/C++的IDE,用到的插件為Ctags,Winmanager,NERDTree,OmniCppComplete,以及MiniBufExplorer,

這些插件都可以再vim的官方網站的中下載下傳到,具體是實作是參照如下幾篇文章:

1)http://blog.csdn.net/klarclm/article/details/7932521

2)http://blog.csdn.net/klarclm/article/details/7932558

3)http://blog.csdn.net/wooin/article/details/1858917

有幾點重要内容,提醒大家一下:

1)VIM使用apt-get install vim,安裝好了以後,其中會存在多個vimrc配置檔案。比如我知道的有/usr/share/vim/vimrc  (這是個可見檔案),這個檔案會影響整個系統的VIM設定,

我們設定的時候别動它。對于我們自己的一個user,我們自己可以再~/ 目錄下面建立一個vimrc檔案來用于配置VIM,我們可以

$gedit  ~/.vimrc  

這樣去建立一個vimrc配置檔案。這個建立的檔案隻會影響本使用者的VIM,而且~/.vimrc檔案中的配置會覆寫/etc/vimrc 或者/usr/share/vim/vimrc 中的配置。是以這個配置是本用

戶的專屬配置。

2)我們需要在~/ 目錄下建立一個檔案夾(隐藏的),來儲存本使用者使用的VIM插件。同時我們可以在進入了VIM以後使用":set rtp"指令來檢視已經裝過的插件。

建立一個檔案夾來儲存                         $mkdir ~/.vim

出現的問題:

在我使用ctags時候,ctags為系統提供的頭檔案生成tags總是不對。

例如對于/usr/include/sys/socket.h,裡面有很多函數在ctags處理的時候沒有添加到tags裡面去。最後發現是__TRHOW的問題

ctags為系統提供的頭檔案生成的索引總是不太對。比如對于/usr/include/sys/socket.h,裡面有很多函數在ctags處理的時候沒有能加到索引裡去。最後發現是__TRHOW的問

題。以listen函數為例,在socket.h中,它的原型是:

extern int listen (int __fd, int __n) __THROW;

socket.h間接包含了sys/cdefs.h,__THROW就是在這個頭檔案中被定義的。其定義如下:

# if !defined __cplusplus && __GNUC_PREREQ (3, 3)       

# define __THROW       __attribute__ ((__nothrow__))   

# define __NTH(fct)    __attribute__ ((__nothrow__)) fct

# else                                                  

# if defined __cplusplus && __GNUC_PREREQ (2,8)        

#   define __THROW      throw ()                        

#   define __NTH(fct)   fct throw ()                    

# else                                                 

#   define __THROW                                      

#   define __NTH(fct)   fct                             

# endif                                                

# endif                                                 

正是這個複雜的宏定義幹擾了ctags,對于所有像listen這樣含有__THROW的原型,ctags一律都不能正确解析。

為了不讓__THROW幹擾ctags,需要在運作ctags時使用-I選項。一般使用下面的指令生成系統頭檔案tags

ctags -I __THROW --file-scope=yes --langmap=c:+.h --languages=c,c++ --links=yes --c-kinds=+p -R -f ~/.vim/systags /usr/include /usr/local/include

其關鍵是-I __THROW部分和--c-kinds=+p部分。(這裡是l,不是大寫的i)

設定-I後,ctags會在處理檔案時,就會忽略-I後面寫出來的符号。

而--c-kinds=+p則告訴ctags需要為函數原型的聲明也生成tag。

--langmap=c:+.h表示.h視為c檔案而不是c++檔案。

最後,設定你的~/.vimrc,加入一行:

set tags+=~/.vim/systags

就可以享受系統庫函數名補齊,和   .  ->  等有用的功能了。

SuperTab的安裝方法:

『插件介紹』

SuperTab使Tab快捷鍵具有更快捷的上下文提示功能。

『下載下傳和安裝』

從http://www.vim.org/scripts/script.php?script_id=1643下載下傳安裝版。這個安裝包跟先前的幾個Vim插件不同,它是一個vba檔案,即Vimball格式的安裝包,這種格式安裝包提供傻瓜式的安裝插件的方法。

       1)用Vim打開.vba安裝封包件。

       2)在Vim指令行下運作指令“UseVimball ~/.vim”。此指令将安裝包解壓縮到~/.vim目錄。VImball安裝方式的便利之處在于你可以在任何目錄打開.vba包安裝,而不用切換到安裝目的地目錄。而且不用運作helptags指令安裝幫助文檔。

       3)在~/.vimrc檔案中加入以下這行:

 "-- SuperTab--

    let g:SuperTabRetainCompletionType=0    

    "0不記錄上次補全方式,1記住,知道用其他補全指令改變,2記住,知道用ESC推出插入模式

    let g:SuperTabDefaultCompletionType="<C-X><C-N>"

    "設定按下【Tab】後的預設補全方式

這裡因為和Omnicomplete一起使用的,就把檔案補全用在這裡了,預設SuperTab的快捷鍵可以更改。