评论/取消注释vim中的多个固定行
在我的代码中,我有多个分散的行,这些行可以帮助我调试程序并显示执行过程中发生了什么。 有没有一种简单而快速的方法来评论和取消注释(切换)vim中的这些固定行? 我想在python中用一个特殊符号(比如//)来标记这些行:
print "Debug!" # //
并且每次按下一个特定快捷键时,所有以“#”结尾的行都会分别进行注释或取消注释。
我已经看过NERD Commenter,但是从我读过的每条评论/取消注释的行都必须每次选择?
首先,找到一个选择正确线条的模式。 如果您有:set hls
,这将有助于发现比赛。 我认为像/#.*//$
这样的东西就是你想要的。
接下来,用选定的行注释掉
:g/<pattern>/s/^/# /
如果#
会将该行注释掉,并将其注释掉
:g/<pattern>/s/^# //
现在,你想要一个命令切换。 您可以使用变量来跟踪切换状态,也可以通过检查匹配的行来尝试找出当前状态。 使用变量似乎更简单。
该变量可以是全局的,缓冲区本地的或脚本本地的。 我喜欢使用脚本局部变量以避免混乱命名空间。 在这种情况下,使用脚本局部变量可能意味着vim在切换缓冲区时会感到困惑,所以让我们使用一个缓冲区局部变量,比如b:commentToggle
。
第一次调用该函数时,它注意到该变量没有设置,所以使用search()
来查找以#
开头的行(这里有一个空格!),并以我们已有的模式结束。 n
标志表示不移动光标, w
表示绕回文件'wrapscan'
(如使用'wrapscan'
设置搜索)。 如果找到该模式, search()
函数会返回行号(从1开始!),否则返回0。 请参阅:help search()
。
这似乎在一个小测试中工作:
fun! CommentToggle()
if !exists('b:commentToggle')
let b:commentToggle = !search('^# .*#.*//$', 'nw')
endif
if b:commentToggle == 1
g/#.*//$/s/^/# /
else
g/#.*//$/s/^# //e
endif
let b:commentToggle = !b:commentToggle
endfun
nnoremap <F4> :call CommentToggle()<CR>
如果你想把#
放在#
一个非空白的前面,那么在search()
命令中使用^s*#
; s/zeS/# /
或s/S/1# /
在第一行:g
行; 和s/^s*zs# //
在第二行:g
行。 请参阅:help /zs
, :help /ze
和:help sub-replace-special
。