Tagsrch

Nvim 的 :help 頁面,是從 原始碼 使用 產生 而來的,並透過 tree-sitter-vimdoc 解析器進行解析。


標籤與特殊搜尋
請參閱使用者手冊 29.1 節以取得介紹。

1. 跳至標籤 tag-commands

tag tags 標籤是在「tags」檔案中出現的識別符號。它是一種可以跳轉到的標籤。例如:在 C 程式中,每個函數名稱都可以作為標籤使用。「tags」檔案必須先由像 ctags 這樣的程式產生,才能使用標籤命令。
使用「:tag」命令時,游標會定位在標籤上。使用 CTRL-] 命令時,游標所在的關鍵字會被用作標籤。如果游標不在關鍵字上,則會使用游標右側的第一個關鍵字。
「:tag」命令在 C 程式中非常有效。如果您看到一個函數的呼叫,並想知道該函數的作用,請將游標放在函數名稱內,然後按下 CTRL-]。這會將您帶到函數定義處。返回的簡單方法是使用 CTRL-T 命令。此外,請閱讀下面的標籤堆疊。
:ta :tag E426 E429 :[count]ta[g][!] {name} 跳至 {name} 的定義,使用標籤檔案中的資訊。將 {name} 放入標籤堆疊中。有關 [!],請參閱 tag-!{name} 可以是正規表示式模式,請參閱 tag-regexp。當 {name} 有多個匹配的標籤時,會跳到第 [count] 個。當省略 [count] 時,會跳到第一個。有關跳到其他匹配的標籤,請參閱 tag-matchlist
g<左滑鼠鍵> g<LeftMouse>
<C-左滑鼠鍵> <C-LeftMouse> CTRL-] CTRL-] 跳至游標下方的關鍵字的定義。與「:tag {name}」相同,其中 {name} 是游標下方或後方的關鍵字。當 {name} 有多個匹配的標籤時,會跳到第 [count] 個。當未提供 [count] 時,會跳到第一個。有關跳到其他匹配的標籤,請參閱 tag-matchlist
v_CTRL-]
{Visual}CTRL-] 與「:tag {name}」相同,其中 {name} 是被選取的文字。
telnet-CTRL-]
CTRL-] 是預設的 telnet 跳脫鍵。當您輸入 CTRL-] 以跳至標籤時,您將會收到 telnet 提示。大多數版本的 telnet 都允許變更或停用預設的跳脫鍵。請參閱 telnet 的說明頁面。您可以 telnet -E {Hostname} 以停用跳脫字元,或 telnet -e {EscapeCharacter} {Hostname} 以指定另一個跳脫字元。如果可能,請嘗試使用 "ssh" 而不是 "telnet" 來避免此問題。
tag-priority
當標籤有多個匹配項時,會使用以下優先順序:1. "FSC":目前檔案的完整匹配靜態標籤。2. "F C":目前檔案的完整匹配全域標籤。3. "F ":另一個檔案的完整匹配全域標籤。4. "FS ":另一個檔案的完整匹配靜態標籤。5. " SC":目前檔案的不區分大小寫匹配靜態標籤。6. " C":目前檔案的不區分大小寫匹配全域標籤。7. " ":另一個檔案的不區分大小寫匹配全域標籤。8. " S ":另一個檔案的不區分大小寫匹配靜態標籤。
請注意,當目前的檔案變更時,優先順序清單大多不會變更,以避免在使用「:tnext」時造成混淆。當使用「:tag {name}」時,才會變更。
當以下情況發生時,對於「:tag」命令,將不會找到不區分大小寫的匹配項
'tagcase' 為 "followic",且 'ignorecase' 選項關閉
'tagcase' 為 "followscs",且 'ignorecase' 選項關閉,並且 'smartcase' 選項關閉或模式包含大寫字元。
'tagcase' 為 "match"
'tagcase' 為 "smart",且模式包含大寫字元。
當以下情況發生時,會找到不區分大小寫的匹配項
使用模式 (以 "/" 開頭)
對於「:tselect」
'tagcase' 為 "followic" 且 'ignorecase' 開啟時
'tagcase' 為 "followscs" 且 'ignorecase' 開啟或 'smartcase' 選項開啟,且模式不包含大寫字元時
'tagcase' 為 "ignore" 時
'tagcase' 為 "smart" 且模式不包含大寫字元時
請注意,使用不區分大小寫的標籤搜尋會停用標籤檔案中的二元搜尋,這會導致速度變慢。這可以透過折疊大小寫排序標籤檔案來避免。有關說明,請參閱 'tagbsearch' 選項。

2. 標籤堆疊 tag-stack tagstack E425

