Nvim 的 :help
頁面,是從 原始碼 使用 產生 而來的,並透過 tree-sitter-vimdoc 解析器進行解析。
標籤與特殊搜尋
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。
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」命令,將不會找到不區分大小寫的匹配項
當以下情況發生時,會找到不區分大小寫的匹配項
使用模式 (以 "/" 開頭)
對於「:tselect」
請注意,使用不區分大小寫的標籤搜尋會停用標籤檔案中的二元搜尋,這會導致速度變慢。這可以透過折疊大小寫排序標籤檔案來避免。有關說明,請參閱
'tagbsearch' 選項。
標籤堆疊會記住您跳轉到哪些標籤,以及從何處跳轉。只有在設定
'tagstack' 選項時,才會將標籤推入堆疊。
:[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
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 當您嘗試使用標籤堆疊,但它不包含任何內容時,您將會收到錯誤訊息。
當有多個匹配的標籤時,可以使用這些命令在它們之間跳轉。請注意,這些命令不會變更標籤堆疊,它們會保留相同的項目。
: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 :[count]tN[ext][!] 與 ":tprevious" 相同。
:tr :trewind [T :[count]tr[ewind][!] 跳到第一個符合的標籤。如果給定 [count],則跳到第 [count] 個符合的標籤。關於 [!] 請參閱
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 會報告此情況,以通知您缺少檔案。當到達符合項清單的末尾時,會給出錯誤訊息。
:pts :ptselect :pts[elect][!] [name] 執行 ":tselect[!] [name]" 並在「預覽」視窗中顯示新標籤。關於更多資訊,請參閱
:ptag。
:ptj :ptjump :ptj[ump][!] [name] 執行 ":tjump[!] [name]" 並在「預覽」視窗中顯示新標籤。關於更多資訊,請參閱
:ptag。
在 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"。
檔案中的標籤 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-horse 和
sandbox。當
{tagaddress}
變更緩衝區時,您會收到警告訊息:「警告:標籤命令已變更緩衝區!!!」在未來版本中,變更緩衝區將會是不可能的。所有這些都是為了安全性考量:有人可能會在標籤檔案中隱藏惡意命令,否則這將會被忽略。範例
:$d|/tag-function-name/
在 Vi 中,當搜尋標籤時,":tag" 命令會設定最後的搜尋模式。在 Vim 中,這不會執行,除非
'cpoptions' 中存在 't' 旗標,否則會記住先前的搜尋模式。
tags-option 'tags' 選項是檔案名稱的清單。會在這些檔案中搜尋標籤。這可以用於使用與預設檔案 "tags" 不同的標籤檔案。它也可以用來存取共用的標籤檔案。
當發生下列情況時,不會使用清單中的下一個檔案
已找到目前緩衝區的符合靜態標籤。
已找到符合的全域標籤。這也取決於是否忽略大小寫。當發生下列情況時,會忽略大小寫
'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' 選項開啟(預設為開啟),並且使用另一個目錄中的標籤檔,則該標籤檔中的檔案名稱將相對於該標籤檔所在的目錄。
ctags jtags 標籤檔可以使用外部命令建立,例如「ctags」。它會包含每個函式的標籤。「ctags」的某些版本也會為每個「#defined」巨集、typedefs、列舉等建立標籤。
標籤檔中的行必須具有以下兩種格式之一
1. {tagname}
{TAB}
{tagfile}
{TAB}
{tagaddress}
2. {tagname}
{TAB}
{tagfile}
{TAB}
{tagaddress}
{term}
{field}
..
第一種格式是標準標籤,與 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>{任何內容}
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' 選項用於識別符合模式之後的檔案名稱。
'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 以取得 [/] 和 [!] 的說明。
:isp :isplit :[range]isp[lit][!] [count] [/]pattern[/] 類似於 "CTRL-W i" 和 "CTRL-W i",但在 [range] 行中搜尋(預設值:整個檔案)。請參閱
:search-args 以取得 [/] 和 [!] 的說明。
[d [d 顯示包含游標下巨集的第一個巨集定義。搜尋從檔案開頭開始。如果給定計數,則會顯示第 count 個匹配行。
]d ]d 類似於 "[d",但從目前游標位置開始。
:ds :dsearch :[range]ds[earch][!] [count] [/]string[/] 類似於 "[d" 和 "]d",但在 [range] 行中搜尋(預設值:整個檔案)。請參閱
:search-args 以取得 [/] 和 [!] 的說明。
[D [D 顯示包含游標下巨集的所有巨集定義。找到的行會顯示檔名和行號。搜尋從檔案開頭開始。
]D ]D 類似於 "[D",但從目前游標位置開始。
: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[ath]! 列出所有包含檔案。
:search-args 上述命令的常見引數:[!] 如果包含,則會在識別為註解的行中尋找匹配項。如果排除,當該行被識別為註解時(根據
'comments'),或當匹配項位於 C 註解中(在 "//" 之後或在
/* */
內),則會忽略匹配項。請注意,如果一行被識別為註解,但註解在該行中間結束,則可能會錯過匹配項。而且,如果該行是註解,但未被識別(根據
'comments'),則無論如何都可能在其中找到匹配項。範例
/* comment
foobar */
找到 "foobar" 的匹配項,因為此行未被識別為註解(即使語法高亮顯示會識別)。
注意:由於巨集定義大多看起來不像註解,因此 [!] 對於 ":dlist"、":dsearch" 和 ":djump" 沒有區別。[/] 模式可以用 "/" 包圍。如果沒有 "/",則只會匹配整個單字,使用模式 "\<pattern\>"。只有在第二個 "/" 之後,才能用 "|" 追加下一個命令。範例
:isearch /string/ | echo "the last one"
對於 ":djump"、":dsplit"、":dlist" 和 ":dsearch" 命令,模式會用作文字字串,而不是搜尋模式。
用於產生標籤清單的函式由設定
'tagfunc' 選項來指定。將使用三個引數呼叫該函式:pattern 在標籤搜尋期間使用的標籤識別碼或模式。flags 包含控制函式行為的旗標的字串。info 包含以下項目的字典:buf_ffname 可用於優先順序的完整檔名。user_data 自訂資料字串,如果之前由 tagfunc 儲存在標籤堆疊中。
請注意,使用時需要在引數名稱前面加上 "a:"。
在插入模式下完成時也會給定。如果沒有此旗標,則通常會將引數直接作為完整標籤名稱。
請注意,當設定
'tagfunc' 時,
tag-priority 中描述的標籤優先順序不適用。相反,優先順序與函式傳回的清單中元素的順序完全相同。
E987該函式應傳回字典項目的清單。每個字典都必須至少包含以下項目,並且每個值都必須是字串:name 標籤名稱。filename 定義標籤的檔案名稱。它是相對於目前目錄的路徑或完整路徑。cmd 用於在檔案中尋找標籤的 Ex 命令。這可以是 Ex 搜尋模式或行號。請注意,格式與
taglist() 的格式類似,這使得可以使用它的輸出產生結果。以下欄位是選用的:kind 標籤類型。user_data 儲存在標籤堆疊中的自訂資料字串,可用於區分操作之間的標籤。
如果該函式傳回
v:null 而不是清單,則將改為執行標準標籤查閱。
以下是
'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