我想映射\ 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
答案 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();`
(我用^
标记了行的开头,因为缩进是不明确的,否则)