我最近发现了一个vim插件,使用了<Plug>
。例如,有一个命令<Plug>abc_def
,我想执行它。
我已经尝试过:<Plug>abc_def
等所有方法,但都没有成功。并且:help <Plug>
也没有提供任何信息。
然而,我通过创建映射:map x <Plug>(unite_redraw)
来执行它。然后我可以通过按下x
来执行它。
现在,是否有任何方式可以在不创建虚拟映射的情况下执行:<Plug>abc_def
?我使用的实际插件是Unite。
我最近发现了一个vim插件,使用了<Plug>
。例如,有一个命令<Plug>abc_def
,我想执行它。
我已经尝试过:<Plug>abc_def
等所有方法,但都没有成功。并且:help <Plug>
也没有提供任何信息。
然而,我通过创建映射:map x <Plug>(unite_redraw)
来执行它。然后我可以通过按下x
来执行它。
现在,是否有任何方式可以在不创建虚拟映射的情况下执行:<Plug>abc_def
?我使用的实际插件是Unite。
<Plug>
映射的目的是通过键位映射并通过地图调用。 <Plug>
地图是将插件操作的清晰接口暴露给用户的设备。例如,不要在插件的硬编码中将某些键映射到某些插件函数,比如“将zz
映射到‘美观地居中光标’的操作”。nnoremap <expr> zz 'zz'.float2nr(winheight(0)*0.1).'<C-E>'
插件最好只暴露一个命名为<Plug>
的映射:
nnoremap <expr> <Plug>NiceCenterCursor 'zz'.float2nr(winheight(0)*0.1).'<C-E>'
用户可以在其配置中重新映射,而无需复制和粘贴“操作”:
nmap zz <Plug>NiceCenterCursor
这样很容易被用户覆盖、重用和插入。
<Plug>
映射仅在其定义的模式中生效。要执行为普通模式定义的<Plug>
映射,可以像任何普通命令一样使用:normal
(不带感叹号)。
:execute "normal \<Plug>NiceCenterCursor"
由于<Plug>
实际上代表了一个特殊的魔术键,因此我们需要使用:normal
结合:execute
并转义<Plug>
。
关于<Plug>
机制的详细描述,请参见:h 41.11
。另请参见这篇由Vim大师撰写的有关该主题的文章。
nmap
必须是nmap
,而不能是nnoremap
,因为它会把<Plug>NiceCenterCursor
视为另一个映射。正确吗? - Tarrasch:normal
也是如此:使用重新映射的:normal
是必要的,而不是非重新映射的:normal!
。 - glts<Plug>
的具体部分在这里。 - jdhao