例如有下面一段autohotkey代码,需要全部注释,也就是在行首加分号,在vim中有三种方法:替换,列操作和宏,
!0:: ;msn DetectHiddenWindows, On Info_msn := TrayIcons("msnmsgr.exe") StringSplit, TrayInfo_msn, Info_msn,| PostMessage, TrayInfo_msn1, TrayInfo_msn2, 0x0203,, ahk_id %TrayInfo_msn3% return
处理后变为:
; !0:: ;msn ; DetectHiddenWindows, On ; Info_msn := TrayIcons("msnmsgr.exe") ; StringSplit, TrayInfo_msn, Info_msn,| ; PostMessage, TrayInfo_msn1, TrayInfo_msn2, 0x0203,, ahk_id %TrayInfo_msn3% ; return
替换
- 不保留行首空格::%s/^/; /g
可以先用V模式选中要替换的行,然后用s指令替换,vim会自动在:后面加上'<,'>,表示后面的指令仅对被选区域有效;
-
保留行首空格:
-
使用&引用search pattern::%s/^\s*/&; /g
-
使用group + backreference实现::%s/^(\s*)/\1; /g
列操作
使用ctrl+q( Windows的gVim)或者ctrl+v(linux字符终端的vim)进入列编辑模式,进入列编辑模式后与其他visual模式一样先选范围再执行操作,不同之处在于此模式下进入插入模式使用I(normal模式下I表示在行首插入),插入完字符后用Esc返回normal模式后才能看到每行的改变;下面以windows的gVim为例说明具体操作过程:
gg -> ctrl+q -> 5j -> I -> ; ->
宏
gg -> q -> a -> i -> ; ->
q表示开始录制宏,a是宏名,后面是插入一个分号,返回normal模式,向下移动一行,至此宏录制完毕,按q结束录制,@后跟宏名表示使用此宏,5表示重复运行5次;
总结
替换方法优点是操作简单,可以指定处理行的范围,但仅适用于在行首(或行尾)插入,其他位置实现就很麻烦了,列操作的优点是可以看到选区然后进行操作,比较直观,但操作的行必须连在一起,宏的优点是操作一次以后可以重复使用,可以在不连续的行上进行,可以根据实际情况选择解决方案。