如何在vim中创建向上或向下注释N行代码的映射,如“cm6j”,其中cm代表注释?

如何在vim中创建向上或向下注释N行代码的映射,如“cm6j”,其中cm代表注释?,vim,Vim,嘿,我正在学习vim脚本,我想知道如何模仿像d4k这样的vim风格的命令来删除上面的4行,但要用我自己的自定义操作。我还想让它把光标放回原来的位置,比如 nnoremap cm ma^i//<Esc>`a "for commenting nnoremap ucm ma^d2l`a "for uncommenting 所以cm6j应该注释当前行和它下面的6,然后返回到我所在的位置。您可以使用g@定义自定义运算符。如果你通读了,这就解释了怎么做。我想到了这个: function! Co

嘿,我正在学习vim脚本,我想知道如何模仿像d4k这样的vim风格的命令来删除上面的4行,但要用我自己的自定义操作。我还想让它把光标放回原来的位置,比如

nnoremap cm ma^i//<Esc>`a "for commenting
nnoremap ucm ma^d2l`a "for uncommenting
所以cm6j应该注释当前行和它下面的6,然后返回到我所在的位置。

您可以使用g@定义自定义运算符。如果你通读了,这就解释了怎么做。我想到了这个:

function! Comment(type, ...) range
  normal m`
  if a:0
    silent exe "'<,'>normal! I//"
  else
    silent exe "'[,']normal! I//"
  endif

  exec "normal \<C-o>"
endfunction

nnoremap cm :set opfunc=Comment<cr>g@
xnoremap cm :call Comment(visualmode(), 1)<cr>

function! Uncomment(type, ...) range
  normal m`
  if a:0
    silent exe "'<,'>normal! ^2x'["
  else
    silent exe "'[,']normal! ^2x"
  endif

  exec "normal \<C-o>"
endfunction

nnoremap ucm :set opfunc=Uncomment<cr>g@
xnoremap ucm :call Uncomment(visualmode(), 1)<cr>
作为补充说明,我建议选择不同的助记符来取消注释,因为在ucm中,如果您尝试使用u进行撤销,则需要等待一段时间才能看到效果

另外,你可以安装插件。

你也可以使用我的小插件

安装它,然后按照主页上的建议更新.vimrc。 然后假设引线键是空格键:

6cc表示注释,6cu表示取消注释

此外,您只需使用“v”键选择一些文本,然后按cc键进行注释,或按cu键取消注释

它比大多数其他插件更有用,因为它只注释整行内容,并尝试在光标位置和缩进方面更灵活

现在,它支持vim、shell脚本、python、ruby和所有使用“//”的语言。

这是正确的,使用g@和“opfunc”是创建vim操作符的正确方法请参见:h操作符。我还建议大家看看Tim Pope的插件。这应该是一个很好的例子。我还建议使用一个新的,而不是重新发明一个,除非这是一个纯粹的教育活动。这是我做的练习。