原文地址:https://vimjc.com/vim-search.html。感謝原作者
介紹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搜索模式。