在Vim中评论c ++代码

时间:2012-01-09 12:04:52

标签: c++ regex vim commenting

我想映射\ c来注释vim中的当前行(在第一行非空白之前添加'//'到行)和\ d删除行开头的'//'(取消注释)。

我在我的vimrc中添加了这两行:

imap \c <Esc>:s/^/\/\/ <CR>j$a

imap \d <Esc>:s/^\/\/ /<CR>j$a

但是当我在这一行中称呼它时:

    for (int i = 0; i < n; i++)

然后转换为:

//    for (int i = 0; i < n; i++)

但我想将其转换为:

    // for (int i = 0; i < n; i++)

我想要的原因之一是,当我希望vim缩进此行时,它会在行的开头添加一个额外的制表符并将其转换为:

    //    for (int i = 0; i < n; i++)

我该怎么办?我认为^指的是行的第一个非空白字符,但它不是真的。

P.S:我发现了这两个命令,但我不知道他们在做什么。你能不能向我解释一下(因为我需要记住它们,当我知道它们是什么时它们会更容易记住)。如果他们中的任何一部分是不必要的,请告诉我:

imap \c <ESC>:s,^\(\s*\)[^/ \t]\@=,\1// ,e<CR>j$a

imap \d <ESC>:s,^\(\s*\)// \s\@!,\1,e<CR>j$a

3 个答案:

答案 0 :(得分:3)

即使^普通模式命令转到模式中的第一个非空白^(所以:s:g,{{1} },:v命令)表示行首。见:sort

使用:help /^首先插入非空白,I添加到最后一个字符后。

使用:

A

然而,有很好的插件可以完成这项工作。 Tim Pope的commentary,或NERD Commenter。查看他们的文档。

答案 1 :(得分:2)

我建议使用Enhanced Commentify插件。然后,您可以将其添加到~/.vimrc文件中:

let g:EnhCommentifyRespectIndent = 'yes'

它将为您提供您所追求的行为。在可视模式下,选择要注释的代码区域,然后键入\c。要取消注释使用\C

答案 2 :(得分:2)

关于您找到的那些命令:

  

imap \ c:s,^(\ s *)[^#\ t] \ @ =,\ 1 //,ej $ a

让我们从模式匹配开始,将其与:s/^/\/\/ <CR>j$a进行比较。

  • :s,完全等同于:s/ - 您可以选择非标准分隔符,使表达式更具可读性,因此使用,代替/意味着减少转义,评论//和分隔符
  • 之间没有混淆
  • ^(\s*)匹配行的开头(与您的相同)任何前导空格,捕获空白,以便我们以后可以重复使用
  • [^# \t]\@=在行结束前只需要空格,制表符或#以外的字符,但不捕获它(即不会替换该字符)
  • ,\1// ,将匹配的字符串替换为前导空格(\1(\s*)组捕获的内容),然后是//

例如:

^    void foo();

应该匹配:^(\s*)[^# \t]\@= - &gt; ^( )(v@=)void foo();,即第一个组与前导空格匹配,下一个表达式匹配但不消耗v中的void。 然后,\1//扩展为:

^    // 

,最终的替换结果是:

^    // void foo();`

(我用^标记了行的开头,因为缩进是不明确的,否则)