1. 程式人生 > >ctags 處理系統標頭檔案

ctags 處理系統標頭檔案

2010-11-18

周海漢 2010.11.16 http://abloz.com

問題提出:

vim編寫程式時,不能跳轉到系統標頭檔案定義,不能自動完成自己編寫結構成員。需要解決。

ctags 在使用vim程式設計和瀏覽程式碼是非常有用。可以用CTRL+]和CTRL+t 來回跳轉關鍵字。 先生成自己工作目錄的tags。最簡單粗暴用法:

$cd yourwork
$ctags -R *

這樣會生成一個tags檔案。 不過,這種有個問題,成員變數沒有包含在裡面。所以自動完成物件的成員時沒有提示。 解決辦法:

$ctags -R --fields=+iaS --extra=+q *

–fields=[+|-]flags –fields指定tags的可用擴充套件域(extension fields),以包含到tags入口。 i:繼承資訊Inheritance information a:類成員的訪問控制資訊 Access (or export) of class members S: 常規簽名信息,如原型或引數表 Signature of routine(e.g. prototype or parameter list) –extra=[+|-]flags 指定是否包含某種擴充套件資訊到tags入口。 q:包含類成員資訊(如c++,java,Eiffel)。 但就算是C 語言的結構,也需要這兩個引數設定才能獲取成員資訊。

這樣就能自動完成結構和類的成員了。

但是,對於系統的函式,還是沒有跳轉。如socket定義,inetaddr_in這樣的結構沒有自動變數完成。 最簡單做法:

$ctags --fields=+iaS --extra=+q -R -f ~/.vim/systags /usr/include /usr/local/include

然後在.vimrc裡設定

set tags+=~/.vim/systags

這樣雖然基本能跳轉到系統函式定義,一個問題是某些系統函式並沒有加入到systags裡。 如/usr/incluce/socket.h的socket系列函式,memset等很多關鍵函式都沒有到tag裡:

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

這是因為 __THROW的巨集定義讓ctags不再認為該系列函式是函式。 同理,如memcpy系列函式: 如/usr/include/string.h的

extern int strcmp (__const char *__s1, __const char *__s2)
     __THROW __attribute_pure__ __nonnull ((1, 2));

還有attribute_pure ,nonull等屬性,都需要忽略。如果需要#if 0裡面的定義,可以–if0=yes來忽略 #if 0這樣的定義。

$ctags -I __THROW -I __attribute_pure__ -I __nonnull -I __attribute__ --file-scope=yes --langmap=c:+.h --languages=c,c++ --links=yes --c-kinds=+p --c++-kinds=+p --fields=+iaS --extra=+q -R -f ~/.vim/systags /usr/include /usr/local/include

這樣.vim/systags裡面是全的,但內容過多。一個函式定義的跳轉,會有幾十個候選。這時我們可以簡化一下,將-R去掉,自己指定目錄:

$ctags -I __THROW -I __attribute_pure__ -I __nonnull -I __attribute__ --file-scope=yes --langmap=c:+.h --languages=c,c++ --links=yes --c-kinds=+p --c++-kinds=+p --fields=+iaS --extra=+q  -f ~/.vim/systags /usr/include/* /usr/include/sys/* /usr/include/bits/*  /usr/include/netinet/* /usr/include/arpa/* /usr/include/mysql/*

還可以包含一些自己程式設計需要的路徑。注意後面加*號。 這樣生成的系統tags就少多了。不會有太多不相干的定義。

參考: http://hi.baidu.com/%B2%BB%D5%FD%D6%B1%B5%C4%C8%CB/blog/item/7f55080382c5a9e708fa93bf.html

如非註明轉載, 均為原創. 本站遵循知識共享CC協議,轉載請註明來源