標籤堆疊會記住您跳轉到哪些標籤,以及從何處跳轉。只有在設定 'tagstack' 選項時,才會將標籤推入堆疊。
g<右滑鼠鍵> g<RightMouse>
<C-右滑鼠鍵> <C-RightMouse> CTRL-T CTRL-T 跳至標籤堆疊中第 [count] 個較舊的項目 (預設值為 1)。
:po :pop E555 E556 :[count]po[p][!] 跳至標籤堆疊中第 [count] 個較舊的項目 (預設值為 1)。有關 [!],請參閱 tag-!
:[count]ta[g][!] 跳至標籤堆疊中第 [count] 個較新的項目 (預設值為 1)。有關 [!],請參閱 tag-!
:tags
:tags 顯示標籤堆疊的內容。活動項目會以 '>' 標記。
「:tags」的輸出如下
# TO tag FROM line in file/text 1 1 main 1 harddisk2:text/vim/test > 2 2 FuncA 58 i = FuncA(10); 3 1 FuncC 357 harddisk2:text/vim/src/amiga.c
此清單顯示您跳轉到的標籤以及該跳轉之前的游標位置。較舊的標籤位於頂部,較新的標籤位於底部。
'>' 指向活動項目。這是下一個「:tag」命令將使用的標籤。CTRL-T 和「:pop」命令將使用活動項目上方的位置。
在「TO」下方是比對清單中目前比對的數字。請注意,在使用「:pop」或「:tag」時,此數字不會變更。
會記住行號和檔案名稱,以便能夠返回標籤命令之前的所在位置。即使刪除/插入行,行號也會是正確的,除非此操作是由另一個程式執行 (例如另一個 Vim 執行個體)。
對於目前的檔案,「file/text」欄會顯示該位置的文字。會移除縮排,並將長行截斷以符合視窗大小。
您可以使用多個命令跳至先前使用的標籤。以下是一些範例
「:pop」或 CTRL-T 以定位於前一個標籤之前 {count}CTRL-T 以定位於 {count} 個較舊的標籤之前 「:tag」以定位於較新的標籤 「:0tag」以定位於上次使用的標籤
使用此功能的明顯方式是在瀏覽程式的呼叫圖時。請考慮以下呼叫圖
main ---> FuncA ---> FuncC ---> FuncB
(說明:main 呼叫 FuncA 和 FuncB;FuncA 呼叫 FuncC)。您可以使用在 FuncA 的呼叫上使用 CTRL-] 從 main 移至 FuncA。然後,您可以使用 CTRL-] 移至 FuncC。如果您現在想返回 main,您可以使用 CTRL-T 兩次。然後,您可以使用 CTRL-] 移至 FuncB。
如果您發出「:ta {name}」或 CTRL-] 命令,則此標籤會插入堆疊中的目前位置。如果堆疊已滿 (最多可容納 20 個項目),則會刪除最舊的項目,並且較舊的項目會向上移動一個位置 (其索引號會減 1)。如果上次使用的項目不在底部,則會刪除上次使用項目下方的項目。這表示呼叫圖中的舊分支會遺失。執行上述命令後,標籤堆疊將如下所示
# TO tag FROM line in file/text 1 1 main 1 harddisk2:text/vim/test 2 1 FuncB 59 harddisk2:text/vim/src/main.c
gettagstack() 函數會傳回指定視窗的標籤堆疊。settagstack() 函數會修改視窗的標籤堆疊。
tagstack-examples
以與 :tag 相同的方式寫入標籤堆疊,但使用使用者定義的跳轉器 #jump_to_tag 函數
" Store where we're jumping from before we jump.
let tag = expand('<cword>')
let pos = [bufnr()] + getcurpos()[1:]
let item = {'bufnr': pos[0], 'from': pos, 'tagname': tag}
if jumper#jump_to_tag(tag)
        " Jump was successful, write previous location to tag stack.
        let winid = win_getid()
        let stack = gettagstack(winid)
        let stack['items'] = [item]
        call settagstack(winid, stack, 't')
endif
將標籤堆疊的目前索引設定為 4
call settagstack(1005, {'curidx' : 4})
將新項目推入標籤堆疊
let pos = [bufnr('myfile.txt'), 10, 1, 0]
let newtag = [{'tagname' : 'mytag', 'from' : pos}]
call settagstack(2, {'items' : newtag}, 'a')
E73
當您嘗試使用標籤堆疊,但它不包含任何內容時,您將會收到錯誤訊息。

3. 標籤比對清單 tag-matchlist E427 E428

當有多個匹配的標籤時,可以使用這些命令在它們之間跳轉。請注意,這些命令不會變更標籤堆疊,它們會保留相同的項目。
:ts :tselect :ts[elect][!] [name] 列出與 [name] 相符的標籤,使用標籤檔案中的資訊。當未提供 [name] 時,會使用標籤堆疊中的最後一個標籤名稱。有關 [!],請參閱 tag-!。在第一欄中以 '>' 指示清單中的目前位置 (如果有的話)。[name] 可以是正規表示式模式,請參閱 tag-regexp。有關清單中使用的優先順序,請參閱 tag-priority。範例輸出
  # pri kind tag                file
  1 F        f    mch_delay                os_amiga.c
                mch_delay(msec, ignoreinput)
> 2 F        f    mch_delay                os_msdos.c
                mch_delay(msec, ignoreinput)
  3 F        f    mch_delay                os_unix.c
                mch_delay(msec, ignoreinput)
