我希望能够在正常模式下输入类似“Ncom”的内容,它将注释掉当前行和接下来的 N-1 行。我为此设置的键映射是。
:nmap com ^i#<ESC>j
这确实会注释掉当前行,但它对 N 行的作用与内置 vim 命令不同。我需要了解哪些有关 vim 的知识才能解释我希望发生的事情和实际发生的事情之间的差距?此外,我如何才能正确实现我想要的东西?
答案1
:nnoremap com :normal! I#<CR>
解释…
I
与 相同^i
但更好。通常,您应该执行以下操作来代替^i#<Esc>
:I#<Esc>
$a
顺便说一下,也是一样。:normal
是一个 Ex 命令,它允许您从命令行运行正常模式命令。它的用法如下,后跟<CR>
::normal! I#
当普通模式命令前面加上
count
:时6w
,该命令将执行 6 次。但是, 不会count
传播到后续命令:6wifoo
不会foo
在接下来 6 个单词之前添加。根据命令的不同,规则可能会有所不同:如果您不确定,请查阅文档。当 Ex 命令前面加上
count
: 时6:command
,Vim 会自动添加一个范围,从当前行开始到下面的第 行结束count-1
。如果你这样做6:normal! I#
,命令将变成::.,.+5normal! I#
意思是“
#
在这一行以及下面 5 行的第一个可打印字符前插入一个”。当 Vim 在映射中遇到带有 的 Ex 命令时,
:
它始终会添加相关范围。这就是为什么最好在:normal
要在多行上使用的映射中使用 或带有 的原因count
。
参见:help range
和:help :normal
。
答案2
我认为这个插件可以完成这个工作:https://github.com/tpope/vim-repeat
例子:
silent! call repeat#set("\<Plug>MyWonderfulMap", v:count)