Usr_27

Nvim 的 :help 頁面,由 產生,使用 tree-sitter-vimdoc 解析器,來源為 原始碼


VIM 使用者手冊 - 作者:Bram Moolenaar
搜尋指令與模式
在第 3 章中提到了幾個簡單的搜尋模式 03.9。Vim 可以執行更複雜的搜尋。本章將說明最常用的搜尋模式。詳細規格請參考:pattern
27.1 忽略大小寫 27.2 繞回檔案結尾 27.3 偏移量 27.4 比對多次 27.5 替代方案 27.6 字元範圍 27.7 字元類別 27.8 比對換行符號 27.9 範例
下一章:usr_28.txt 折疊 前一章:usr_26.txt 重複 目錄:usr_toc.txt

忽略大小寫

預設情況下,Vim 的搜尋會區分大小寫。因此,「include」、「INCLUDE」和「Include」是三個不同的單字,搜尋只會比對其中一個。現在開啟 'ignorecase' 選項
:set ignorecase
再次搜尋「include」,現在它會比對「Include」、「INCLUDE」和「InClUDe」。(設定 'hlsearch' 選項可快速查看模式比對的位置。) 您可以使用以下指令再次關閉此功能
:set noignorecase
但讓我們保持開啟,並搜尋「INCLUDE」。它會比對與「include」完全相同的文字。現在設定 'smartcase' 選項
:set ignorecase smartcase
如果您的模式中至少有一個大寫字元,搜尋會變為區分大小寫。這個想法是您不必輸入大寫字元,因此您必須這樣做是因為您想要比對大小寫。這很聰明!設定這兩個選項後,您會找到以下比對結果
模式 比對結果
word word、Word、WORD、WoRd 等 Word Word WORD WORD WoRd WoRd

在一個模式中區分大小寫

如果您想針對一個特定模式忽略大小寫,您可以在前面加上「\c」字串。使用「\C」會使模式區分大小寫。當使用「\c」或「\C」時,這會覆蓋 'ignorecase''smartcase' 選項,它們的值並不重要。
模式 比對結果
\Cword word \CWord Word \cword word、Word、WORD、WoRd 等 \cWord word、Word、WORD、WoRd 等
使用「\c」和「\C」的一大優點是它會與模式保持一致。因此,如果您從搜尋歷史記錄中重複一個模式,無論 'ignorecase''smartcase' 是否已變更,都會發生相同的情況。
注意:在搜尋模式中使用「\」項目取決於 'magic' 選項。在本章中,我們假設 'magic' 已開啟,因為這是標準且建議的設定。如果您變更 'magic',許多搜尋模式會突然失效。
注意:如果您的搜尋時間比預期的長得多,您可以在 Unix 上使用 CTRL-C 和在 MS-Windows 上使用 CTRL-Break 來中斷它。

27.2 繞回檔案結尾

預設情況下,正向搜尋會從目前的游標位置開始搜尋給定的字串。然後它會繼續到檔案結尾。如果在那時沒有找到字串,它會從頭開始,從檔案開頭搜尋到游標位置。請記住,當重複使用「n」指令來搜尋下一個比對時,您最終會回到第一個比對。如果您沒有注意到這一點,您會一直搜尋下去!為了給您一個提示,Vim 會顯示此訊息
搜尋到達底部,從頂部繼續
如果您使用「?」指令向其他方向搜尋,您會收到此訊息
搜尋到達頂部,從底部繼續
不過,您仍然不知道何時會回到第一個比對。查看此狀況的一種方法是開啟 'ruler' 選項
:set ruler
Vim 會在視窗的右下角 (如果有的話,則在狀態列) 顯示游標位置。它看起來像這樣
101,29 84%
第一個數字是游標的行號。記住您開始的行號,以便您可以檢查是否再次經過此位置。

不繞回

若要關閉搜尋繞回,請使用以下指令
:set nowrapscan
現在,當搜尋到達檔案結尾時,會顯示錯誤訊息
E385:搜尋到達底部,沒有比對到:forever
因此,您可以透過使用「gg」跳到檔案開頭,並持續搜尋直到看到此訊息來找到所有比對。如果您使用「?」向其他方向搜尋,您會收到
E384:搜尋到達頂部,沒有比對到:forever

