如何封装用Lua/Python/Ruby编写的Vim插件代码?

如何封装用Lua/Python/Ruby编写的Vim插件代码?,vim,lua,encapsulation,vim-plugin,Vim,Lua,Encapsulation,Vim Plugin,在Vimscript中,可以使用脚本作用域s:来避免插件之间的名称冲突。我正在用Lua编写一个Vim插件,我注意到Vim在一个公共范围内运行其所有Lua代码。这意味着我的插件的Lua函数对任何其他使用Lua的插件都是可见的,并且看起来像是一个名称冲突正在等待发生 尽管我的示例涉及Lua,但在Python或Ruby中开发Vim插件时,这个问题也适用。我可以在我所有的Lua函数前面加上插件名,但是在使用这些语言时,有没有更可靠/标准的方法来封装Vim插件代码呢?我对Lua没有太多经验,但对于pyth

在Vimscript中,可以使用脚本作用域
s:
来避免插件之间的名称冲突。我正在用Lua编写一个Vim插件,我注意到Vim在一个公共范围内运行其所有Lua代码。这意味着我的插件的Lua函数对任何其他使用Lua的插件都是可见的,并且看起来像是一个名称冲突正在等待发生


尽管我的示例涉及Lua,但在Python或Ruby中开发Vim插件时,这个问题也适用。我可以在我所有的Lua函数前面加上插件名,但是在使用这些语言时,有没有更可靠/标准的方法来封装Vim插件代码呢?

我对Lua没有太多经验,但对于python来说,情况也很相似,特别是如果使用“pyfile”(luafile可能非常相似)。更好的、推荐的方法(尤其是python)如下所示:

if !exists('g:audiobox_py_loaded')
  python import sys, vim
  python if vim.eval('expand("<sfile>:p:h")') not in sys.path:
        \  sys.path.append(vim.eval('expand("<sfile>:p:h")'))
  python import audiobox
endif
if!存在('g:audiobox\u py\u loaded')
python导入系统,vim
python如果vim.eval('expand('p:h'))不在sys.path中:
\sys.path.append(vim.eval('expand(“:p:h”))
python导入音箱
恩迪夫
这样,即使您在audiobox.py文件中有顶级函数,它们也将以“audiobox”的方式命名,因此现在可以通过audiobox访问。我相信lua也应该有类似的习惯用法

对于我的插件,我在业余时间构建它只是为了学习如何使用python进行接口,我将其提升到了下一个级别,并将所需的功能包装到一个类中,并通过setup()方法公开了相同的对象。您可以查看代码以获得更好的想法


注意:无论如何,我都不是python专家,所以不要评判我的代码,这更像是一个爱好项目:)。

我对vib一无所知,但如果你的插件是独立的lua块,那么你可以只使用局部函数/变量或使用独立的环境。这至少比在插件名称前加前缀要好。