在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中注释/取消注释多个固定行的主要内容,如果未能解决你的问题,请参考以下文章