在 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 <esc>:s@^\s*\zs//@@e<cr>jA
(使用@
作为模式分隔符可以更轻松地将/
包含在模式中)。
@Farzam:你试过inoremap \d <esc>:s@^\s*\zs//@@e<cr>jA
吗?【参考方案2】:
关于你找到的那些命令:
imap \c :s,^(\s*)[^# \t]\@=,\1// ,ej$a
让我们从模式匹配开始,将其与您的 :s/^/\/\/ <CR>j$a
进行比较。
:s,
完全等同于 :s/
- 您可以选择非标准分隔符,使表达式更具可读性,因此这里使用 ,
而不是 /
意味着更少的转义,并且注释 //
和之间不会混淆分隔符
^(\s*)
匹配行的开头(与您的相同)和任何前导空格,捕获空格以便我们以后可以重用它
[^# \t]\@=
在行尾之前只需要空格、制表符或#
以外的其他字符,但不会捕获它(即,该字符不会被替换)
,\1// ,
用前导空格替换匹配的字符串(\1
是 (\s*)
组捕获的任何内容),然后是 //
例如:
^ void foo();
应该像这样匹配:^(\s*)[^# \t]\@=
-> ^( )(v@=)void foo();
,即第一组匹配前导空格,下一个表达式匹配但不使用来自void
的v
。
然后,\1//
扩展为:
^ //
最后的替换结果是:
^ // void foo();`
(我已经用^
标记了行首,因为缩进不明确)
【讨论】:
如果我想将//
添加到[^# \t]\@=
组中该怎么办?为什么在这个组中需要\t 和空间(不 (\s*) 捕获它们?)
我将在答案中澄清替换的结果,但它目前将 '//' 放在空格之后和第一个非空白字符之前......如果那不是行为你想要,也许你可以展示你想要的结果?【参考方案3】:
我推荐使用Enhanced Commentify 插件。然后,您可以将其添加到您的 ~/.vimrc
文件中:
let g:EnhCommentifyRespectIndent = 'yes'
它会给你你所追求的行为。在可视模式下,选择要注释的代码区域,然后键入 \c
。要取消注释,请使用\C
。
【讨论】:
我更喜欢Commentary 或tocmment,因为它们都允许您使用动作进行评论。\
是我的评论前缀键,因此我可以使用 \aw
来评论单个单词或使用 \aB
来评论整个块。
我不想在这种情况下使用插件,因为我想在不允许使用插件的比赛中使用它们。以上是关于在 Vim 中注释 c++ 代码的主要内容,如果未能解决你的问题,请参考以下文章