在vim中注释/取消注释多个固定行

时间:2014-03-27 19:55:19

标签: vim comments code-comments

在我的代码中,我有多个分散的行,可以帮助我调试程序并告诉我执行过程中发生了什么。有没有一种简单快捷的方式来评论和取消(切换)这些固定的行在vim中?我想在python中用这样的特殊符号(例如//)标记这些行:

print "Debug!" # //   

每次按下一个特定的快捷方式时,所有以“#”结尾的可选描述性文字'//'的行都会被注释或取消注释。

我看过NERD Commenter,但是从我读到的内容中,每次都要选择要评论/取消注释的行吗?

1 个答案:

答案 0 :(得分:2)

首先,找到一个选择正确行的模式。如果你有:set hls,它将有助于发现匹配。我觉得像/#.*\/\/$这样的东西就是你想要的。

接下来,使用

注释掉选定的行
:g/<pattern>/s/^/# /

如果#将注释掉该行,并使用

取消注释
:g/<pattern>/s/^# //

现在,您需要一个命令来切换。您可以使用变量来跟踪切换状态,也可以通过检查匹配的行来尝试找出当前状态。使用变量似乎更简单。

变量可以是全局的,缓冲区本地的,也可以是脚本的本地变量。我喜欢使用脚本局部变量以避免混淆命名空间。在这种情况下,使用脚本局部变量可能意味着当切换缓冲区时vim会感到困惑,所以让我们使用缓冲区局部变量,比如b:commentToggle

第一次调用该函数时,它注意到该变量未设置,因此使用search()查找以#开头的行(那里有空格!)并结束我们已经拥有的模式。 n标志表示不移动光标,w表示环绕文件末尾(如使用'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>

如果您想将#放在第一个非空白之前,请在^\s*#命令中使用search();第一个s/\ze\S/# /行中的s/\S/\1# /:g;和第s/^\s*\zs# //行中的:g。请参阅:help /\zs:help /\ze:help sub-replace-special