是否存在Vimscript的构建工具?
我想构建一小组 vimscript 库,但是,似乎使用它们的唯一方法是将它们全局加载到 vim 中。
此外,这意味着如果我想共享依赖于这些的单个脚本,我必须将它们全部共享,这听起来很烦人。
我所希望的是一些 common.js 和 webpack 风格的 vimscript 方法,这样的事情是否存在。一些东西:
- 解决依赖关系
- 允许将 vimscript 文件“捆绑”到一个文件中。
我发现的一切,最终都是一个插件管理器,而不是一个插件构建工具。
这样的东西存在吗?
回答
到目前为止的情况,直到 Vim 8。
没有脚本隔离。加载脚本时,它是全局的。脚本可以隐藏变量和函数,仅此而已。
共享/导出一个函数非常简单:我们将它放在一个自动加载插件中,我们只需要使用名为dirrelatativeto_rtp#subdir#suddir...#scriptname#funcname(). 如果脚本scriptname.vim安装在dirrelatativeto_rtp/subdir/subdir中注册的目录中的某处'runtimepath',它将自动加载。
关于命令、缩写、映射……它们应该在插件文件或 ftplugin 文件中定义——当我们想要子模式时,其他方法也是可能的。此外,我们不能从自动加载插件中或在加载脚本时天真地使用它们——我们必须明确地使用它们:runtime来加载定义此命令/映射/...的脚本(就像我们import 在 Python 中所做的那样) )。
然而,与 Python 一样,脚本不会自动安装在我们的系统上。手动触发脚本的安装仍然取决于我们。
我们可以决定拥有依赖于这些库的库插件和其他插件。但是,我们需要告诉最终用户必须手动安装的所有内容,或者告诉他/她停止使用不了解依赖项的插件管理器。
多年来,这一直是我个人的咆哮,流行的插件管理器不了解依赖项。到目前为止只有两个插件管理器这样做:
-
Vim-Addon-Manager(又名 VAM):它依赖于一个中央存储库(vim-pi)来安装一个插件(及其依赖项),只有它的名字(例如
:InstallAddon fugitive,:InstallAddon lh-cpp)。不幸的是,中央存储库不再维护,我们无法注册新名称。幸运的是,我们总是可以使用:InstallAddon github:{N}/{repo}. 其他功能可用于从 .vimrc 安装。 -
和 vim-flavor 用 ruby 编写,并将插件安装为 Vim 8 包。
两者都有自己的语法来声明依赖项。与 VAM 不同,我们可以使用 vim-flavor 指定插件版本的约束。
最后一件事,如果我们不想分发所有文件,我们可以将它们组织为几个“插件”。但要注意循环依赖。善待使用这些不了解依赖项的流行插件管理器的最终用户,因为他们需要明确安装许多“插件”
从 Vim 9 开始
我们可以开始隔离导入的插件,因为两个插件可以定义同名的函数或命令。同样,这个特性似乎模仿了 Python 的做事方式。
但是,我希望像自动命令这样的全球性东西继续在全球范围内运行。例如:我不知道我们如何可以同时运行两个模板扩展器插件。
Vim 9 新的脚本语言不会改变我们依赖的插件安装。
免责声明:我一直将我的插件维护为一堆相互依赖的插件,围绕一些库插件组织,因为我不喜欢多次重复相同的东西,这已经快 2 年了。在我对dependencies & co 的咆哮中,我快速探索了其他可用的替代方法。
回到捆绑/包装问题(编辑)
我们有办法将文件打包在一起。
- 我们总是可以手动定义插件:将文件放在目录树中,使用 git 等等。
- 我们可以定义tarball。
- 我们也可以定义 vimball。Vimballs 是可安装存档的一个相当古老的解决方案:文件被放置在正确的目录中,并生成文档标签。有多种方法可以生产vimball。我继续保持脚本š生产他们帮助了我所有的插件。但老实说,这不是人们现在安装插件所期望的。我只是保留它们以防我在 vim.org 上发布我的插件的新版本。
在任何情况下,这些解决方案都没有定义我们放在~/.vim/目录中某个位置的单个文件。我认为我们永远不会有这样的事情,因为:
-
隔离并不完美。即使使用 Vim 9 新脚本语言:我不明白我们如何正确处理自动命令的重复。如果定义自动命令的同一个文件在多个分布式“插件”中的不同版本中重复,我看不出 Vim 如何正确处理它。
-
Vim 期望在不同的地方有不同的文件:ftplugins、plugins(vim 上下文中的原始含义,不是可以安装在一起的文件集)、语法文件、折叠插件、缩进插件、colorschemes、langmaps 等等。Vim 体系结构并不期望在单个文件中包含所有内容。
由于这些原因,我看不出我们如何能够构建系统来构建准备分发的单个文件。它可以在某些情况下工作(函数和“类”的纯集合),但不能在一般情况下工作。