许多插件使它们的公共映射接口可通过<Plug>映射访问。然后,用户可以将这些地图用作其自身映射的挂钩,例如:nmap <Leader>fu <Plug>fooPluginUnlinkRootDir

最近,我遇到了一些将其地图名称放在方括号中的插件,例如


textobj-indent插件中的<Plug>(textobj-indent-a)
LineJuggler插件中的<Plug>(LineJugglerBlankUp)


在帮助文件中的任何地方都没有记录该语法,捆绑的Vim运行时文件也没有使用该语法。不过,这些插件可以正常工作。

括号的动机是什么?使用它们有什么好处吗?应该鼓励插件作者遵循这种做法(作为最佳做法)吗?

最佳答案

谢谢ZyX;您的答案已经涵盖了基础知识,所以让我仅添加为什么采用<Plug>(PluginNameAndMore)表示法即可。 (我想我是在Kana Natsuno的插件中首先看到它的。)

两个原因:


当将映射与其他内容包装在一起时,可以更直观地解析各个映射目标,例如:

imap <C-x><C-c> <Plug>(CompleteStart)<Plug>(CamelCaseComplete)<SID>(CamelCaseCompleteModifyUndo)<Plug>(CamelCasePostComplete)<Plug>(CompleteoptLongestSelect)
为一个插件定义多个映射时,必须注意一个映射的LHS不包含在另一个映射中。否则,触发映射时会有延迟,因为Vim需要等待其他击键才能解决歧义。右括号可以防止任何此类歧义。




BAD                 GOOD
<Plug>MyFunc        <Plug>MyFuncNext, <Plug>(MyFunc)
<Plug>MyFuncReverse <Plug>MyFuncPrev, <Plug>(MyFuncReverse)

10-08 08:54