如何以允许计数的方式映射插件定义的函数调用?

时间:2019-02-11 19:11:26

标签: vim

在Vimwiki源代码中,以下行将键=映射到表达式<Plug>VimwikiAddHeaderLevel

nmap <silent><buffer> = <Plug>VimwikiAddHeaderLevel

不幸的是,此映射无法正确计数。特别是,键入4=与输入=具有相同的效果。

基于this vimcast,我首先尝试使用表达式寄存器来纠正映射。

:nnoremap <buffer> = @=<Plug>VimwikiAddHeaderLevel<CR>

不幸的是,当我输入=时,出现以下错误。

E15: Invalid expression: <Plug>VimwikiAddHeaderLevel

接下来,我尝试了:normal方法。

:nnoremap <buffer> = :normal <Plug>VimwikiAddHeaderLevel<CR>

当我键入=时,这不会导致任何错误,但对缓冲区也没有可见的影响。我还尝试了映射的递归版本,但效果相同。

:nmap <buffer> = :normal <Plug>VimwikiAddHeaderLevel<CR>

进行映射以使其能够接受计数的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

您不能(轻松[1])在映射中解决此问题。插件的实现必须支持一个计数,显然,该计数不支持:<Plug>VimwikiAddHeaderLevel映射到:<C-U>call vimwiki#base#AddHeaderLevel()<CR>,因此任何计数都会导致自动添加范围,<C-U>然后删除。 vimwiki#base#AddHeaderLevel()函数必须通过v:count(或v:count1)来获取计数,但事实并非如此。

或者,可以用:function属性定义range,然后将其传递给a:firstlinea:lastline; cp。 :help function-range-example。否则必须删除<C-U>,然后每行调用一次该函数。

因此,如果您认为支持计数很有意义,请向项目提交问题(或请求请求)。

[1]好吧,如果可以通过在同一位置重复执行映射来获得效果,则可以在:for上使用v:count循环编写包装函数,该循环通过< / p>

:execute "normal \<Plug>VimwikiAddHeaderLevel"