我想扩展现有和流行的vim插件的功能。该功能不属于插件本身,因为它不是插件功能的核心,但它会对很多人有所帮助,因此分叉和编辑没有意义。插件本身。
我正在寻找有关如何或引用另一个vim插件的指导,我可以将其用作示例。我的Google-fu没有提供任何帮助。如何在不创建上游插件的完整编辑版本的情况下开发扩展另一个插件功能的vim插件?
答案 0 :(得分:1)
这实际上取决于您现有的插件和您想要的扩展类型。
如果你很幸运,Vim已经提供了一个内置的扩展点;这里考虑:help after-directory
,对于扩展语法或文件类型插件非常有用。
另一个插件提供的映射和命令可以通过您自己的变体进行扩充。理想情况下,您可以使它们不同(例如,将:Foo
命令细化为扩展的:FooExtended
)。
如果您需要覆盖其中一个,那么您的插件需要确保首先获取现有插件。这可以通过以下代码完成:
:runtime! plugin/existingPlugin.vim
if ! exists('g:loaded_existingPlugin')
" Plugin does not exist, skip extending.
finish
endif
" Must use ! to override defined command.
command! Foo ...
这里的一个常见问题是,您希望从未公开的现有插件调用函数(作为 autoload 函数)。周围有一些黑客攻击(解析来自:scriptnames
的插件脚本ID),但我会首先尝试提交拉请求,要求原作者为您公开该功能。
对于非常深的扩展,即当您需要现有插件来了解您,并调用您的代码时,您可能需要支持和(继续)与现有插件的协调。根据您的想法撰写提案,并概述您需要的API。选择最通用的集成点,而不是最适合您的最简单的集成点。可用的技术有:
g:PluginName_ConfigName
):help Funcref
传递给插件函数,或配置为变量:help User
事件,以及您(和其他人)可以挂钩的事件(通过:autocmd User PluginName ...
):help Dictionaries
实现一种面向对象的形式,然后可以进行交换/扩充如果你能为你的功能做出令人信服的案例(1 + 1 = 3的协同作用,扩大用户群),如果它不属于原始插件(或者它的作者没有提供的知识) ),如果你能够识别出一组不会过多地破坏或复杂化现有插件的集成点,那么这可能是一个成功的策略;我亲自为多个插件做过。
作为最后的手段,总是可以选择分支现有的插件。如果原作者没有时间或不喜欢您的提案,则您没有任何其他选择。一些集成点太麻烦或引入太多开销。在这些情况下,您必须决定是否有时间跟上上游变化;如果用户必须选择将您的扩展程序与过时的基础进行选择,或者切换到更新的基础但却丢失扩展程序,那将是非常糟糕的。