在vim中执行<Plug>命令

82

我最近发现了一个vim插件,使用了<Plug>。例如,有一个命令<Plug>abc_def,我想执行它。

我已经尝试过:<Plug>abc_def等所有方法,但都没有成功。并且:help <Plug>也没有提供任何信息。

然而,我通过创建映射:map x <Plug>(unite_redraw)来执行它。然后我可以通过按下x来执行它。

现在,是否有任何方式可以在不创建虚拟映射的情况下执行:<Plug>abc_def?我使用的实际插件是Unite。

1个回答

116
<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大师撰写的有关该主题的文章

11
所以关键是 nmap 必须是 nmap,而不能是 nnoremap,因为它会把 <Plug>NiceCenterCursor 视为另一个映射。正确吗? - Tarrasch
9
@Tarrasch 确切地说,为了使这个工作正常,必须重新映射地图的右侧。对于 :normal 也是如此:使用重新映射的 :normal 是必要的,而不是非重新映射的 :normal! - glts
1
<Plug> 的具体部分在这里 - jdhao
谢谢您的帖子!但是,与创建命令相比如何呢? - roachsinai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接