天天看點

《Vim實用技巧(第2版)》——1.5 查找并手動替換

本節書摘來自異步社群《vim實用技巧(第2版)》一書中的第1章,第1.5節,作者:【英】drew neil(尼爾)著,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

vim提供了一個 :substitute 指令專門用于查找替換任務,不過用上面介紹的技術,也可以手動修改第一處地方,然後再一個個地查找替換其他比對項。. 指令可以把我們從繁重的工作中解放出來,而即将登場的另一個有用的單鍵指令,則能夠讓我們友善地在比對項間跳轉。

在下面這段文本中,每一行都出現了單詞“content”。

the_vim_way/1_copy_content.txt

假設想用單詞“copy”(意義同“copywriting”)來替代“content”。也許你會想,這太簡單了,隻要用替換指令就行了,像下面這樣:

:%s/content/copy/g

但是,且慢!如果我們運作上面這條指令,就會出現“if you are ‘copy’ with this,”這樣的句子,這很荒唐!

之是以會有這種問題,是因為“content”一詞有兩種含義,一個是“copy”的同義詞(發音為'kon'tεnt),另一個是“happy”的同義詞(發音為kən'tent)。用專業的話說,我們是在處理拼寫相同,但含義和發音都不同的詞。不過這不是我想說的重點,重點是我們一定要小心每一步操作。

我們不能想當然地用“copy”替換每一個“content”,而是要時刻留神,對每個地方都要問“這裡要修改嗎?”,然後回答“修改”或者“不改”。substitute 指令也能勝任這項工作,我們将在技巧90中學到該怎麼做。不過現在,我們将尋求符合本章主題的另一種解決辦法。

偷懶的辦法:無需輸入就可以進行查找

現在你可能已經猜到了,. 指令是我最喜愛的vim單鍵指令,而排在第二位的是 指令,此指令可以查找目前光标下的單詞(參見 <code>:h</code>

《Vim實用技巧(第2版)》——1.5 查找并手動替換

)。

我們可以調出查找提示符,并輸入完整的單詞來查找“content”。

/content

或者,可以簡單地把光标移到這個單詞上,然後按 * 鍵。以下面的操作為例。

《Vim實用技巧(第2版)》——1.5 查找并手動替換
《Vim實用技巧(第2版)》——1.5 查找并手動替換

剛開始,把光标移到單詞“content”上,然後使用 * 指令對它進行查找,你也可以自己試一下。這會産生兩個結果:一是光标跳到下一個比對項上,二是所有出現這個詞的地方都被高亮顯示出來。如果你并沒有看到高亮,試着運作一下 :set hls。要了解更多這方面的内容,請參見技巧81。

執行過一次查找“content”的指令後,現在隻需按 n 鍵就可以跳到下一個比對項。在本例中,按 *nn 會周遊完所有的比對項,進而跳回到本次查找的起點。

使修改可重複

當光标位于“content”的開頭時,就可以着手修改它。這包括兩步操作:首先要删除單詞“content”,然後輸入替代的單詞。cw 指令會删除從光标位置到單詞結尾間的字元,并進入插入模式,接下來就可以輸入單詞“copy”了。vim會把我們離開插入模式之前的全部按鍵操作都記錄下來,是以整個<code>cwcopy&lt;esc&gt;</code>會被當成一個修改。也就是說,執行 . 指令會删除從光标到目前單詞結尾間的字元,并把它修改為“copy”。

合而為一

萬事俱備!每次按 n 鍵時,光标就會跳到下一個“content”單詞所在之處,而按 . 鍵時,它就會把光标下的單詞改為“copy”。

如果想替換所有地方,就可以不加思考地一直按 n.n.n. 以完成所有的修改(但是,這種情況下也可以用 :%s/content/copy/g 指令)。然而,由于我們需要留意不符合要求的比對項,是以在按了 n 之後,要審視一下目前的比對項,然後決定是否把它改為“copy”。如果需要修改的話,就按 . 指令,反之則不用。無論決定是什麼,都可以再次按 n 移到下一個地方,如此循環往複,直到完成全部的修改。