習慣問題,一直在用 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/^/#
將 n1 到 n2 行中的行首空白字符替換為 #,等同于在每一行行首插入 #
對于如下 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))

在 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 模式,然后就可以通過光標移動命令(如 h、j、k、l、{、} 等)選中多行文本。
接著在命令模式下運行 :'<,'> s/^/# 即可在選中的文本上執(zhí)行文本替換。

其中 '<,'> 即代表 visual 模式下選中的文本行。一般情況下,選中文本以后再按 : 進入命令模式,'<,'> 部分內容會自動補全。
多行編輯
多行編輯指同時在多行文本中每一行的相同位置插入相同的內容。只需要編輯某一行文本,其他文本行就會自動進行同樣的修改。
比如需要注釋 Python 代碼的前 3 行,就可以同時編輯這 3 行文本,在第一行行首插入 #,則前 3 行會同時被注釋掉。
首先光標定位到第一行行首,按下鍵盤上的 ctrl + v 組合鍵(Windows 下可以用 ctrl + q)進入 Visual Block 模式,按兩次 j 鍵下移光標,選中前三行的首字符。
再按下鍵盤上 I(大寫)鍵進入插入模式,在第一行行首插入 # 字符。
按下 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ù)調用兩次宏,分別注釋第二行和第三行內容。

. 命令
. 命令相當于一種簡化了的宏。它表示重復應用上一步中對內容的更改。
. 命令無需錄制,但只會重復對內容的編輯(如插入、替換等),不會重復其他操作。
比如前面的需要注釋 Python 代碼的前三行,可以執(zhí)行如下操作:
- 光標定位到首行,按
I(大寫)在行首插入內容 - 輸入注釋符號
# - 按下
Esc退出插入模式 - 按下
j跳轉到下一行,按.重復執(zhí)行對上一行的編輯操作(行首插入#) - 重復上一步操作(
j.),注釋第三行
其他
在查閱資料的時候,還發(fā)現(xiàn)一個 norm 命令。
比如還是需要注釋前 3 行,可以執(zhí)行如下命令:
:1,3 norm I #
其中 1,3 表示只對 1 - 3 行應用后面的命令;
norm 表示從 Normal 模式下開始;
I # 表示進入插入模式(同時光標移動到行首),插入文本 #。