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

在 Vimscript 中,脚本作用域 s: 可以用于避免插件之间的名称冲突。我正在用 Lua 编写一个 Vim 插件,发现 Vim 在一个共同的作用域中运行所有的 Lua 代码。这意味着我的插件 Lua 函数对使用 Lua 的任何其他插件都是可见的,似乎是一种等待发生名称冲突的情况。

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

点赞
用户145525
用户145525

我对 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

这样,即使在 audiobox.py 文件中有顶级函数,它们也会以“audiobox”为命名空间,因此现在可以通过 audiobox 访问它们。我相信类似的习惯用法也应该适用于 Lua。

对于我的插件 AudioBox,我只是利用业余时间学习如何使用 Python 接口构建了它,我将所需功能封装到一个类中,并通过 setup() 方法公开了一个相同的对象。您可以查看代码以获取更好的理解。

注:我不是 Python 专家,所以不要评判我的代码,这更多是一个爱好项目 :)。

2014-04-01 11:05:39