5. 搜尋、替換

搜尋、替換的功能幾乎是每個編輯器必備的功能,那在 Vim 中有沒有特殊的地方呢?當然有,您忘了,Vim 是個性十足的編輯器。最特殊的地方是和規則表示式(regular expression, 簡稱 regexp)結合在一起。簡單的說她是一種 pattern 的表示法,在執行動作,如搜尋或替換時,就會依據這個 pattern 去找,所有符合 pattern 的地方就會執行您所下的動作。在這個單元裡暫不討論 regexp,會在第十章來探討,以免搞得頭昏腦脹。目前就暫不使用 regexp,您要找什麼就直接鍵入什麼就對了。


5.1 搜尋

/ 在 c-mode 的情形下,按 / 就會在左下方出現一個 /,然後鍵入您要尋找的字串,按個 Enter 就會開始找。? 和 / 相同,只是 / 是向前(下)找, ? 則是向後(上)找。
n 繼續尋找。
N 繼續尋找(反向)。


5.2 更方便的搜尋操作(Vim 才有)

* 尋找游標所在處之 word(要完全符合)。
# 同上,但 * 是向前(下)找,# 則是向後(上)找。
g* 同 * ,但部份符合即可。
g# 同 # ,但部份符合即可。n, N 之繼續尋找鍵仍適用。


5.3 替換(substitute)

:[range]s/pattern/string/[c,e,g,i]5.1

range 指的是範圍,1,7 指從第一行至第七行,1,$ 指從第一行至最後一行,也就是整篇文章,也可以 % 代表。還記得嗎? % 是目前編輯的文章,# 是前一次編輯的文章。
pattern 就是要被替換掉的字串,可以用 regexp 來表示。
string 將 pattern 由 string 所取代。
c confirm,每次替換前會詢問。
e 不顯示 error。
g globe,不詢問,整行替換。
i ignore 不分大小寫。

g 大概都是要加的,否則只會替換每一行的第一個符合字串。可以合起來用,如 cgi,表示不分大小寫,整行替換,替換前要詢問是否替換。

[實例] :%s/Edwin/Edward/g
這樣整篇文章的 Edwin 就會替換成 Edward。

更進階的搜尋、替換的例子在說明 regexp 的時候還會再詳述。目前只知道最基本的用法就可以了!其實光這樣就非常好用了。:-)


5.4 書籤功能

這又是 Vim 的一個秘密武器,簡單的說,您可以在文章中的某處做個記號(marks),然後跑到其它地方去編輯,在呼叫這個 mark 時又會回到原處。妙吧!

mx x 代表 26 個小寫英文字母,這樣游標所在處就會被 mark。
`x 回到書籤原設定位置。` 是 backward quote,就是 Tab 鍵上面那一個。
'x 回到書籤設定行行首。' 是 forward quote,是 Enter 鍵隔壁那一個。

這裡舉個簡單的子,請隨便開一個現成的檔案,把游標移到任一個位置,然後按 ma 做個 mark,再按大寫 G 移到檔尾,然後按 'a 看現在在什麼地方?


5.5 Vim 對於書籤的擴充功能

5.5.1 小寫英文字母

只作用於單一檔案內。

5.5.2 大寫英文字母

可作用於各檔案間。例如 mA 會在 viminfo 中紀錄下這個檔案及位置,結束 vim,然後再啟動 vim,按 'A 就會回到當初做標記的那個檔案及所在位置(vim 會自動開啟做有 A 標記的檔案)。別懷疑,請自行馬上做個實驗就知道啦!:-)

5.5.3 阿拉伯數目字

可作用於前次編輯的十個檔案。數目字的用法比較特殊,'0 是回到前一次編輯檔案中離開前的最後位置,'1 則是回到前二次編輯檔案的最後位置,依此類推。您不必使用 m 來標示,vim 會自動記憶。很玄吧!其實這是 viminfo 的功能,您要認真追究的話,請 :h viminfo-file-marks。viminfo 關掉,就沒這個功能了!所謂前次指的是前次啟動的 vim。不管是哪一種的書籤,到達 mark 處(或檔案),想返回原來的位置(或檔案),可以按 Ctrl + O

5.5.4 :marks

得知目前所有書籤的列表。
Compiled by Edward G.J. Lee (2003-03-03)