括号<Plug>地图名称的原因是什么?

glt*_*lts 16 vim vim-plugin

许多插件使他们的公共映射界面可以通过<Plug>地图访问.然后,用户可以将这些映射用作他们自己映射的钩子,例如:nmap <Leader>fu <Plug>fooPluginUnlinkRootDir.

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

此语法未在帮助文件中的任何位置记录,也不会使用任何捆绑的Vim运行时文件.不过,这些插件可以很好地完成它们的工作.

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

Ing*_*kat 14

谢谢ZyX; 你的答案已经涵盖了基础知识,所以让我加上为什么我采用了这种<Plug>(PluginNameAndMore)表示法.(我想我先在Kana Natsuno的插件中看过它.)

两个原因:

  1. 使用其他东西包装映射时,可以更直观地解析各个映射目标,如下所示:

    imap <C-x><C-c> <Plug>(CompleteStart)<Plug>(CamelCaseComplete)<SID>(CamelCaseCompleteModifyUndo)<Plug>(CamelCasePostComplete)<Plug>(CompleteoptLongestSelect)

  2. 在为插件定义多个映射时,必须注意一个的LHS不包含在另一个映射中.否则,触发映射时会有延迟,因为Vim需要等待额外的击键才能解决歧义.右括号可以防止任何这种歧义.


BAD                 GOOD
<Plug>MyFunc        <Plug>MyFuncNext, <Plug>(MyFunc)
<Plug>MyFuncReverse <Plug>MyFuncPrev, <Plug>(MyFuncReverse)
Run Code Online (Sandbox Code Playgroud)


ZyX*_*ZyX 8

两者的{lhs}{rhs}在映射命令是可以包含任意的数据(除NUL字节),只要它具有的字节自然数(为字节序列{rhs}具有零的字节数也被允许).从这个角度来看,(…)实践没有优势.

特别是因为(textobj-…)有一个小优点:你可以选择整个{lhs}没有运动的<Plug>部分,a)并且在单词之间有更多可读的破折号.我不知道,虽然一个为什么要这么做作为整体{lhs}可以选择aW( <Plug>部分).

我没有看到LineJuggler版本的任何原因.

您最好向作者询问此事.@IngoKarkat在这里,在stackoverflow上,很可能会很快阅读这个问题.我不知道如何联系Kana Natsuno.