首页 > 解决方案 > Vimscript 的构建工具是否存在?

问题描述

我想构建一小组 vimscript 库,但是,似乎使用它们的唯一方法是将它们全部加载到 vim 中。

此外,这意味着如果我想共享一个依赖于它们的单个脚本,我必须与它们所有人共享,这听起来很烦人。

我希望的是一些 common.js 和 webpack 风格的 vimscript 方法,这样的事情是否存在。一些东西:

我发现的所有东西最终都是插件管理器,而不是插件构建工具。

这样的事情存在吗?

标签: vim

解决方案


到目前为止的情况,直到 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、插件(vim 上下文中的原始含义,而不是可以一起安装的文件集)、语法文件、折叠插件、缩进插件、颜色方案、语言映射等等。Vim 体系结构并不期望所有内容都在一个文件中。

由于这些原因,我看不出我们如何构建系统来构建准备好分发的单个文件。它可以在某些情况下工作(函数和“类”的纯集合),但在一般情况下不行。


推荐阅读