分類:學習
使用tags
tags是定義識別符號的地方。例如在c和c++程式中的函式定義。tags的列表在乙個tags檔案中維護。這個可以被vim用以直接的從任何地方跳轉到tag,也就是定義了識別符號的地方。
如果要成成所有當前目錄下的c檔案的tags檔案,使用如下命令:
ctags *.c
現在當你在vim中並且希望到達乙個函式定義的時候,你可以使用如下命令進行跳轉了:
:tagstartlist
這個命令將會發現函式「startlist」,即使該函式在另外乙個檔案中。這使得檢視混亂的c**變得非常簡單。例如,你在檢視函式「write_block」,而該函式中呼叫了「write_line」。但是「write_line」做了什麼呢?將游標移動到「write_line」上,並且使用ctrl_j,你就可以跳轉到這個函式的定義了。
函式「write_line」呼叫了「write_char」。你需要檢視這個函式做了什麼。你將游標位置放到write_char上,然後按下ctrl_j即可跳轉到函式的定義。
命令「:tags」可以顯示使用的tags的列表。
如果要回去,使用ctrl-t即可跳轉到之前的tag。這個命令有乙個count引數作為其字首,可以表明迴轉的tags數。再一次向前跳轉,可以使用:tag到list的最上邊。如果要跳轉過數個tags,可以使用乙個count引數,例如:"3tag"。ctrl-t也可以以乙個count為字首使用。
這些命令允許你使用ctrl-j正向檢視呼叫樹,然後使用ctrl-t回退。並且使用":tags"檢視你在**。
分屏顯示
」:tag「命令將會使用包含新函式的檔案,替換當前window顯示的檔案。但是假設你不僅僅想看原來的函式,也想看到新的函式,應該怎麼辦?你可以分屏顯示,在":tag"命令前,使用":split"命令。vim有乙個簡單的命令,可以做到這一點:
:stag tagname
這樣分屏,並且跳轉到游標下的tag,可以使用ctrl-w j。
如果指定乙個count,新的window的高度,將會是那樣的。
更多的tags檔案
當你在很多目錄下有檔案,你可以在每個目錄下建立乙個tags檔案。vim將會僅僅能夠跳轉到這乙個目錄下的tags,而不能跳轉到其他目錄下的tags。
:settags=./tags,./../tags,./*/tags
這將使得vim在上層、本次和所有子層下進行查詢。你可以使用完全目錄樹來進行定義。
整合成乙個tags檔案
vim在不得不在多個目錄下搜尋tags檔案的時候,將會變得較低效。這種情況下,最好做一次產生乙個大的tags檔案的操作。
ctags -r .可以對當前目錄下,所有目錄遞迴的進行搜尋,產生乙個tags檔案。
現在你僅僅需要告知vim 你的大的tags檔案的目錄,就可以了。
多匹配
當乙個函式多次被定義的時候(或者乙個類中的方法),":tag"將跳轉到第乙個。如果在當前檔案中有匹配,則這個就是第乙個。你可以使用如下命令跳轉到另外乙個匹配tag上:
:tnext
如果匹配很多,你可以選擇乙個跳轉。
:tselecttagname
這樣,vim將給你顯示乙個選擇的表。
表中的第一列是匹配號。輸入這個號,你就可以跳轉到這個匹配上。
在匹配tags中進行轉換,你可以使用如下命令:
:tfirst :[count]tprevious :[count]tnext :tlast。count預設是1.
猜測tag名字
使用tab鍵可以進行tag名字補足。tab將會先產生第乙個匹配,繼續tab即可切換到下乙個。你也可以使用模糊匹配。例如,
:tag /block,跳轉到有block的tag。
現在,使用tab,vim將會查詢所有包含block的匹配,並使用第乙個。
在tag名字前的/告訴vim,跟隨的是模式匹配。你可以使用模式匹配的方式使用任何命令。例如選擇,
:tselect/^write_ 是告訴vim選擇以」write_「開始的tag。^表示以其開頭,$表示以其結尾。
tags的瀏覽
ctrl-j帶你跳轉到游標指定tag的定義,你可以將識別符號名稱作為乙個**的內容。這是個例子。
首先,建立乙個識別符號列表,這需要ctags。
ctags--c-types=f -f functions *.c
現在開啟vim,並不使用file作為引數。在vim中編輯這個檔案,以垂直分屏方式。
vim:vsplitfunctions
:nnmoremap0yew:tag "
將滑鼠移到包含你想跳轉的函式的哪行,輸入回車。vim將會跳轉到另外乙個window並且跳轉到選擇的函式。
相關選項
你可以 設定『ignorecase』使得tag名字的大小寫被忽略。
tagbsearch選項告知,是否tags檔案被排序或者不排序。預設是假定是乙個排序的tags檔案,這使得匹配更快,但是如果沒排序,則沒有什麼用了。
taglength則可以告知vim在乙個tag中忽略的識別符號多少。
當你使用sniff+程式,你可以使用vim提供給sniff的介面。sniff+是乙個商業程式。
cscope是乙個免費程式。它不僅僅發現識別符號在哪宣告,也可以發現在哪被使用。
Linux下vim的tag用法
使用tags tags是定義識別符號的地方。例如在c和c 程式中的函式定義。tags的列表在乙個tags檔案中維護。這個可以被vim用以直接的從任何地方跳轉到tag,也就是定義了識別符號的地方。如果要成成所有當前目錄下的c檔案的tags檔案,使用如下命令 ctags c 現在當你在vim中並且希望到...
Linux編輯器 vim的tag29 2
29.2 之前的window 當你編輯包含函式呼叫的 的時候,你需要使用正確的引數。知道傳遞什麼樣的值,你需要檢視函式的定義。tags機制非常適合這個。更好的是定義被顯示在另外乙個window。這樣,之前的window可以使用。開啟乙個之前的window來顯示函式 write char ptag w...
Linux編輯器 vim的tag29 4
29.4查詢全域性識別符號 你正在編寫c程式,並且想知道乙個變數是被宣告為int或者unsigned。乙個發現這個的快速方法是使用 i命令。假設游標在column這個字上,輸入 i,vim會列出匹配的所有行。不僅僅在當前檔案,所有包含檔案,和包含檔案中包含的檔案,都會列出。這種方式相對於使用tags...