27.3 偏移量

預設情況下,搜尋指令會將游標定位在模式的開頭。您可以透過指定偏移量來告訴 Vim 將游標停留在其他位置。對於正向搜尋指令「/」,偏移量會透過附加斜線 (/) 和偏移量來指定
/default/2
此指令會搜尋模式「default」,然後移動到模式後第二行的開頭。在上面的段落中使用此指令時,Vim 會在第一行中找到單字「default」。然後,游標會向下移動兩行,並停在「an offset」上。
如果偏移量是一個簡單的數字,游標會放置在與比對位置相距多行的行開頭。偏移量數字可以是正數或負數。如果是正數,游標會向下移動多行;如果是負數,則向上移動。

字元偏移量

「e」偏移量表示與比對結尾的偏移量。它會將游標移動到比對的最後一個字元。指令
/const/e
會將游標放在「const」的「t」上。從該位置開始,加上一個數字會向前移動多個字元。此指令會移動到比對後面的字元
/const/e+1
正數會將游標向右移動,負數會將游標向左移動。例如
/const/e-1
會將游標移動到「const」的「s」上。
如果偏移量以「b」開頭,則游標會移動到模式的開頭。這不是很有用,因為省略「b」也會執行相同的動作。當新增或減去數字時,它會變得有用。然後,游標會向前或向後移動多個字元。例如
/const/b+2
將游標移動到比對的開頭,然後向右移動兩個字元。因此,它會停在「n」上。

重複

若要重複搜尋先前使用的搜尋模式,但使用不同的偏移量,請省略模式
/that
//e
等於
/that/e
若要使用相同的偏移量重複
/
「n」執行相同的動作。若要在移除先前使用的偏移量的同時重複
//

向後搜尋

「?」指令以相同方式使用偏移量,但您必須使用「?」來分隔模式中的偏移量,而不是「/」
?const?e-2
「b」和「e」保持其含義,它們不會隨著使用「?」而改變方向。

開始位置

開始搜尋時,通常會從游標位置開始。當您指定行偏移量時,可能會造成麻煩。例如
/const/-2
這會找到下一個單字「const」,然後向上移動兩行。如果您使用「n」再次搜尋,Vim 可以從目前位置開始並找到相同的「const」比對。然後再次使用偏移量,您會回到您開始的位置。您會卡住!可能會更糟:假設下一行還有另一個「const」的比對。然後,重複正向搜尋會找到此比對並向上移動兩行。因此,您實際上會將游標向後移動!
當您指定字元偏移量時,Vim 會對其進行補償。因此,搜尋會向前或向後移動幾個字元開始,因此不會再次找到相同的比對。

27.4 比對多次

「*」項目指定它前面的項目可以比對任意次數。因此
/a*
會比對「a」、「aa」、「aaa」等。但也包括「」(空字串),因為其中包含零次。「*」僅適用於它前面的項目。因此,「ab*」會比對「a」、「ab」、「abb」、「abbb」等。若要比對整個字串多次,必須將其分組為一個項目。這是透過在其前面加上「\ (」並在其後面加上「\ )」來完成的。因此,此指令
/\(ab\)*
比對:「ab」、「abab」、「ababab」等。也包括「」。
若要避免比對空字串,請使用「\+」。這會使前一個項目比對一次或多次。
/ab\+
比對「ab」、「abb」、「abbb」等。當沒有「b」跟隨時,它不會比對「a」。
若要比對一個可選項目,請使用「\=」。範例
/folders\=
比對「folder」和「folders」。

特定計數

若要比對特定數量的項目,請使用「\{n,m}」形式。「n」和「m」是數字。它前面的項目將比對「n」到「m」次 包含。範例
/ab\{3,5}
比對「abbb」、「abbbb」和「abbbbb」。當省略「n」時,預設為零。當省略「m」時,預設為無限大。當省略「,m」時,它會精確比對「n」次。範例
模式 比對次數
\{,4} 0、1、2、3 或 4 \{3,} 3、4、5 等 \{0,1} 0 或 1,與 \= 相同 \{0,} 0 或更多,與 * 相同 \{1,} 1 或更多,與 \+ 相同 \{3} 3

盡可能比對較少的字元

