在插入模式下,為了減少重複的擊鍵輸入,VIM 提供了若干快速鍵,當你要輸入某個上下文曾經輸入過的字串時,你只要輸入開頭若干字元,使用快速鍵,VIM 將搜尋上下文,找到匹配字串,把剩下的字元補全,你就不必敲了。這樣,編程式時你起多長的變數名都沒關係了,:-) 而且還可以減少輸入錯誤。我認為,插入補全是 VIM 最為突出的一項功能。
i<C-P> 向上搜尋,補全一個詞。例如,上文中出現過 filename 這個詞,當你想再輸入 filename 時,只要按 f<C-P> 即可。假如 VIM 向上搜尋,找到以 f 開頭的第一個匹配不是 filename,你可以繼續按 <C-P> 搜尋下一個匹配進行補全。當然,如果你想一次 <C-P> 就成功,你可以多輸入幾個字元比如 filen 再按 <C-P> 補全
i<C-N> 向下搜尋,補全一個詞
i<C-X><C-L> 補全一行。比如你寫過一行 for (int i = 0; i < 100; i++),你想再寫一模一樣的一行,只要輸入 for<C-X><C-L> 即可。如果補全出來的不是你想要的那一行,你可以按 <C-P> 或 <C-N> 選擇上一個或下一個匹配行
i<C-X><C-F> 在檔案系統中搜尋,補全一個檔案名稱
如果按 <C-P> 或 <C-N> 補全一個詞,在當前檔案中沒有找到匹配,VIM 將搜尋 #include 語句中的檔案,而檔案的位置將在 path 中搜尋。
搜尋字串用的是正規運算式(Regular expression),其中許多字元都有特殊含義:
\ 取消後面所跟字元的特殊含義。比如 \[vim\] 匹配字串“[vim]”
[] 匹配其中之一。比如 [vim] 匹配字母“v”、“i”或者“m”,[a-zA-Z] 匹配任意字母
[^] 匹配非其中之一。比如 [^vim] 匹配除字母“v”、“i”和“m”之外的所有字元
. 匹配任一字元
* 匹配前一字元大於等於零遍。比如 vi*m 匹配“vm”、“vim”、“viim”……
\+ 匹配前一字元大於等於一遍。比如 vi\+m 匹配“vim”、“viim”、“viiim”……
\? 匹配前一字元零遍或者一遍。比如 vi\?m 匹配“vm”或者“vim”
^ 匹配行首。例如 /^hello 尋找出現在行首的單詞 hello
$ 匹配行末。例如 /hello$ 尋找出現在行末的單詞 hello
\(\) 括住某段正規運算式
\數字 重複匹配前面某段括住的運算式。例如 \(hello\).*\1 匹配一個開始和末尾都是“hello”,中間是任一字元串的字串
對於替換字串,可以用“&”代表整個搜尋字串,或者用“\數字”代表搜尋字串中的某段括住的運算式。
舉一個複雜的例子,把文中的所有字串“abc……xyz”替換為“xyz……abc”可以有下列寫法:
:%s/abc\(.*\)xyz/xyz\1abc/g
:%s/\(abc\)\(.*\)\(xyz\)/\3\2\1/g
其它關於正規運算式搜尋替換的更詳細準確的說明請看 :help pattern
例如:在文本中搜尋所有包含amount大於0的以[ ] 括住的字串的行,如 “amount[123]“, ”amount[200]“ 等:
首先按 :進入命令 模式,然後輸入下面的串再斷行符號開始尋找:/amount\[[1-9]\([0-9]*\)\+\]
解釋如下:
/ 表示進行串搜尋, 其它字元為 Regex的內容
amount 表示匹配串包含amount
\[ 逸出字元,表示匹配左中括弧 [
[1-9] 表示匹配一位1到9之間任何數字
\( \) 轉義的左右括弧,表示括住某段Regex,
\+ 逸出字元+,表示前面一個字元或一個正則串重複1次或多次,所以,\([0-9]*\) 表示 任意個0-9之間的數字
\] 逸出字元 ]