介紹Vim搜尋命令/
、 ?
、*
和 #
,以及Vim正向搜尋和反向搜尋,Vim正規表示式搜尋特定字元和特定行。
一、Vim基本搜尋命令
在Vim命令模式下,輸入 /
或 ?
符號就進入了搜尋模式,/
用於正向往下搜尋,?
用於反向往上搜尋。
在搜尋模式下可以對Vim開啟的整個文字內容進行搜尋,當按下 n
時可以繼續正向查詢下一個相匹配的目前單詞。N
的作用與 n
相反,是往上反向搜尋目標單詞。
在Vim命令模式下,如果要搜尋當前游標下的單詞,除了可以使用/
和 ?
外,還可以使用特殊命令*
和 #
。
假設游標當前所有單詞為the,那麼在當前游標位置執行命令 *
相當於搜尋命令 /\<the\>
,命令 #
等同於命令 ?\<the\>
。\<
是一個單詞定界符,表示只匹配單詞的開頭,\>
也是單詞定界符,表示只匹配單詞末尾。關於單詞定界符的更多內容,可以閱讀Vim搜尋字元轉義與very magic搜尋模式。
大家可仔細觀看下圖的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
。
- 當
ignorecase
和smartcase
選項均開啟時,只要你的搜尋模式中包含大寫字母,那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支援正規表示式,最基本的正規表示式規則包括:
^
表示一行的開頭$
表示一行的結尾.
表示任意一個字元*
匹配0次或n次
5.1 查詢在行首的特定字元
上圖中用^
來匹配行首
5.2 查詢在行尾的特定字元
上圖中用$
來匹配行尾
5.3 匹配特定行(行首匹配)
上圖中使用了/^test.*$
,其中^
表示匹配行首、.*
表示匹配任意字元、$
表示匹配行尾,合起來表示搜尋任意以test開頭的行。
關於Vim正規表示式搜尋的更多內容,推薦閱讀Vim搜尋字元轉義與very magic搜尋模式。