962
技術社區[雲棲]
《Vim實用技巧(第2版)》——1.5 查找並手動替換
本節書摘來自異步社區《Vim實用技巧(第2版)》一書中的第1章,第1.5節,作者:【英】Drew Neil(尼爾)著,更多章節內容可以訪問雲棲社區“異步社區”公眾號查看
1.5 查找並手動替換
Vim提供了一個 :substitute 命令專門用於查找替換任務,不過用上麵介紹的技術,也可以手動修改第一處地方,然後再一個個地查找替換其他匹配項。. 命令可以把我們從繁重的工作中解放出來,而即將登場的另一個有用的單鍵命令,則能夠讓我們方便地在匹配項間跳轉。
在下麵這段文本中,每一行都出現了單詞“content”。
the_vim_way/1_copy_content.txt
...We're waiting for content before the site can go live...
...If you are content with this, let's go ahead with it...
...We'll launch as soon as we have the content...
假設想用單詞“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單鍵命令,而排在第二位的是 命令,此命令可以查找當前光標下的單詞(參見 :h
)。
我們可以調出查找提示符,並輸入完整的單詞來查找“content”。
/content
或者,可以簡單地把光標移到這個單詞上,然後按 * 鍵。以下麵的操作為例。
剛開始,把光標移到單詞“content”上,然後使用 * 命令對它進行查找,你也可以自己試一下。這會產生兩個結果:一是光標跳到下一個匹配項上,二是所有出現這個詞的地方都被高亮顯示出來。如果你並沒有看到高亮,試著運行一下 :set hls。要了解更多這方麵的內容,請參見技巧81。
執行過一次查找“content”的命令後,現在隻需按 n 鍵就可以跳到下一個匹配項。在本例中,按 *nn 會遍曆完所有的匹配項,從而跳回到本次查找的起點。
使修改可重複
當光標位於“content”的開頭時,就可以著手修改它。這包括兩步操作:首先要刪除單詞“content”,然後輸入替代的單詞。cw 命令會刪除從光標位置到單詞結尾間的字符,並進入插入模式,接下來就可以輸入單詞“copy”了。Vim會把我們離開插入模式之前的全部按鍵操作都記錄下來,因此整個cwcopy<Esc>
會被當成一個修改。也就是說,執行 . 命令會刪除從光標到當前單詞結尾間的字符,並把它修改為“copy”。
合而為一
萬事俱備!每次按 n 鍵時,光標就會跳到下一個“content”單詞所在之處,而按 . 鍵時,它就會把光標下的單詞改為“copy”。
如果想替換所有地方,就可以不加思考地一直按 n.n.n. 以完成所有的修改(但是,這種情況下也可以用 :%s/content/copy/g 命令)。然而,由於我們需要留意不符合要求的匹配項,所以在按了 n 之後,要審視一下當前的匹配項,然後決定是否把它改為“copy”。如果需要修改的話,就按 . 命令,反之則不用。無論決定是什麼,都可以再次按 n 移到下一個地方,如此循環往複,直到完成全部的修改。
最後更新:2017-06-06 07:38:16