评论/取消注释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

链接地址: http://www.djcxy.com/p/22607.html

上一篇: Comment / uncomment multiple fixed lines in vim

下一篇: Merge multiple lines (two blocks) in Vim