vim:检查一行是否包含在注释(/ * * /)中并打开和关闭它

时间:2014-01-27 17:30:11

标签: vim

前几天

Just asked a question关于如何在评论中包含一行来产生这个梦幻般的片段:

nnoremap - mzI/* <esc>A */<esc>`z

我想打开另一个帖子,询问如何将其转换为切换。这意味着它首先检查行是否包含在/ * * /中并删除注释或添加注释(如果不存在)。

这必须是一个脚本还是我可以用地图执行此操作?此外,我不想为此使用插件,因为它很简单,我想看看它是如何完成的。

2 个答案:

答案 0 :(得分:3)

你走了:

nnoremap <expr> - getline('.') =~ '^\s*/\*.\+\*/$' ? '^3x$daw' : "I/* \<esc>A */\<esc>"

取消评论由^3x$daw完成,删除映射的开始和结束部分。检测通过当前行getline('.')上的正则表达式完成。我已经从映射的注释部分删除了z标记,因为它很难将光标保持在“相同”的位置。

这是一个更好的映射的一个很好的例子。但是有一些事情要考虑:

  • 此映射会污染."寄存器。
  • 仅适用于具有c风格评论的文件类型
  • 没有视觉或操作符之类的映射,这意味着你无法进行大规模切换。
  • 不会通过.
  • 重复

我强烈推荐一个评论插件。我目前使用Tim Pope的vim-commentary插件。

如需更多帮助,请参阅:

:h :map-<expr>
:h getline(

答案 1 :(得分:2)

RE 我不想为此使用插件,因为它很简单。

直到你大量使用它才会很简单; Peter Rincker的答案已经列出了一些问题。由于您可能依赖(非)评论,这对于经过验证的强大插件来说是一个很好的指示。

让我提出The NERD Commenter的建议;它具有您要求的切换映射,并支持多种语言。除了评论之外,还可以查看tComment