许多插件通过<Plug>
地图访问其公共地图界面。然后,用户可以将这些映射用作他们自己的映射的钩子,例如, :nmap <Leader>fu <Plug>fooPluginUnlinkRootDir
。
最近我遇到了一些将地图名称放在括号中的插件,例如
<Plug>(textobj-indent-a)
在textobj-indent插件中,
{li> <Plug>(LineJugglerBlankUp)
在LineJuggler插件中。
此语法未在帮助文件中的任何位置记录,也没有任何捆绑的Vim运行时文件使用它。不过,这些插件做得很好。
括号的动机是什么?使用它们有什么好处吗?是否应该鼓励插件作者遵循这种做法(作为最佳实践)?
答案 0 :(得分:12)
谢谢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)
答案 1 :(得分:8)
映射命令中的{lhs}
和{rhs}
都是字节序列,只要具有自然的字节数({rhs}
,就可以包含任意数据(NUL字节除外)也允许具有零个字节数)。从这个角度来看(…)
实践没有其他优势。
专门针对(textobj-…)
,有一个小优势:您可以选择整个{lhs}
而不<Plug>
部分a)
动作,并且在单词之间有更多可读的破折号。我不知道为什么会这样做,因为可以使用{lhs}
( aW
部分)选择整个<Plug>
。
我没有看到LineJuggler版本的任何原因。
您最好向作者询问此事。 @IngoKarkat是here, on stackoverflow,很快就会读到这个问题。我不知道如何联系Kana Natsuno。
答案 2 :(得分:0)
当在<Plug>
调用之后的映射中还有其他击键时,Parens使(对于人类)更加清晰。例如,我有此映射:
nmap ]c <Plug>GitGutterNextHunkzv
这会使]c
跳到下一个Git块,然后执行zv
在此处打开任何折叠。但是由于<Plug>
是任意名称,因此命令可以被称为GitGutterNextHunkzv
。通常,没有人可以使用<Plug>
映射读取文件来知道整个内容是一个名称还是后面还有其他字符。
如果GitGutter插件在<Plug>
名称中使用了括号,那么可以清楚地看到正在发生的事情:
nmap ]c <Plug>(GitGutterNextHunk)zv