到目前為止,這些項目會比對它們可以找到的盡可能多的字元。若要比對盡可能少的字元,請使用「\{-n,m}」。它的運作方式與「\{n,m}」相同,除了使用盡可能少的數量。例如,使用
/ab\{-1,3}
會比對「abbb」中的「ab」。實際上,它永遠不會比對一個以上的 b,因為沒有理由比對更多。它需要其他東西來強制它比對超過下限。相同的規則適用於移除「n」和「m」。甚至可以移除這兩個數字,導致「\{-}」。這會比對它前面的項目零次或多次,並盡可能減少次數。項目本身總是比對零次。當與其他東西結合使用時,它會很有用。範例
/a.\{-}b
這會比對「axbxb」中的「axb」。如果使用此模式
/a.*b
它會嘗試使用「.*」比對盡可能多的字元,因此它會將「axbxb」作為一個整體進行比對。

27.5 替代方案

模式中的「or」運算符是「\|」。範例
/foo\|bar
這會比對「foo」或「bar」。可以串聯更多的替代方案
/one\|two\|three
比對「one」、「two」和「three」。若要比對多次,必須將整個內容放在「\ (」和「\ )」中
/\(foo\|bar\)\+
這會比對「foo」、「foobar」、「foofoo」、「barfoobar」等。另一個範例
/end\(if\|while\|for\)
這會比對「endif」、「endwhile」和「endfor」。
一個相關的項目是「\&」。這要求兩個替代方案在相同位置進行比對。結果比對會使用最後一個替代方案。範例
/forever\&...
這會比對「forever」中的「for」。例如,它不會比對「fortuin」。

27.6 字元範圍

若要比對「a」、「b」或「c」,您可以使用「/a\|b\|c」。當您想要比對從「a」到「z」的所有字母時,這會變得非常長。有一個更短的方法
/[a-z]
[] 結構會比對單個字元。在內部,您可以指定要比對的字元。您可以包含一個字元清單,如下所示
/[0123456789abcdef]
這會比對任何包含的字元。對於連續字元,您可以指定範圍。「0-3」代表「0123」。「w-z」代表「wxyz」。因此,與上述相同的指令可以縮短為
/[0-9a-f]
若要匹配連字號 "-" 字元本身,請將其放在範圍中的第一個或最後一個位置。這些特殊字元被接受,以便在 [] 範圍內更容易使用它們(實際上它們可以被用於搜尋模式中的任何位置)
\e <Esc> \t <Tab> \r <CR> \b <BS>
關於 [] 範圍還有一些更特殊的例子,請參閱 /[] 以了解完整資訊。

補集範圍

若要避免匹配特定字元,請在範圍開頭使用 "^"。[] 項目接著會匹配除了包含的字元之外的所有內容。範例
/"[^"]*"
" 一個雙引號 [^"] 任何不是雙引號的字元 * 盡可能多次 " 再一個雙引號
這會匹配 "foo" 和 "3!x",包括雙引號。

預定義範圍

許多範圍經常被使用。Vim 為這些提供了一個快捷方式。例如
/\a
尋找字母字元。這等同於使用 "/[a-zA-Z]"。以下是一些其他的例子
項目 | 匹配 | 等效項
\d | 數字 | [0-9] | \D | 非數字 | [^0-9] | \x | 十六進位數字 | [0-9a-fA-F] | \X | 非十六進位數字 | [^0-9a-fA-F] | \s | 空白字元 | [ ] (<Tab><Space>) | \S | 非空白字元 | [^ ] (非 <Tab><Space>) | \l | 小寫字母 | [a-z] | \L | 非小寫字母 | [^a-z] | \u | 大寫字母 | [A-Z] | \U | 非大寫字母 | [^A-Z]
注意:使用這些預定義範圍比使用它們所代表的字元範圍快得多。這些項目不能在 [] 內使用。因此,"[\d\l]" 無法匹配數字或小寫字母。請改用 "\(\d\|\l\)"。
請參閱 /\s 以取得這些範圍的完整列表。

27.7 字元類別

