在 Vim 中注释 c++ 代码

Posted

技术标签:

【中文标题】在 Vim 中注释 c++ 代码【英文标题】:Commenting c++ codes in Vim 【发布时间】:2012-02-05 23:20:09 【问题描述】:

我想映射 \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

【问题讨论】:

【参考方案1】:

即使^ 正常模式命令转到第一个非空白,^ 在模式中(所以在:s:g:v:sort 命令中)表示开始线。见:help /^

使用I 插入第一个非空白字符,A 附加在最后一个字符之后。

用途:

inoremap \c <c-o>I//<esc>jA
inoremap \d <esc>^2xjA

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

【讨论】:

谢谢,但是你写的 \d 会删除行的前两个字符,即使该行没有被注释。 会的。如果您不希望这样:inoremap \d &lt;esc&gt;:s@^\s*\zs//@@e&lt;cr&gt;jA(使用@ 作为模式分隔符可以更轻松地将/ 包含在模式中)。 @Farzam:你试过inoremap \d &lt;esc&gt;:s@^\s*\zs//@@e&lt;cr&gt;jA 吗?【参考方案2】:

关于你找到的那些命令:

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

让我们从模式匹配开始,将其与您的 :s/^/\/\/ &lt;CR&gt;j$a 进行比较。

:s, 完全等同于 :s/ - 您可以选择非标准分隔符,使表达式更具可读性,因此这里使用 , 而不是 / 意味着更少的转义,并且注释 // 和之间不会混淆分隔符 ^(\s*) 匹配行的开头(与您的相同)任何前导空格,捕获空格以便我们以后可以重用它 [^# \t]\@= 在行尾之前只需要空格、制表符或# 以外的其他字符,但不会捕获它(即,该字符不会被替换) ,\1// , 用前导空格替换匹配的字符串(\1(\s*) 组捕获的任何内容),然后是 //

例如:

^    void foo();

应该像这样匹配:^(\s*)[^# \t]\@= -> ^( )(v@=)void foo();,即第一组匹配前导空格,下一个表达式匹配但不使用来自voidv。 然后,\1// 扩展为:

^    // 

最后的替换结果是:

^    // void foo();`

(我已经用^ 标记了行首,因为缩进不明确)

【讨论】:

如果我想将// 添加到[^# \t]\@= 组中该怎么办?为什么在这个组中需要\t 和空间(不 (\s*) 捕获它们?) 我将在答案中澄清替换的结果,但它目前将 '//' 放在空格之后和第一个非空白字符之前......如果那不是行为你想要,也许你可以展示你想要的结果?【参考方案3】:

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

let g:EnhCommentifyRespectIndent = 'yes'

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

【讨论】:

我更喜欢Commentary 或tocmment,因为它们都允许您使用动作进行评论。 \ 是我的评论前缀键,因此我可以使用 \aw 来评论单个单词或使用 \aB 来评论整个块。 我不想在这种情况下使用插件,因为我想在不允许使用插件的比赛中使用它们。

以上是关于在 Vim 中注释 c++ 代码的主要内容,如果未能解决你的问题,请参考以下文章

在 Vim 中注释/取消注释 ruby​​ 代码块的最优雅的方式是啥?

在 Vim 中对齐行尾注释?

风--vim批量注释操作释代码时

vim 批量注释和取消

在vim中注释/取消注释多个固定行

Vim块注释