在我的代码中,我有多个分散的行,可以帮助我调试程序并告诉我执行过程中发生了什么。有没有一种简单快捷的方式来评论和取消(切换)这些固定的行在vim中?我想在python中用这样的特殊符号(例如//)标记这些行:
print "Debug!" # //
每次按下一个特定的快捷方式时,所有以“#”结尾的可选描述性文字'//'的行都会被注释或取消注释。
我看过NERD Commenter,但是从我读到的内容中,每次都要选择要评论/取消注释的行吗?
答案 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
。