天天看點

ctags簡述

    ctags用于為源代碼檔案生成一個索引或标簽檔案,以便使這個檔案裡的代碼可被文本編輯器快速定位,如Vim,使得Vim這麼個簡陋的編輯器也能變成神器。

    ctags能為多種語言源檔案生成交叉索引表,通過--list-languages和--list-kinds選項能看到其支援的語言。ctags預設以檔案名的字尾來判斷源檔案的語言類型,進而采用相應的映射生成标簽,--list-maps選項可展示語言類型與檔案的字尾名的對應情況。--language-force=language選項可強制采用某種語言類型。若檔案是可執行的又沒有字尾,則ctag會檢視檔案的第一行(如腳本檔案的#!),判斷其語言類型。

    ctags選項的預設值适合多數情況,由于其對檔案類型的判斷機制,它将忽略那些它不能識别的源檔案,故可不用帶任何選項就為目前目錄下可識别的源檔案生成一個标簽檔案(如 ctags *或ctags -R)。

下面是網絡上對man ctags的選項翻譯,粘貼一下

      需注意,用來分隔單字母選項和它們參數的空格是可選的。

       同樣需注意,長格式選項的布爾型參數 (那些以 "--" 開頭并且帶 "[=yes|no]" 參數的選項) 可以被省

       略,在這種情況下隐含為 "=yes" ,而 "=0" 和 "=off" 被認為是 "=no" 。

       某些選項在以 etags 模式運作時或被忽略,或會起作用 (見 -e 選項)。這樣的選項會特殊注明。

       絕大多數選項可以出現在指令行的任意位置,隻影響在該選項後面的檔案。然而,少數選項必須出現在第

       一個檔案名之前,這樣的選項也會特殊注明。

       帶程式語言名字的選項允許名字是大寫或小寫。見 --list-languages 選項,以獲得内建程式語言名的完

       整清單。

       -a   等同于 --append

       -B   使用向上查找的模式 (例如 ?pattern?)。 [在 etags 模式中忽略]

       -e   使能 etags 模式,這将建立 Emacs 編輯器使用的标簽檔案。可選的,如果包含 "etags" 調用

            ctags 時 (通過重命名,或者建立符号連結到可執行檔案的方式),會使能 etags 模式。這個選項

            必須出現在第一個檔案名之前。

       -f tagfile

            使用所指定的 tagfile 做為标簽檔案的名字 (預設是 "tags",或 "TAGS" 當以etags模式運作時)。

            如果 tagfile 被定義成 "-",那麼标簽檔案被輸出到标準輸出。如果 tagfile 存在并且它的第一

            行不是有效的标簽行時,ctags 将拒絕執行。如果你錯誤的輸入了 "ctags -f *.c",這會救你一命,

            不然它會把其它檔案所産生的标簽覆寫到你的第一個 C 檔案! ctags 也會拒絕接受以一個 "-" (減

            号)開頭的檔案名,因為這很可能是你忘記輸入标簽檔案的名字,而本選項試圖把它後面的選項做為

            檔案名。如果你真的想把你的輸出标簽檔案名命名為 "-ugly",把它定義成 "./-ugly"。這個選項

            必須出現在第一個檔案名之前。如果這個選項出現多次,隻有最後一個生效。

       -F   使用向下查找的模式 (例如 /pattern/) (預設)。 [在 etags 模式中忽略]

       -h list

            定義一個檔案擴充名清單,以句号分隔,這些檔案将做為包含檔案(或頭檔案)被解析。要指定沒有

            擴充名的檔案,用一個句号,後面不跟句号以外的字元 (例如,".","..x",".x.")。這個選項隻

            影響如何解析一種特定類型的标簽的作用域 (也就是說,這些标簽是全局可見,還是這些标簽隻在

            定義它們的檔案中可見);它并不把這些擴充名映射到任何特定的程式語言。任何位于非頭檔案中的

            标簽,如果不能被另外一個檔案可見 (例如,連結到另外一個檔案),那麼它的作用域被認為局限于

            該檔案 (例如,static)。在頭檔案中的所有類型的标簽,它的作用域都不會被認為局限于該檔案。

            如果清單中的第一個字元是加号,那麼該清單中的擴充名将被加到現有清單之後;否則,該清單将

            替換現有清單。另外,參見 --file-scope 選項。預設的清單是 ".h.H.hh.hpp.hxx.h++.inc.def"。

            要恢複預設清單,使用 -h default。注意,如果此選項指定的一個擴充名還沒有被映射到一種特定

            的程式語言 (見上面的 SOURCE FILES),你也需要使用 --langmap 或 --language-force 選項。

       -I identifier-list

            定義一個辨別符清單,在解析 C 和 C++ 源檔案時會對這些辨別符進行特殊的處理。這個選項主要

            用來處理由于編譯預處理宏的使用而引發的特殊情況。當列出的辨別符是簡單的辨別符時,這些标

            識符在解析源檔案時會被忽略。如果一個辨別符以 "+" 字元做為結尾,ctags 将忽略源檔案中緊跟

            在此辨別符後的被括号括起來的參數清單。如果兩個辨別符以 "=" 字元分隔,在解析時,第一個标

            識符将被第二個辨別符所替代。辨別符清單可以直接在指令行上提供,也可以從一個單獨的檔案中

            讀出。如果 identifier-list 的第一個字元是 "@",".",或目錄分隔符 ("/" 或 "\"), 或前兩個

            字元是驅動器的盤符 (例如,"C:"),identifier-list 參數将被解釋為一個檔案名,從這個檔案中

            讀取辨別符清單,每行一個辨別符。否則,identifier-list 是需要被特殊處理的辨別符的清單

            (或一組辨別符對的清單),每一個辨別符被逗号或空格分開,(如果以空格分隔,需要用引号把整個

            清單括起來,以使整個清單做為一個指令行參數)。可以使用多個 -I 選項。要清除已定義的辨別符

            清單,以 "-" 做為 identifier-list 參數。

            這個特性在編譯預處理宏的出現會導緻句法混淆的時候非常有用。實際上,這是解決源檔案中幹擾

            文法的宏所引發的問題的最好辦法 (見下面的 CAVEATS)。下面的例子較長的描述這點。

              int foo ARGDECL4(void *, ptr, long int, nbytes)

            在上面的例子中,宏 "ARGDECL4" 将被錯誤的解釋為函數的名字,而不是正确的名字 "foo"。定義

           -I ARGDECL4 會獲得正确的結果。

               MODULE_VERSION("$Revision: 1.41 ___FCKpd___0quot;)

            在上面的例子,宏定義看起來非常像一個函數的定義,因為它沒有以分号結尾 (實際上,它後面甚

            至還可以跟一個全局變量定義,這樣看起來更像一個 K&R 風格的函數參數定義)。實際上,在試圖

            完成這個看起來像函數的定義時,可能會導緻檔案的其它部分被跳過。定義 -I MODULE_VERSION+

            可以避免這樣的問題。

               CLASS Example {

                   // your content here

               };

            上面的例子使用了 "CLASS" 做為預處理宏,它在不同的平台上被擴充為不同的東西。例如,在

            Win32 平台上它可能被定義為 "class __declspec(dllexport)",而在 UNIX 上簡單的被定義為

            "class"。通常,沒有 C++ 的 "class" 關鍵字将導緻源檔案被錯誤的解析。定義 -I CLASS=class

            能夠得到正确的結果。

       -L file

            在檔案 file 中讀取需要産生标簽檔案的檔案清單。如果 file 被指定為 "-",那麼檔案清單由标

            準輸入上讀取。通過這個選項讀到的檔案将在指令行上給出的檔案之後被處理。輸入中的選項也會

            被接受 (*1)。如果此選項被定義多次,隻使用最後一個。注意:file 以行的方式被讀取,隻以換

            行符做為分隔符,空格被認為是有意義的,這是為了支援檔案名中包含空格的情況;如果輸入中包

            含選項,這會影響選項如何被解析 (*2)。

繼續閱讀