Vim 技巧 —— 實現(xiàn)多行注釋的幾種方法

習慣問題,一直在用 Vim。之前裝的幾個插件,基本上覆蓋了日常使用中的絕大部分場景。只是遇到需要多行注釋的時候,一直沒有一套比較直接的方法。
于是上網查了些資料,也實際測試了下效果。整理出一部分方法(不借助插件),以作備忘。

字符串替換

命令模式下可以使用 :s/old/new 替換當前文本行中的指定字符串。前面還可以加上數(shù)字等用來指定范圍。如:

  • :n1,n2 s/old/new:從 n1 行開始,到 n2 行結束,將每一行中符合 old 模式的內容替換為 new
  • :% s/old/new:將整個文件中的 old 替換為 new

類似于 Vim 中內置了一個 sed 工具。

對于 Python 代碼,注釋代碼塊當然可以用雙 ''',臨時的注釋我個人比較偏向行首加 #。借助字符串替換可以很方便的實現(xiàn)。命令如下:
:n1,n2 s/^/#
n1n2 行中的行首空白字符替換為 #,等同于在每一行行首插入 #

對于如下 Python 代碼:

from datetime import datetime
import calendar
import os


current_time = datetime.now()
total_days = calendar.monthrange(current_time.year, current_time.month)
total_days = total_days[1]

for i in range(total_days):
    os.mkdir(str(i + 1))
before replace

在 Vim 中運行 :1,3 s/^/#,后,效果如下:

# from datetime import datetime
# import calendar
# import os


current_time = datetime.now()
total_days = calendar.monthrange(current_time.year, current_time.month)
total_days = total_days[1]

for i in range(total_days):
    os.mkdir(str(i + 1))

如果要取消注釋,再運行如下命令即可:
:1,3 s/# /
將 1 - 3 行行首的 # 替換為空字符串(即移除行首的 #)

visual 模式下指定文本范圍

如果不喜歡用數(shù)字行號指定施行替換的文本行,也可以在 Visual 模式下手動選擇生效的文本范圍。

Normal 模式下按鍵盤上的 v 鍵進入 visual 模式,然后就可以通過光標移動命令(如 hj、kl、{} 等)選中多行文本。

接著在命令模式下運行 :'<,'> s/^/# 即可在選中的文本上執(zhí)行文本替換。

select & replace

其中 '<,'> 即代表 visual 模式下選中的文本行。一般情況下,選中文本以后再按 : 進入命令模式,'<,'> 部分內容會自動補全。

多行編輯

多行編輯指同時在多行文本中每一行的相同位置插入相同的內容。只需要編輯某一行文本,其他文本行就會自動進行同樣的修改。

比如需要注釋 Python 代碼的前 3 行,就可以同時編輯這 3 行文本,在第一行行首插入 #,則前 3 行會同時被注釋掉。

首先光標定位到第一行行首,按下鍵盤上的 ctrl + v 組合鍵(Windows 下可以用 ctrl + q)進入 Visual Block 模式,按兩次 j 鍵下移光標,選中前三行的首字符。
再按下鍵盤上 I(大寫)鍵進入插入模式,在第一行行首插入 # 字符。
按下 Esc 退出插入模式,則后兩行行首也會自動插入 # 字符。

VISUAL BLOCK
before Esc
after Esc

錄制 Macro

Vim 中的(Macro)即一系列編輯操作的合集。
在 Vim 中,可以把需要重復執(zhí)行的多步編輯操作錄制下來,綁定到某個按鍵上。之后就可以按下 @綁定的按鍵 重復執(zhí)行錄制好的步驟。
有點像定義和調用函數(shù)。

使用 q某按鍵 開始錄制宏,執(zhí)行某些編輯操作后,再按下 q 結束錄制。隨后按下 @某按鍵 調用錄制好的宏。

如需要注釋前 3 行 Python 代碼,則可以錄制包含如下步驟的宏:

  • 在當前行的行首開始插入文本(I
  • 輸入注釋符號(#
  • 退出插入模式(Esc
  • 移動到下一行(j)

上述宏中的操作步驟可以首尾相接,無限循環(huán)。即注釋當前行,移動到下一行;注釋當前行,移動到下一行。。。

具體的操作步驟如下:

  • 在 Normal 模式下,光標移動到首行,按下 qq 開始錄制宏(錄制結束后會綁定給 q
  • 按下 I 鍵(大寫),進入行首插入模式
  • 輸入 #
  • 按下 Esc 退出插入模式
  • 按下 j 移動光標到下一行文本
  • 按下 q 結束宏的錄制

宏錄制結束后,即可連按兩次 @q 連續(xù)調用兩次宏,分別注釋第二行和第三行內容。

recording macro
. 命令

. 命令相當于一種簡化了的宏。它表示重復應用上一步中對內容的更改。
. 命令無需錄制,但只會重復對內容的編輯(如插入、替換等),不會重復其他操作。
比如前面的需要注釋 Python 代碼的前三行,可以執(zhí)行如下操作:

  • 光標定位到首行,按 I(大寫)在行首插入內容
  • 輸入注釋符號 #
  • 按下 Esc 退出插入模式
  • 按下 j 跳轉到下一行,按 . 重復執(zhí)行對上一行的編輯操作(行首插入 #
  • 重復上一步操作(j.),注釋第三行

其他

在查閱資料的時候,還發(fā)現(xiàn)一個 norm 命令。
比如還是需要注釋前 3 行,可以執(zhí)行如下命令:
:1,3 norm I #

其中 1,3 表示只對 1 - 3 行應用后面的命令;
norm 表示從 Normal 模式下開始;
I # 表示進入插入模式(同時光標移動到行首),插入文本 #。

參考資料

Vim: insert the same characters across multiple lines

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容