tags有什么用去枷?
????我知道的用途只有兩個。一個是根據tag來跳轉,一個是根據tag來自動補齊
關于自動補齊的一些說明例朱?
????tags的自動補齊實際上是通過vim的omni completion(即ctrl-x,ctrl-o)來實現(xiàn)的。現(xiàn)在還有一種更強大的補齊方式(即clang)鱼蝉,這種通過User defined completion(即ctrl-x,ctrl-u)來實現(xiàn)的
兩種補齊方式官方文檔如下:
??https://www.vim.org/scripts/script.php?script_id=2358
??https://www.vim.org/scripts/script.php?script_id=3302
下面重點說下ctags的常用選項
--list-maps(列出所有語言和文件后綴的映射關系洒嗤,即什么樣的文件被認為是什么樣的語言)
--list-kinds=c(列出指定語言的所有tag類型。注意魁亦,有些類型默認是關閉的)
--links=yes(沿著軟連接走下去渔隶,默認yes,不用理它)
--file-scope=yes(文件范圍的tag也打進去洁奈,默認yes间唉,不用理它)
--langmap=c:+.h(改變默認的語言映射關系。.h默認映射到c++)
--languages=c,c++(只對特定語言的文件打tag利术。就是說你輸入的這些文件呈野,如果被判定不是指定語言,是不會進行處理的)
--c-kinds=+p(開啟c語言的函數(shù)原型tag類型印叁。自動補齊需要)
--c++-kinds=+p(開啟c++語言的函數(shù)原型tag類型被冒。自動補齊需要)
--fields=+iaS(每個tag军掂,給出更詳細的信息。自動補齊需要)
--extra=+q(即qualified fileds昨悼,也打上tag蝗锥。自動補齊需要)
-I __THROW -I __attribute_pure__ -I __nonnull -I __attribute__(忽略這些關鍵字,不然有些c函數(shù)沒法識別)
--exclude=c++(打tag的時候率触,忽略指定的目錄或者文件)
-L project.files(把要打tag的文件列表寫入project.files文件)
-f ~/mytags/cpp(指定tags的文件名稱)
-R(對目錄遞歸執(zhí)行)
標準c++ tags
1 下載cpp_src源碼(https://www.vim.org/scripts/script.php?script_id=2358)
2 ctags --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++ -R -f ~/mytags/cpp ~/cpp_src
標準c tags
ctags -I __THROW -I __attribute_pure__ -I __nonnull -I __attribute__ \
--langmap=c:+.h --languages=c \
--c-kinds=+p --fields=+iaS --extra=+q \
-f ~/mytags/systags \
/usr/include/*.h \
/usr/include/sys/*.h
/usr/include/netinet/*.h
頭文件目錄玛追,根據需求自己加。我不喜歡用-R /usr/include(沒用的符號太多)
也可以選擇用-L tmp.txt這種方式闲延,下面是自動生成tmp.txt的方法
ls -lh /usr/include | grep '^d' | awk '{print $9}' | sed -E 's#(.*)#/usr/include/&/*.h#' | sed '1i /usr/include/*.h' > tmp.txt
Project tags
ctags --c-kinds=+p --c++-kinds=+p --fields=+iaS --extra=+q --languages=c,c++ -R ./