字元範圍匹配一組固定的字元。字元類別與此類似,但有一個重要的區別:字元的集合可以在不更改搜尋模式的情況下重新定義。例如,搜尋此模式
/\f\+
"\f" 項目代表檔案名稱字元。因此,這會匹配一個可以是檔案名稱的字元序列。哪些字元可以作為檔案名稱的一部分取決於您使用的系統。在 MS-Windows 上,包含反斜線,而在 Unix 上則不包含。這是使用 'isfname' 選項指定的。Unix 的預設值為
:set isfname
isfname=@,48-57,/,.,-,_,+,,,#,$,%,~,=
對於其他系統,預設值會有所不同。因此,您可以使用 "\f" 來建立一個匹配檔案名稱的搜尋模式,並且它會自動調整為您正在使用的系統。
注意:實際上,Unix 允許在檔案名稱中使用幾乎任何字元,包括空白字元。理論上將這些字元包含在 'isfname' 中是正確的。但是,這樣會無法在文字中找到檔案名稱的結尾。因此,'isfname' 的預設值是一種妥協。
字元類別為
項目 | 匹配 | 選項
\i | 識別符號字元 | 'isident' | \I | 類似 \i,但不包括數字 | \k | 關鍵字字元 | 'iskeyword' | \K | 類似 \k,但不包括數字 | \p | 可列印字元 | 'isprint' | \P | 類似 \p,但不包括數字 | \f | 檔案名稱字元 | 'isfname' | \F | 類似 \f,但不包括數字

27.8 匹配換行符號

Vim 可以找到包含換行符號的模式。您需要指定換行符號發生的位置,因為到目前為止提及的所有項目都不匹配換行符號。若要檢查特定位置的換行符號,請使用 "\n" 項目
/one\ntwo
這會匹配以 "one" 結尾的行,且下一行以 "two" 開頭的情況。若要也匹配 "one two",您需要匹配空格或換行符號。要使用的項目是 "\_s"
/one\_stwo
若要允許任何數量的空白字元
/one\_s\+two
當 "one " 在行的結尾,而 " two" 在下一行的開頭時,也會匹配。
"\s" 匹配空白字元,"\_s" 匹配空白字元或換行符號。同樣地,"\a" 匹配字母字元,而 "\_a" 匹配字母字元或換行符號。可以透過插入 "_" 來以相同的方式修改其他字元類別和範圍。
許多其他項目也可以透過在前面加上 "\_" 來匹配換行符號。例如:"\_." 匹配任何字元或換行符號。
注意:"\_.*" 會匹配到檔案結尾的所有內容。使用此方法時請小心,這可能會使搜尋命令變得非常慢。
另一個範例是 "\_[]",一個包含換行符號的字元範圍
/"\_[^"]*"
這會尋找雙引號中的文字,這些文字可能會分割成數行。

27.9 範例

以下是一些您可能會覺得有用的搜尋模式。這說明了如何結合上面提到的項目。
尋找加州車牌
一個範例車牌號碼為 "1MGU103"。它有一個數字、三個大寫字母和三個數字。直接將其放入搜尋模式
/\d\u\u\u\d\d\d
另一種方式是指定有三個數字和字母,並帶有計數
/\d\u\{3}\d\{3}
改用 [] 範圍
/[0-9][A-Z]\{3}[0-9]\{3}
您應該使用哪一種?使用您可以記住的任何一種。您可以記住的簡單方法比您無法記住的複雜方法快得多。如果您可以記住所有方法,則請避免使用最後一種方法,因為它既需要更多輸入,執行速度也更慢。

尋找識別符號

在 C 程式(和許多其他電腦語言)中,識別符號以字母開頭,並進一步由字母和數字組成。也可以使用底線。這可以使用以下方式找到
/\<\h\w*\>
"\<" 和 "\>" 用於只尋找整個單字。"\h" 代表 "[A-Za-z_]",而 "\w" 代表 "[0-9A-Za-z_]"。
注意:"\<" 和 "\>" 取決於 'iskeyword' 選項。例如,如果它包含 "-",則不會匹配 "ident-"。在這種情況下,請使用
/\w\@<!\h\w*\w\@!
這會檢查在識別符號之前或之後是否不匹配 "\w"。請參閱 /\@<!/\@!
下一章:usr_28.txt 折疊
版權:請參閱 manual-copyright vim:tw=78:ts=8:noet:ft=help:norl
主要
命令索引
快速參考