我正在尝试使用:'<,'>s!^!// !
在可视模式下注释突出显示的代码。是否可以编辑正则表达式,以便在代码已经注释时取消注释?
答案 0 :(得分:1)
我使用的一个肮脏但非常通用的技巧是利用:normal
命令,它将模拟您在给定范围内给出的击键序列。
例如,要发表评论,请以可视模式选择整行(使用V
)并输入命令:
:normal i//
这是不言自明的:i
打开编辑模式,//
写入它(因为你进入了编辑模式);该命令将应用于每个选定的行,光标位于行的开头(因为我们选择的整行包含V
而不是v
;否则会变得棘手)。使用相同的想法,您可以使用以下方法删除对视觉选择的评论:
:normal xx
(这与它所说的完全相同:删除前两个字符,就像在键盘上键入一样)。
这种方法有几个优点,包括:
{ , /*, //, #, %
),那只需要改变一个笔画。你可以通过普通命令真正发挥创意,因为你可以利用命令范围的标记,并从字面上做任何事情:
:normal A //Hello world
同样,感觉非常自然,因为您只是用您在选择时使用的击键来输入命令。您甚至可以使用this技巧在模式之间切换。
答案 1 :(得分:1)
其他一些答案提到了插件。我目前使用NERD commenter,它提供了ci
(注释反转)命令,可以执行您想要的操作。
对于初学者来说,这里有几种方法可以避免评论已经评论过的行。为简单起见,我将假设注释字符都在第一列中。任何一个都接受一个范围,例如您问题中的可视范围'<,'>
。
:s#^\(// \)\@!#// #
:v#^// #s!^!// !
好的,如果你真的想要一个单一的命令来切换是否注释掉一行,那么你必须捕获该行是否最初被注释,然后用表达式替换:
:%s!^\(// \|\)!\=strpart('// ', strlen(submatch(1)))
:help /\(
:help /\@!
:help :g
:help sub-replace-expression
答案 2 :(得分:0)
好吧,我怀疑你只能使用一个正则表达式,这就是为什么蒂姆·波普为此写了一个正好的扩展名:
然后您需要做的只是gc
来评论一条线或一个视觉选择,并gc
取消注释它!
答案 3 :(得分:0)
有几个插件可用于对多种语言的代码进行注释和取消注释。话虽这么说,在这种情况下你可能想要使用两个单独的正则表达式。例如,假设我有一些代码......
var x = 5;
// Does stuff 5 times
for ( var i = 0; i < x; i++ ) {
// stuff
}
当我对此运行所述正则表达式时,我不希望取消注释已经注释的行。所以最好做类似的事情,但反过来(例如:'<,'>s!^// !!
)。
此外,\ze
和\zs
运算符可用于保留空格。 :*
是:'<,'>
的快捷方式。比如我可以做
:*s!^\s*\zs// !!
这将仅从以它们开头的行或前面的空格中删除字符//
。