Regex 使用正则表达式在Vim中注释/取消注释

Regex 使用正则表达式在Vim中注释/取消注释,regex,vim,Regex,Vim,我正在尝试使用:“好吧,我怀疑你只能使用一个正则表达式,这就是为什么Tim Pope为此编写了一个扩展: 然后您所要做的就是gc注释一行或一个可视选择,然后gc取消注释它 有几个插件可以跨多种语言注释和取消注释代码。也就是说,在这种情况下,您可能需要使用两个单独的正则表达式。例如,假设我有一些代码 var x = 5; // Does stuff 5 times for ( var i = 0; i < x; i++ ) { // stuff } 这将仅从以字符开头的行或前面

我正在尝试使用
:“好吧,我怀疑你只能使用一个正则表达式,这就是为什么Tim Pope为此编写了一个扩展:


然后您所要做的就是
gc
注释一行或一个可视选择,然后
gc
取消注释它

有几个插件可以跨多种语言注释和取消注释代码。也就是说,在这种情况下,您可能需要使用两个单独的正则表达式。例如,假设我有一些代码

var x = 5;

// Does stuff 5 times
for ( var i = 0; i < x; i++ ) {
  // stuff
}

这将仅从以字符开头的行或前面有空格的行中删除字符。

我使用的一个肮脏但非常通用的技巧是利用
:normal
命令,该命令将模拟给定范围内的击键顺序

例如,要进行注释,请在视觉模式下选择整行(使用
V
),然后输入以下命令:

:normal i//
这是不言自明的:
i
打开编辑模式,然后
/
写入它(因为您进入了编辑模式);该命令将应用于每一个选定的行,光标将定位到行的开头(因为我们选择了整行
V
,而不是
V
;否则会很棘手)。使用相同的想法,您可以使用以下方法删除对视觉选择的注释:

:normal xx
(这正是它所说的:删除前两个字符,就像您在键盘上键入的那样)

这种方法有几个优点,包括:

  • 如果您使用几种不同的语言并使用不同的注释符号(
    {、/*、//、#、%
    ),只需更改一个笔划即可
  • 使用普通命令确实可以获得创造性,因为您可以利用命令范围内的标记,并实际执行任何操作:

    :普通A//Hello world

  • 同样,这感觉很自然,因为您只需输入一个命令,输入您将在选择中使用的按键。您甚至可以使用技巧在模式之间切换


其他一些答案提到了插件。我目前使用的插件提供了一个
ci
(comment invert)命令,可以实现您想要的功能


对于初学者,这里有两种方法可以避免注释掉已经注释过的行。为简单起见,我假设注释字符都在第一列中。任何一个都接受一个范围,例如Visual range
,谢谢,该命令完全符合我的要求,尽管我已经决定按照有几个答案。
:normal xx
:s#^\(// \)\@!#// #
:v#^// #s!^!// !
:%s!^\(// \|\)!\=strpart('// ', strlen(submatch(1)))
:help /\(
:help /\@!
:help :g
:help sub-replace-expression