【小技巧】對文本中指定內容進行快速的全局刪改

** 本篇命令 **nnvmap qq y:%s`<C-R>"``g<left><left>nnn** 本篇幫助 **nn:help vmapn:help visual-moden:help yankn:help ""n:help :globaln:help c_CTRL-Rn

對已有文本的修改是 vim 的強項,vim 原有的快捷鍵已經可以讓我們完成很多的工作,但是,這還遠遠不夠。

下面,我有一個這樣文本:

床前明♂月光,n疑♂是地♂上霜。n舉♂頭望♂明月,n低♂頭思♂故鄉。n

我們現在需要把這個多餘的「♂」符號刪除。我們通常是怎樣乾的?

%s/♂//gn

對吧?

但是,這裡有個問題。各位是如何輸入這條命令的呢?

=== 以下是鍵盤輸入 ===n<shift>;nsn/n(以某種方式輸入「♂」)n/n/ngn<enter>n

其中最讓人煩躁的就是輸入被替換的 pattern 對吧?特別是,那個 pattern 是特殊符號,或者比較長的時候,這樣要輸入就特別讓人煩躁。在需要大量進行修改的時候,比如修改一本書,這種重複的操作會讓人崩潰。

那麼,有沒有辦法讓這件事變得輕鬆一點呢?當然有,而且不需要插件、不需要複雜的代碼,只需要在你的 vimrc 裡面加入一句簡單的快捷鍵映射就可以了:

vmap qq y:%s`<C-R>"``g<left><left>n

用法很簡單,進入任意一種可視模式,然後按下快捷鍵(比如這裡是 qq ),就會自動插入一個全局替換的語句,並且把游標定位在新字元串的位置,方便進一步編輯。如果不編輯,那麼直接回車,可視模式下選中的內容就會被刪除。

我們先來看看這句設置。

vmap qq y:%s`<C-R>"``g<left><left>nnvmap 這個快捷鍵只在可視模式下有效。nn qq 一個隨便設置的快捷鍵,好按即可。nn y 執行「yank(複製)」命令。nn :%s 輸入全局替換命令 :%s 。nn ` 分隔符使用「`」,不容易有衝突。nn <C-R>" 粘貼出寄存器 " 中的內容。nn ``g 全部替換為空。nn <left><left> 把游標移動到 `` 之間,如果需要n 替換為其他內容,這樣方便輸入。n

下面說明幾個要點。

1、vmap

這是一個在 vim 的「可視模式( visual mode )」生效的快捷鍵映射。關於可視模式,請閱讀幫助:

:help vmapn:help visual-moden

如果在普通模式( normal mode )或者插入模式( insert mode )中,這個快捷鍵不會生效,這樣就可以讓你更靈活的設置快捷鍵,而不必擔心影響到其他的快捷鍵。

你可以使用 v 進入字元可視模式,或者 V(大寫的 v,通過 shfit + v 輸入)進入行可視模式,或者 ctrl+v 進入列可視模式,選中你要刪改的內容。

2、y[ank]

:help yankn

就是常用的複製鍵。在 normal mode 下面,你需要配合各種 motion 按鍵( HJKL 等)來用。但是在可視模式下,默認複製被選中的內容。

這個被選中的內容會默認貯存在無名寄存器( " )中。

:help ""n

如果你希望使用其他寄存器,當然也可以。參照 yank 命令幫助中關於寄存器的使用方法。

3、`

:help :globalnn除了用 / 來包圍 {pattern} 以外,你可以用任何其它單位元組字元,但不包括字母n數字、"|。這對你想在搜索模式或者替代字元串里包含 / 很有用。n

:g 、:s 等命令中,用來分隔 {pattern} 、 {string} 、 {flag} 等部分的符號並不是固定的,默認情況下,使用的是「 / 」,但是你也可以使用其他任意的單位元組字元(不包括字母、數字、反斜杠、引號或者 | )。當然你必須確保一個命令中分隔符的一致性。

:%s/{pattern}#{string},g ×nn:%s/{pattern}/{string}/g √nn:%s#{pattern}#{string}#g √nn:%s,{pattern},{string},g √n

我這裡選用了「 ` 」,因為我自己要替換的內容中,經常都會包括有「 / 」,用其他字元來分隔,就不需要做額外的轉義了。

4、<C-R>"

:help c_CTRL-Rn

在 insert mode 中,ctrl+r 可以讓你進入插入寄存器內容的狀態,游標處會出現一個 「 " 」提示你輸入一個寄存器的名字。

在這個命令中,我輸入了「 " 」,表明我要插入的是無名寄存器中的內容。而這個內容就是剛剛從可視模式中複製的內容。如果你在前面的命令中使用了其他的寄存器,那麼這個使用那個寄存器就可以了。


推薦閱讀:

SpaceVim - 讓你的vim變得更加高效和強大
vim短途跳轉用easymotion那長途呢?
vim怎麼批量縮進?
vim 怎麼脫離滑鼠?

TAG:Vim | vim脚本 | 文本编辑器 | 文本编辑 |