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

时间:2012-12-03 16:56:24

标签: vim vim-plugin

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

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

此语法未在帮助文件中的任何位置记录,也没有任何捆绑的Vim运行时文件使用它。不过,这些插件做得很好。

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

3 个答案:

答案 0 :(得分:12)

谢谢ZyX;你的答案已经涵盖了基础知识,所以我只想补充为什么我采用了<Plug>(PluginNameAndMore)符号。 (我想我先在Kana Natsuno的插件中看过它。)

有两个原因:

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

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

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


  3. 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