VIM 搜尋命令使用方法和技巧

vimtutor發表於2019-05-05

介紹Vim搜尋命令/?*#,以及Vim正向搜尋和反向搜尋,Vim正規表示式搜尋特定字元和特定行。

一、Vim基本搜尋命令

在Vim命令模式下,輸入 /? 符號就進入了搜尋模式,/ 用於正向往下搜尋,? 用於反向往上搜尋。

在搜尋模式下可以對Vim開啟的整個文字內容進行搜尋,當按下 n 時可以繼續正向查詢下一個相匹配的目前單詞。N 的作用與 n 相反,是往上反向搜尋目標單詞。

在Vim命令模式下,如果要搜尋當前游標下的單詞,除了可以使用/?外,還可以使用特殊命令*#

假設游標當前所有單詞為the,那麼在當前游標位置執行命令 * 相當於搜尋命令 /\<the\>,命令 # 等同於命令 ?\<the\>\< 是一個單詞定界符,表示只匹配單詞的開頭,\> 也是單詞定界符,表示只匹配單詞末尾。關於單詞定界符的更多內容,可以閱讀Vim搜尋字元轉義與very magic搜尋模式

大家可仔細觀看下圖的Vim動畫教程示意
Vim搜尋

注意:搜尋一些特殊的字元,例如:*[]^%/?~$等,需要在它們的前面加上轉義符號\

二、Vim高亮搜尋

為了在Vim中高亮顯示被搜尋的字元,可以使用命令 set hlsearch,可以在Vim命令列模式執行命令或者在配置檔案 .vimrc 中進行永久設定。

如果需要清除最近一次的螢幕搜尋高亮結果,可以在Vim命令列模式使用命令 :nohlsearch 或其縮寫形式 :noh。更多介紹,可參考文章Vim清除上次的搜尋高亮結果-Vim使用技巧(1)

三、搜尋大小寫敏感

預設Vim搜尋命令是大小寫敏感的,因此,搜尋 the 不會查詢到 The。使用命令 :set ignorecase 會使得Vim搜尋變得不區分大小寫。

  • 不管 ignorecase 選項的值是什麼,都可以在搜尋命令中使用 \c 來強制使得當前搜尋模式不區分大小寫,而命令 \C 則會強制當前搜尋模式大小寫敏感。

因此,/the\c 既會查詢 the,也會查詢到 The

如果開啟了 ignorecase 選項,那麼你也應該設定 :set smartcase

  • ignorecasesmartcase 選項均開啟時,只要你的搜尋模式中包含大寫字母,那Vim會認為你當前的搜尋是區分大小寫的,如果搜尋模式中不包含任何大寫字母,Vim則會認為搜尋應該不區分大小寫。這是個比較"智慧的"推測你搜尋意圖的機制。

例如,在開啟上述兩個選項的條件下,/The 只會查詢到 The,而 /the 既會查詢 the,也會查詢到 The等。

注意smartcase 選項只對你手工輸入的搜尋模式有效,對於 *#gd 等是不起作用的。

四、Vim搜尋進階

  • 如果想搜尋當前游標所在位置的單詞,可以先輸入 / 進入搜尋模式,然後依次輸入命令 <Ctrl-r><Ctrl-w> 來複制游標下的單詞並將其插入命令列中。

  • 如果想插入游標下的字串,可以使用命令 <Ctrl-r><Ctrl-a>。關於Vim單詞和字串的概念,可以參考文章Vim單詞、字串概念

  • 完成搜尋後,使用 Ctrl-o 會跳轉到開始進行搜尋的位置,然後使用命令 Ctrl-i 將會往前跳轉。

  • 進行過Vim搜尋後,當 /?:s:g 命令使用空的搜尋模式時會沿用最近一次的搜尋模式。所以,在搜尋完某個單詞後,使用Vim替換命令 :%s//new/g 會將之前搜尋的單詞全部替換為 new。具體可參考Vim替換命令substitute重用上次的查詢模式

  • 在搜尋命令前還可以增加一個整數,用於表示搜尋目標出現的位置。例如,3/pattern 將會搜尋模式 pattern 第三次出現的位置,而 3* 會搜尋當前游標所在位置單詞第三次出現的位置。

  • 搜尋還可以包含一個相對於游標的偏移量,關於搜尋偏移量的更多內容,可以參考文章[Vim搜尋偏移]()介紹。

vim搜尋技巧

五、Vim正規表示式搜尋

為了更好的進行搜尋,Vim支援正規表示式,最基本的正規表示式規則包括:

^         表示一行的開頭
$         表示一行的結尾
.         表示任意一個字元
*         匹配0次或n次

5.1 查詢在行首的特定字元

Vim正規表示式搜尋
上圖中用^來匹配行首

5.2 查詢在行尾的特定字元

Vim正規表示式搜尋
上圖中用$來匹配行尾

5.3 匹配特定行(行首匹配)

Vim正規表示式搜尋
上圖中使用了/^test.*$,其中^表示匹配行首、.*表示匹配任意字元、$表示匹配行尾,合起來表示搜尋任意以test開頭的行。

關於Vim正規表示式搜尋的更多內容,推薦閱讀Vim搜尋字元轉義與very magic搜尋模式

相關文章