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



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

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

遗憾的是,此映射无法在计数中正常工作。特别是,键入4=似乎具有与键入=相同的效果。

基于这个 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](在映射中解决这个问题。插件的实现必须支持计数,显然,这个不需要:<Plug>VimwikiAddHeaderLevel映射到:<C-U>call vimwiki#base#AddHeaderLevel()<CR>,因此任何计数都会导致自动预置范围,然后<C-U>删除该范围。vimwiki#base#AddHeaderLevel()函数必须通过v:count(或v:count1(获取计数,但它没有。

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

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

[1] 好吧,如果可以通过在同一位置重复执行映射来获得效果,则可以编写一个带有:for v:count循环的包装器函数,该函数通过以下方式调用映射

:execute "normal <Plug>VimwikiAddHeaderLevel"

最新更新