使用Regex在Vim中注释/取消注释

时间:2014-01-25 19:03:31

标签: regex vim

我正在尝试使用:'<,'>s!^!// !在可视模式下注释突出显示的代码。是否可以编辑正则表达式,以便在代码已经注释时取消注释?

4 个答案:

答案 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// !!

这将仅从以它们开头的行或前面的空格中删除字符//