Type number and <Enter> (empty cancels):
有關「pri」欄,請參閱 tag-priority。請注意,這取決於目前的檔案,因此使用「:tselect xxx」可能會產生不同的結果。「kind」欄會提供標籤的種類 (如果此資訊已包含在標籤檔案中)。「info」欄會顯示在標籤檔案中找到的資訊。這取決於產生標籤檔案的程式。當清單很長時,您可能會收到 more-prompt。如果您已經看到您想要使用的標籤,您可以輸入 'q' 並輸入數字。
:sts :stselect :sts[elect][!] [name] 執行「:tselect[!] [name]」,並分割視窗以顯示選取的標籤。
g]
g] 與 CTRL-] 類似,但使用「:tselect」而不是「:tag」。
v_g]
{Visual}g] 與 "g]" 相同,但使用反白文字作為識別符。
:tj :tjump :tj[ump][!] [name] 類似 ":tselect",但當只有一個符合項時,直接跳到標籤。
:stj :stjump :stj[ump][!] [name] 執行 ":tjump[!] [name]" 並分割視窗以顯示選取的標籤。
g_CTRL-]
g CTRL-] 類似 CTRL-],但使用 ":tjump" 而非 ":tag"。
v_g_CTRL-]
{Visual}g CTRL-] 與 "g CTRL-]" 相同,但使用反白文字作為識別符。
:tn :tnext ]t :[count]tn[ext][!] 跳到 [count] 個下一個符合的標籤 (預設為 1)。關於 [!] 請參閱 tag-!
:tp :tprevious [t :[count]tp[revious][!] 跳到 [count] 個前一個符合的標籤 (預設為 1)。關於 [!] 請參閱 tag-!
:tN :tNext :[count]tN[ext][!] 與 ":tprevious" 相同。
:tr :trewind [T :[count]tr[ewind][!] 跳到第一個符合的標籤。如果給定 [count],則跳到第 [count] 個符合的標籤。關於 [!] 請參閱 tag-!
:tf :tfirst :[count]tf[irst][!] 與 ":trewind" 相同。
:tl :tlast ]T :tl[ast][!] 跳到最後一個符合的標籤。關於 [!] 請參閱 tag-!
:lt :ltag :lt[ag][!] [name] 跳到標籤 [name] 並將符合的標籤新增至目前視窗的新位置清單。[name] 可以是正規表示式模式,請參閱 tag-regexp。當未給定 [name] 時,會使用標籤堆疊中的最後一個標籤名稱。用於定位標籤行的搜尋模式會加上 "\V" 字首,以跳脫所有特殊字元 (非常不魔術)。顯示符合標籤的位置清單獨立於標籤堆疊。關於 [!] 請參閱 tag-!
當沒有其他訊息時,Vim 會顯示已跳到哪個符合的標籤,以及符合的標籤數量。
tag 1 of 3 or more
" 或更多" 用於指示 Vim 尚未嘗試所有標籤檔案。多次使用 ":tnext" 或使用 ":tlast" 時,可能會找到更多符合項。
當您因為其他訊息而未看到此訊息,或者您只是想知道您在哪裡時,此命令將再次顯示 (並跳到與上次相同的標籤)。
:0tn
tag-skip-file
當找到符合的標籤,但該檔案不存在時,會跳過此符合項,並使用下一個符合的標籤。Vim 會報告此情況,以通知您缺少檔案。當到達符合項清單的末尾時,會給出錯誤訊息。
tag-preview
標籤符合清單也可以在預覽視窗中使用。命令與上述相同,但會加上 "p" 字首。
:pts :ptselect :pts[elect][!] [name] 執行 ":tselect[!] [name]" 並在「預覽」視窗中顯示新標籤。關於更多資訊,請參閱 :ptag
:ptj :ptjump :ptj[ump][!] [name] 執行 ":tjump[!] [name]" 並在「預覽」視窗中顯示新標籤。關於更多資訊,請參閱 :ptag
:ptn :ptnext ]CTRL-T :[count]ptn[ext][!] 預覽視窗中的 ":tnext"。請參閱 :ptag
:ptp :ptprevious [CTRL-T :[count]ptp[revious][!] 預覽視窗中的 ":tprevious"。請參閱 :ptag
:ptN :ptNext :[count]ptN[ext][!] 與 ":ptprevious" 相同。
:ptr :ptrewind :[count]ptr[ewind][!] 預覽視窗中的 ":trewind"。請參閱 :ptag
:ptf :ptfirst :[count]ptf[irst][!] 與 ":ptrewind" 相同。
:ptl :ptlast :ptl[ast][!] 預覽視窗中的 ":tlast"。請參閱 :ptag

4. 標籤詳細資訊 tag-details

static-tag
靜態標籤是為特定檔案定義的標籤。在 C 程式中,這可能是一個靜態函式。
在 Vi 中,跳到標籤會設定目前的搜尋模式。這表示在跳到標籤後,"n" 命令不會搜尋與跳到標籤前相同的模式。Vim 不會這樣做,因為我們認為這是一個錯誤。如果您真的想要舊的 Vi 行為,請在 'cpoptions' 中設定 't' 旗標。
tag-binary-search
Vim 在標籤檔案中使用二元搜尋來快速找到所需的標籤。但是,這只有在標籤檔案依 ASCII 位元組值排序時才有效。因此,如果未找到符合項,則會使用線性搜尋再次嘗試。如果您只想要線性搜尋,請重設 'tagbsearch' 選項。或者更好:對標籤檔案進行排序!
請注意,當未使用特定名稱尋找標籤時,二元搜尋會停用。當忽略大小寫,且使用的正規表示式不是以固定字串開頭時,就會發生這種情況。屆時標籤搜尋可能會慢很多。前者可以藉由對標籤檔案進行大小寫摺疊排序來避免。關於詳細資訊,請參閱 'tagbsearch'
tag-regexp
":tag" 和 ":tselect" 命令接受正規表示式引數。關於可使用的特殊字元,請參閱 pattern。當引數以 '/' 開頭時,它會被用作模式。如果引數不是以 '/' 開頭,則會以完整標籤名稱的形式逐字採用。範例
:tag main
跳到具有最高優先順序的標籤 "main"。
:tag /^get
跳到以 "get" 開頭且具有最高優先順序的標籤。
:tag /norm
列出包含 "norm" 的所有標籤,包括 "id_norm"。當引數同時以字面意義存在,且以正規表示式使用時符合,則字面符合具有較高的優先順序。例如,":tag /open" 會在 "open_file" 和 "file_open" 之前符合 "open"。使用模式時會忽略大小寫。如果您想要比對大小寫,請在模式中使用 "\C"。
tag-!
如果標籤位於目前檔案中,則此功能將永遠有效。否則,執行的動作取決於目前檔案是否已變更、命令是否已新增 !,以及 'autowrite''winfixbuf' 選項。
檔案中的標籤 winfixbuf autowrite
目前檔案已變更 ! 選項 選項 動作
----------------------------------------------------------------------------- 是 x x 關 x 前往標籤 否 否 x 關 x 讀取其他檔案,前往標籤 否 是 是 關 x 放棄目前檔案,讀取其他檔案,前往標籤 否 是 否 關 開 寫入目前檔案,讀取其他檔案,前往標籤 否 是 否 關 關 失敗 是 x 是 x x 前往標籤 否 否 否 開 x 失敗 否 是 否 開 x 失敗 否 是 否 開 開 失敗 否 是 否 開 關 失敗 -----------------------------------------------------------------------------
如果標籤位於目前檔案中,則命令將永遠有效。
如果標籤位於另一個檔案中,且目前檔案未變更,則另一個檔案將成為目前檔案並讀入緩衝區。
如果標籤位於另一個檔案中,目前檔案已變更,且命令中新增了 !,則目前檔案的變更會遺失,另一個檔案將成為目前檔案並讀入緩衝區。
如果標籤位於另一個檔案中,目前檔案已變更,且 'autowrite' 選項開啟,則會寫入目前檔案,另一個檔案將成為目前檔案並讀入緩衝區。
如果標籤位於另一個檔案中,目前檔案已變更,且 'autowrite' 選項關閉,則命令將會失敗。如果您想要儲存變更,請使用 ":w" 命令,然後使用不含引數的 ":tag"。之所以有效是因為標籤無論如何都會放置在堆疊上。如果您想要遺失變更,則可以使用 ":tag!" 命令。
如果標籤位於另一個檔案中,且視窗包含 'winfixbuf',則命令將會失敗。如果標籤位於相同檔案中,則可能會成功。
tag-security
請注意,Vim 基於安全性考量,會禁止某些命令。這就像在目前目錄中使用 exrc/vimrc 檔案的 'secure' 選項一樣。請參閱 trojan-horsesandbox。當 {tagaddress} 變更緩衝區時,您會收到警告訊息:「警告:標籤命令已變更緩衝區!!!」在未來版本中,變更緩衝區將會是不可能的。所有這些都是為了安全性考量:有人可能會在標籤檔案中隱藏惡意命令,否則這將會被忽略。範例
:$d|/tag-function-name/
在 Vi 中,當搜尋標籤時,":tag" 命令會設定最後的搜尋模式。在 Vim 中,這不會執行,除非 'cpoptions' 中存在 't' 旗標,否則會記住先前的搜尋模式。
tags-option
'tags' 選項是檔案名稱的清單。會在這些檔案中搜尋標籤。這可以用於使用與預設檔案 "tags" 不同的標籤檔案。它也可以用來存取共用的標籤檔案。
當發生下列情況時,不會使用清單中的下一個檔案
已找到目前緩衝區的符合靜態標籤。
已找到符合的全域標籤。這也取決於是否忽略大小寫。當發生下列情況時,會忽略大小寫
'tagcase' 為 "followic" 且設定了 'ignorecase'
'tagcase' 為 "ignore"。
'tagcase' 為 "smart" 且模式僅包含小寫字元。
'tagcase' 為 "followscs" 且設定了 'smartcase',且模式僅包含小寫字元。如果未忽略大小寫,且標籤檔案只有一個不符合大小寫的符合項,則會搜尋下一個標籤檔案以尋找符合大小寫的符合項。如果找不到符合大小寫的標籤,則會使用第一個不符合大小寫的符合項。如果忽略大小寫,且找到符合的 (無論是否符合大小寫) 全域標籤,則會使用這個標籤,且不會搜尋其他標籤檔案。
當標籤檔名稱以「./」開頭時,「.」會被替換為當前檔案的路徑。這樣一來,無論當前目錄為何,都能在當前檔案所在的目錄中使用標籤檔。使用「./」的想法是,您可以定義哪個標籤檔優先被搜尋:在當前目錄(「tags,./tags」)或在當前檔案的目錄(「./tags,tags」)。
例如:
:set tags=./tags,tags,/home/user/commontags
在這個例子中,標籤會先在當前檔案所在目錄的「tags」檔案中搜尋。接著搜尋當前目錄中的「tags」檔案。如果在那裡找不到,則會在「/home/user/commontags」檔案中搜尋標籤。
這可以透過在 'cpoptions' 中包含 'd' 旗標來關閉,使其與 Vi 相容。這樣「./tags」將會是當前目錄中的標籤檔,而不是當前檔案所在目錄中的標籤檔。
除了逗號之外,也可以使用空格。那麼,必須使用反斜線來使空格包含在字串選項中。
:set tags=tags\ /home/user/commontags
若要在檔案名稱中包含空格,請使用三個反斜線。若要在檔案名稱中包含逗號,請使用兩個反斜線。例如,使用
:set tags=tag\\\ file,/home/user/common\\,tags
代表檔案「tag file」和「/home/user/common,tags」。'tags' 選項的值將會是「tag\ file,/home/user/common\,tags」。
如果 'tagrelative' 選項開啟(預設為開啟),並且使用另一個目錄中的標籤檔,則該標籤檔中的檔案名稱將相對於該標籤檔所在的目錄。

5. 標籤檔格式 tags-file-format E431

ctags jtags 標籤檔可以使用外部命令建立,例如「ctags」。它會包含每個函式的標籤。「ctags」的某些版本也會為每個「#defined」巨集、typedefs、列舉等建立標籤。
一些產生標籤檔的程式:ctags 大部分 Unix 系統上都有。僅支援 C 語言。只執行基本工作。universal ctags 根據 exuberant ctags 維護的 ctags 版本。請參閱 https://ctags.ioExuberant_ctags
exuberant ctags 適用於 C、C++、Java、Fortran、Eiffel 等。請參閱 https://ctags.sourceforge.net。自 2009 年以來沒有新版本。JTags 適用於 Java,以 Java 編寫。可以在 https://www.fleiner.com/jtags/ 找到。ptags.py 適用於 Python,以 Python 編寫。可在您的 Python 原始碼目錄的 Tools/scripts/ptags.py 中找到。
標籤檔中的行必須具有以下兩種格式之一
1. {tagname} {TAB} {tagfile} {TAB} {tagaddress} 2. {tagname} {TAB} {tagfile} {TAB} {tagaddress} {term} {field} ..
先前支援舊格式,請參閱 tag-old-static
第一種格式是標準標籤,與 Vi 完全相容。它是傳統 ctags 實作產生的唯一格式。這通常用於全域函式,也參照於其他檔案。
標籤檔中的行可以 <NL><CR><NL> 結尾。在 Macintosh 上,<CR> 也有效。<CR><NL> 字元永遠不會出現在一行內。
第二種格式是新的。它在每行結尾的可選欄位中包含額外資訊。它與 Vi 向後相容。它僅受新版本的 ctags(例如 Universal ctags 或 Exuberant ctags)支援。
{tagname} 識別符號。通常是函式名稱,但它可以是任何識別符號。它不能包含 <Tab>{TAB} 一個 <Tab> 字元。注意:先前的版本允許這裡使用任何空白。為了允許在 {tagfile} 中使用空格,此功能已被放棄。 {tagfile} 包含 {tagname} 定義的檔案。它可以具有絕對或相對路徑。它可能包含環境變數和萬用字元(儘管萬用字元的使用是可疑的)。它不能包含 <Tab>{tagaddress} 將游標定位在標籤上的 Ex 命令。它可以是任何 Ex 命令,儘管有一些限制(請參閱 tag-security)。Posix 只允許行號和搜尋命令,它們大多被使用。 {term} ;" 分號和雙引號這兩個字元。Vi 會將其解讀為註解的開頭,這會使後續內容被忽略。這是為了與 Vi 向後相容,它會忽略後續的欄位。例如:
APP        file        /^static int APP;$/;"        v
{tagaddress} 不是行號或搜尋模式時,則 {term} 必須為 |;"。這裡的豎線會結束命令(不包含豎線),而 ;" 用於讓 Vi 忽略行的其餘部分。例如:
APP        file.c        call cursor(3, 4)|;"        v
{field} .. 可選欄位的清單。每個欄位都具有以下形式:
<Tab>{fieldname}:{value}
{fieldname} 識別欄位,並且只能包含字母字元 [a-zA-Z]。{value} 是任何字串,但不能包含 <Tab>。以下字元具有特殊含義:「\t」代表 <Tab>、「\r」代表 <CR>、「\n」代表 <NL>、「\\」代表單個「\」字元。
有一個欄位沒有「:」。這是標籤的種類。它被視為前面帶有「kind:」。在上面的例子中,它是「kind:v」(通常是變數)。請參閱 ctags 的文件,以了解它產生的種類,使用 ctags 您可以使用 ctags --list-kinds
Vim 目前識別的唯一其他欄位是「file:」(值為空)。它用於靜態標籤。
標籤檔中的第一行可以包含以 !_TAG_ 開頭的行。這些行會排序到最前面,只有少數以「!」開頭的標籤可以排序到它們之前。Vim 會識別兩個項目。第一個項目是指出檔案是否已排序的行。當找到此行時,Vim 會對標籤檔使用二元搜尋。
!_TAG_FILE_SORTED<Tab>1<Tab>{任何內容}
標籤檔可以按大小寫折疊排序,以避免在忽略大小寫時進行線性搜尋。(當設定 'ignorecase''tagcase' 為「followic」,或者當 'tagcase' 為「ignore」時,會忽略大小寫。)請參閱 'tagbsearch' 以了解詳細資訊。此時應使用值「2」。
!_TAG_FILE_SORTED<Tab>2<Tab>{任何內容}
Vim 識別的另一個標籤是標籤檔的編碼。
!_TAG_FILE_ENCODING<Tab>utf-8<Tab>{任何內容}
這裡,「utf-8」是標籤使用的編碼。然後 Vim 會將正在搜尋的標籤從 'encoding' 轉換為標籤檔的編碼。而在列出標籤時,則會反向轉換。當轉換失敗時,會使用未轉換的標籤。
標籤搜尋
該命令可以是任何 Ex 命令,但通常是搜尋命令。例如:
tag1 file1 /^main(argc, argv)/
tag2 file2 108
命令始終在未設定 'magic' 的情況下執行。搜尋模式中唯一的特殊字元是「^」(行首)和「$」(<EOL>)。請參閱 pattern。請注意,您必須在搜尋文字中的每個反斜線之前加上反斜線。這是為了與 Vi 向後相容。
E434 E435 如果命令是普通的搜尋命令(以「/」或「?」開頭和結尾),則會進行一些特殊處理。
搜尋從檔案的第一行開始。搜尋方向,「/」為向前,「?」為向後。請注意,'wrapscan' 無關緊要,始終會搜尋整個檔案。
如果搜尋失敗,則會嘗試忽略大小寫再次搜尋。如果還是失敗,則會搜尋
"^tagname[ \t]*("
(在標籤前面加上「^」並附加「[ \t]*(")。當使用函式名稱時,這會在函式名稱位於第 0 欄時找到該函式名稱。這會在自建立標籤檔以來函式的引數發生變更時有所幫助。如果此搜尋也失敗,則會使用
"^[#a-zA-Z_].*\<tagname[ \t]*("
這表示:以「#」或識別符號開頭,並包含標籤,後跟空白和「(」的行。這會找到巨集名稱和前面帶有類型名稱的函式名稱。
tag-old-static
直到 2019 年 3 月(修補程式 8.1.1092),還支援過時的格式:{tagfile}:{tagname} {TAB} {tagfile} {TAB} {tagaddress}
此格式僅適用於靜態標籤。它現在已經過時,已被第二種格式取代。它僅受 Elvis 1.x、較舊的 Vim 版本和少數 ctags 版本支援。靜態標籤通常用於僅在本檔案 {tagfile} 中參照的局部函式。請注意,對於靜態標籤,{tagfile} 的兩個實例必須完全相同。另請參閱下方的 tags-option,以了解如何使用靜態標籤。
由於當您可以更新到新的 Vim 版本時,也應該能夠將 ctags 更新為支援第二種格式的版本,因此已移除此支援。
這些命令會在目前檔案和所有遇到的包含檔案(遞迴)中搜尋字串。這可以用來尋找變數、函式或巨集的定義。如果您只想在目前的緩衝區中搜尋,請使用 pattern-searches 列出的命令。
當遇到包含另一個檔案的行時,會先搜尋該檔案,然後再繼續搜尋目前的緩衝區。也會搜尋包含檔案所包含的檔案。當找不到包含檔案時,會以靜默方式忽略它。請使用 :checkpath 命令來探索哪些檔案無法找到,可能是您的 'path' 選項未正確設定。注意:會搜尋包含檔案,而不是可能正在編輯該檔案的緩衝區。只有對於目前的檔案,才會使用緩衝區中的行。
字串可以是任何關鍵字或已定義的巨集。對於關鍵字,會找到任何相符項。對於已定義的巨集,只會找到與 'define' 選項相符的行。預設值為「^#\s*define」,適用於 C 程式。對於其他語言,您可能需要變更此設定。請參閱 'define',以了解 C++ 的範例。字串不能包含行尾,只會找到行內的相符項。
當找到已定義巨集的相符項時,當某行以反斜線結尾時,會繼續顯示下一行。
以「[」開頭的命令從目前檔案的開頭開始搜尋。以「]」開頭的命令從目前游標位置開始。
'include' 選項用於定義包含另一個檔案的行。預設值為「\^#\s*include」,適用於 C 程式。注意:Vim 不會識別 C 語法,如果 'include' 選項符合「#ifdef/#endif」或註解中的行,它仍然會搜尋該行。'isfname' 選項用於識別符合模式之後的檔案名稱。
'path' 選項用於尋找沒有絕對路徑的包含檔案的目錄。
'comments' 選項用於顯示單行或跳轉到行的命令。它定義可能開始註解的模式。這些行會被搜尋忽略,除非使用 [!]。但有一例外:當行符合模式 "^# *define" 時,它不被視為註解。
如果您想列出符合項,然後選擇一個跳轉,您可以使用映射來為您執行此操作。以下是一個範例:
:map <F4> [I:let nr = input("Which one: ")<Bar>exe "normal " .. nr .. "[\t"<CR>
[i
[i 顯示游標下關鍵字所在的第一行。搜尋從檔案開頭開始。外觀像註解的行會被忽略(請參閱 'comments' 選項)。如果給定計數,則會顯示第 count 個匹配行,且不會忽略註解行。
]i
]i 類似於 "[i",但從目前游標位置開始。
:is :isearch :[range]is[earch][!] [count] [/]pattern[/] 類似於 "[i" 和 "]i",但在 [range] 行中搜尋(預設值:整個檔案)。請參閱 :search-args 以取得 [/] 和 [!] 的說明。
[I
[I 顯示包含游標下關鍵字的所有行。找到的行會顯示檔名和行號。搜尋從檔案開頭開始。
]I
]I 類似於 "[I",但從目前游標位置開始。
:il :ilist :[range]il[ist][!] [/]pattern[/] 類似於 "[I" 和 "]I",但在 [range] 行中搜尋(預設值:整個檔案)。請參閱 :search-args 以取得 [/] 和 [!] 的說明。
[_CTRL-I
[ CTRL-I 跳到包含游標下關鍵字的第一行。搜尋從檔案開頭開始。外觀像註解的行會被忽略(請參閱 'comments' 選項)。如果給定計數,則會跳到第 count 個匹配行,且不會忽略註解行。
]_CTRL-I
] CTRL-I 類似於 "[ CTRL-I",但從目前游標位置開始。
:ij :ijump :[range]ij[ump][!] [count] [/]pattern[/] 類似於 "[ CTRL-I" 和 "] CTRL-I",但在 [range] 行中搜尋(預設值:整個檔案)。請參閱 :search-args 以取得 [/] 和 [!] 的說明。
CTRL-W CTRL-I CTRL-W_CTRL-I CTRL-W_i CTRL-W i 開啟一個新視窗,游標位於包含游標下關鍵字的第一行。搜尋從檔案開頭開始。外觀像註解的行會被忽略(請參閱 'comments' 選項)。如果給定計數,則會跳到第 count 個匹配行,且不會忽略註解行。
:isp :isplit :[range]isp[lit][!] [count] [/]pattern[/] 類似於 "CTRL-W i" 和 "CTRL-W i",但在 [range] 行中搜尋(預設值:整個檔案)。請參閱 :search-args 以取得 [/] 和 [!] 的說明。
[d
[d 顯示包含游標下巨集的第一個巨集定義。搜尋從檔案開頭開始。如果給定計數,則會顯示第 count 個匹配行。
[d-default
預設跳到目前緩衝區中的前一個診斷。 vim.diagnostic.jump() 預設對應
]d
]d 類似於 "[d",但從目前游標位置開始。
]d-default
預設跳到目前緩衝區中的下一個診斷。 vim.diagnostic.jump() 預設對應
:ds :dsearch :[range]ds[earch][!] [count] [/]string[/] 類似於 "[d" 和 "]d",但在 [range] 行中搜尋(預設值:整個檔案)。請參閱 :search-args 以取得 [/] 和 [!] 的說明。
[D
[D 顯示包含游標下巨集的所有巨集定義。找到的行會顯示檔名和行號。搜尋從檔案開頭開始。
[D-default
預設跳到目前緩衝區中的第一個診斷。 vim.diagnostic.jump() 預設對應
]D
]D 類似於 "[D",但從目前游標位置開始。
]D-default
預設跳到目前緩衝區中的最後一個診斷。 vim.diagnostic.jump() 預設對應
:dli :dlist :[range]dli[st][!] [/]string[/] 類似於 [D]D,但在 [range] 行中搜尋(預設值:整個檔案)。請參閱 :search-args 以取得 [/] 和 [!] 的說明。請注意,:dl 的作用類似於帶有 "l" 旗標的 :delete,而非 :dlist
[_CTRL-D
[ CTRL-D 跳到包含游標下關鍵字的第一個巨集定義。搜尋從檔案開頭開始。如果給定計數,則會跳到第 count 個匹配行。
]_CTRL-D
] CTRL-D 類似於 "[ CTRL-D",但從目前游標位置開始。
:dj :djump :[range]dj[ump][!] [count] [/]string[/] 類似於 "[ CTRL-D" 和 "] CTRL-D",但在 [range] 行中搜尋(預設值:整個檔案)。請參閱 :search-args 以取得 [/] 和 [!] 的說明。
CTRL-W CTRL-D CTRL-W_CTRL-D CTRL-W_d CTRL-W d 開啟一個新視窗,游標位於包含游標下關鍵字的第一個巨集定義行。搜尋從檔案開頭開始。如果給定計數,則會跳到第 count 個匹配行。
:dsp :dsplit :[range]dsp[lit][!] [count] [/]string[/] 類似於 "CTRL-W d",但在 [range] 行中搜尋(預設值:整個檔案)。請參閱 :search-args 以取得 [/] 和 [!] 的說明。
:checkp :checkpath :checkp[ath] 列出所有找不到的包含檔案。
:checkp[ath]! 列出所有包含檔案。
:search-args
上述命令的常見引數:[!] 如果包含,則會在識別為註解的行中尋找匹配項。如果排除,當該行被識別為註解時(根據 'comments'),或當匹配項位於 C 註解中(在 "//" 之後或在 /* */ 內),則會忽略匹配項。請注意,如果一行被識別為註解,但註解在該行中間結束,則可能會錯過匹配項。而且,如果該行是註解,但未被識別(根據 'comments'),則無論如何都可能在其中找到匹配項。範例
/* comment
   foobar */
找到 "foobar" 的匹配項,因為此行未被識別為註解(即使語法高亮顯示會識別)。 注意:由於巨集定義大多看起來不像註解,因此 [!] 對於 ":dlist"、":dsearch" 和 ":djump" 沒有區別。[/] 模式可以用 "/" 包圍。如果沒有 "/",則只會匹配整個單字,使用模式 "\<pattern\>"。只有在第二個 "/" 之後,才能用 "|" 追加下一個命令。範例
:isearch /string/ | echo "the last one"
對於 ":djump"、":dsplit"、":dlist" 和 ":dsearch" 命令,模式會用作文字字串,而不是搜尋模式。
可以為 Vim 提供一個函式,該函式將產生用於 :tag:tselect 和普通模式標籤命令(例如 CTRL-])的標籤清單。
用於產生標籤清單的函式由設定 'tagfunc' 選項來指定。將使用三個引數呼叫該函式:pattern 在標籤搜尋期間使用的標籤識別碼或模式。flags 包含控制函式行為的旗標的字串。info 包含以下項目的字典:buf_ffname 可用於優先順序的完整檔名。user_data 自訂資料字串,如果之前由 tagfunc 儲存在標籤堆疊中。
請注意,使用時需要在引數名稱前面加上 "a:"。
目前最多可以將三個旗標傳遞給標籤函式:'c' 該函式由正在處理的普通命令呼叫(助記符:標籤函式可以使用游標周圍的內容來更好地產生標籤清單)。'i' 在插入模式下,使用者正在完成標籤(使用 i_CTRL-X_CTRL-]'completeopt' 包含 t)。'r' tagfunc 的第一個引數應解釋為 模式(請參閱 tag-regexp),例如在使用時
:tag /pat
在插入模式下完成時也會給定。如果沒有此旗標,則通常會將引數直接作為完整標籤名稱。
請注意,當設定 'tagfunc' 時,tag-priority 中描述的標籤優先順序不適用。相反,優先順序與函式傳回的清單中元素的順序完全相同。 E987
該函式應傳回字典項目的清單。每個字典都必須至少包含以下項目,並且每個值都必須是字串:name 標籤名稱。filename 定義標籤的檔案名稱。它是相對於目前目錄的路徑或完整路徑。cmd 用於在檔案中尋找標籤的 Ex 命令。這可以是 Ex 搜尋模式或行號。請注意,格式與 taglist() 的格式類似,這使得可以使用它的輸出產生結果。以下欄位是選用的:kind 標籤類型。user_data 儲存在標籤堆疊中的自訂資料字串,可用於區分操作之間的標籤。
如果該函式傳回 v:null 而不是清單,則將改為執行標準標籤查閱。
不允許從 'tagfunc' 內部變更標籤堆疊。 E986 不允許從 'tagfunc' 內部關閉視窗或變更視窗。 E1299
以下是 'tagfunc' 使用的假設函式範例。它使用 taglist() 的輸出產生結果:檔案名稱順序相反的標籤清單。
function TagFunc(pattern, flags, info)
  function CompareFilenames(item1, item2)
    let f1 = a:item1['filename']
    let f2 = a:item2['filename']
    return f1 >=# f2 ?
                \ -1 : f1 <=# f2 ? 1 : 0
  endfunction
  let result = taglist(a:pattern)
  call sort(result, "CompareFilenames")
  return result
endfunc
set tagfunc=TagFunc
主要
命令索引
快速參考