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

Posted

技术标签:

【中文标题】在vim中注释/取消注释多个固定行【英文标题】:Comment / uncomment multiple fixed lines in vim 【发布时间】:2014-05-07 00:46:46 【问题描述】:

在我的代码中,我有多个分散的行,它们可以帮助我调试程序并向我展示执行期间发生的情况。有没有一种简单快捷的方法可以在 vim 中评论和取消评论(切换)这些固定行?我想过在 python 中用一个特殊的符号(例如 //)标记这些行:

print "Debug!" # //   

每次按下特定的快捷方式时,所有以“# 'some optional descriptive text' //”结尾的行都会分别被注释或取消注释。

我看过 NERD 评论者,但从我读到的内容中,每次都必须选择要评论/取消评论的行?

【问题讨论】:

您使用什么语言?最好查看某种可以在运行程序时打开或关闭的日志记录框架。或者也许是一个命令行标志。 我使用python(刚刚更新了答案)。我也考虑过添加一个'if(debugFlag == True):...',但我不太喜欢它,因为它进一步扩展了与程序逻辑无关的代码和(最低限度地)减慢程序的速度。 Python 有一个日志框架。 docs.python.org/2/library/logging.html 你应该可以很容易地禁用它。我不会担心程序变慢。除非您已经确定(使用分析器)日志语句实际上是问题所在。 【参考方案1】:

首先,找到选择正确线条的模式。如果您有: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>

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

【讨论】:

这是 python 我认为它使用 # 用于 cmets 首先非常感谢!关于你的最后一段:我打开一个文件 1,切换到插入 #,打开一个文件 2,切换到插入 #,切换到文件 1,切换到删除 #。这行得通,但是如果我现在切换到文件 2 并切换,则不会删除 # 但会添加另一个 # 并且进一步切换只会删除第二个 #。这可能不是您想要的? 此外,如果将 # 插入第一个非空白字符的位置(以保持缩进并使其更美观)而不是在开头,那就太好了.我试过 :g/#.*\/\/$/s/\S/# / 但问题是第一个非空白字符也被删除了。 对,切换缓冲区的问题比我最初想象的要棘手。此外,如果您保存文件并稍后返回。我会改进答案。

以上是关于在vim中注释/取消注释多个固定行的主要内容,如果未能解决你的问题,请参考以下文章

vi/vim多行注释和取消注释

vi/vim多行注释和取消注释

vim 批量注释和取消

vim中如何设置多行注释和删除注释

vim/vi编辑工具实现多行注释和取消注释

linux vim注释