18

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

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

这个语法没有记录在帮助文件的任何地方,也没有任何捆绑的 Vim 运行时文件使用它。尽管如此,这些插件还是可以很好地完成它们的工作。

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

4

3 回答 3

17

谢谢ZyX;您的回答已经涵盖了基础知识,所以让我补充一下我采用该<Plug>(PluginNameAndMore)符号的原因。(我想我是在夏野假名的插件中第一次看到它的。)

两个原因:

  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)
于 2012-12-04T08:10:31.437 回答
8

{lhs}映射命令和映射命令中的字节序列都是{rhs}可以包含任意数据(NUL 字节除外)的字节序列,只要它具有自然字节数({rhs}也允许字节数为零)。从这个角度来看,(…)实践与另一种相比没有优势。

特别是(textobj-…)有一个小优势:您可以选择{lhs}<Plug>a)运动部分的整体,并且在单词之间有更多可读的破折号。我不知道为什么要这样做,因为{lhs}可以使用aW( with <Plug> part) 选择整体。

我看不出 LineJuggler 版本有什么原因。

你最好向作者询问这一点。@IngoKarkat 在这里,在 stackoverflow 上,可能很快就会阅读这个问题。我不知道如何联系夏野假名。

于 2012-12-03T17:32:22.887 回答
2

<Plug>当调用之后的映射中还有其他击键时,Parens 使(对人类)更清楚。例如我有这个映射:

nmap ]c <Plug>GitGutterNextHunkzv

这使得]c跳转到下一个 Git 块,然后在zv那里打开任何折叠。但由于<Plug>名称是任意的,因此可以调用该命令GitGutterNextHunkzv。一般来说,使用<Plug>映射读取文件的人无法知道整个内容是名称还是后面有其他字符。

如果 GitGutter 插件在<Plug>名称中使用了括号 for,那么会更清楚地看到发生了什么:

nmap ]c <Plug>(GitGutterNextHunk)zv
于 2019-05-03T09:55:35.843 回答