diff --git a/README.md b/README.md index 4e188647..ad512e3b 100644 --- a/README.md +++ b/README.md @@ -79,29 +79,29 @@ require("lazy").setup({ ## 🔌 Plugin Spec -| Property | Type | Description | -| ---------------- | --------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `[1]` | `string?` | Short plugin url. Will be expanded using `config.git.url_format` | -| **dir** | `string?` | A directory pointing to a local plugin | -| **url** | `string?` | A custom git url where the plugin is hosted | -| **name** | `string?` | A custom name for the plugin used for the local plugin directory and as the display name | -| **dev** | `boolean?` | When `true`, a local plugin directory will be used instead. See `config.dev` | -| **lazy** | `boolean?` | When `true`, the plugin will only be loaded when needed. Lazy-loaded plugins are automatically loaded when their Lua modules are `required`, or when one of the lazy-loading handlers triggers | -| **enabled** | `boolean?` or `fun():boolean` | When `false`, or if the `function` returns false, then this plugin will not be used | -| **dependencies** | `LazySpec[]` | A list of plugin specs that should be loaded when the plugin loads. Dependencies are always lazy-loaded unless specified otherwise | -| **init** | `fun(LazyPlugin)` | `init` functions are always executed during startup | -| **config** | `fun(LazyPlugin)` or `true` or `table` | `config` is executed when the plugin loads. You can also set to `true` or pass a `table`, that will be passed to `require("plugin").setup(opts)` | -| **build** | `fun(LazyPlugin)` or `string` | `build` is executed when a plugin is installed or updated. If it's a string it will be ran as a shell command. When prefixed with `:` it is a Neovim command. | -| **branch** | `string?` | Branch of the repository | -| **tag** | `string?` | Tag of the repository | -| **commit** | `string?` | Commit of the repository | -| **version** | `string?` | Version to use from the repository. Full [Semver](https://devhints.io/semver) ranges are supported | -| **pin** | `boolean?` | When `true`, this plugin will not be included in updates | -| **event** | `string?` or `string[]` | Lazy-load on event | -| **cmd** | `string?` or `string[]` | Lazy-load on command | -| **ft** | `string?` or `string[]` | Lazy-load on filetype | -| **keys** | `string?` or `string[]` or `LazyKeys[]` | Lazy-load on key mapping | -| **module** | `false?` | Do not automatically load this Lua module when it's required somewhere | +| Property | Type | Description | +| ---------------- | --------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `[1]` | `string?` | Short plugin url. Will be expanded using `config.git.url_format` | +| **dir** | `string?` | A directory pointing to a local plugin | +| **url** | `string?` | A custom git url where the plugin is hosted | +| **name** | `string?` | A custom name for the plugin used for the local plugin directory and as the display name | +| **dev** | `boolean?` | When `true`, a local plugin directory will be used instead. See `config.dev` | +| **lazy** | `boolean?` | When `true`, the plugin will only be loaded when needed. Lazy-loaded plugins are automatically loaded when their Lua modules are `required`, or when one of the lazy-loading handlers triggers | +| **enabled** | `boolean?` or `fun():boolean` | When `false`, or if the `function` returns false, then this plugin will not be used | +| **dependencies** | `LazySpec[]` | A list of plugin specs that should be loaded when the plugin loads. Dependencies are always lazy-loaded unless specified otherwise | +| **init** | `fun(LazyPlugin)` | `init` functions are always executed during startup | +| **config** | `fun(LazyPlugin)` or `true` or `table` | `config` is executed when the plugin loads. You can also set to `true` or pass a `table`, that will be passed to `require("plugin").setup(opts)` | +| **build** | `fun(LazyPlugin)` or `string` or a list of build commands | `build` is executed when a plugin is installed or updated. If it's a string it will be ran as a shell command. When prefixed with `:` it is a Neovim command. You can also specify a list to executed multiple build commands | +| **branch** | `string?` | Branch of the repository | +| **tag** | `string?` | Tag of the repository | +| **commit** | `string?` | Commit of the repository | +| **version** | `string?` | Version to use from the repository. Full [Semver](https://devhints.io/semver) ranges are supported | +| **pin** | `boolean?` | When `true`, this plugin will not be included in updates | +| **event** | `string?` or `string[]` | Lazy-load on event | +| **cmd** | `string?` or `string[]` | Lazy-load on command | +| **ft** | `string?` or `string[]` | Lazy-load on filetype | +| **keys** | `string?` or `string[]` or `LazyKeys[]` | Lazy-load on key mapping | +| **module** | `false?` | Do not automatically load this Lua module when it's required somewhere | ### Lazy Loading diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 90c687ec..c69f0489 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -19,7 +19,7 @@ local M = {} ---@class LazyPluginHooks ---@field init? fun(LazyPlugin) Will always be run ---@field config? fun(LazyPlugin)|true|table Will be executed when loading the plugin ----@field build? string|fun(LazyPlugin) +---@field build? string|fun(LazyPlugin)|(string|fun(LazyPlugin))[] ---@class LazyPluginHandlers: table ---@field event? string[] diff --git a/lua/lazy/manage/task/plugin.lua b/lua/lazy/manage/task/plugin.lua index 7bb9f336..a7d0ceeb 100644 --- a/lua/lazy/manage/task/plugin.lua +++ b/lua/lazy/manage/task/plugin.lua @@ -11,25 +11,25 @@ M.build = { run = function(self) Loader.load(self.plugin, { task = "build" }) - -- we need to source its plugin files before startup, - -- to make sure the build command has everything available - Loader.source_runtime(self.plugin.dir, "plugin") + local builders = self.plugin.build + if builders then + builders = type(builders) == "table" and builders or { builders } + ---@cast builders (string|fun(LazyPlugin))[] + for _, build in ipairs(builders) do + if type(build) == "string" and build:sub(1, 1) == ":" then + local cmd = vim.api.nvim_parse_cmd(build:sub(2), {}) + self.output = vim.api.nvim_cmd(cmd, { output = true }) + elseif type(build) == "function" then + build() + else + local shell = vim.env.SHELL or vim.o.shell + local shell_args = shell:find("cmd.exe", 1, true) and "/c" or "-c" - local build = self.plugin.build - if build then - if type(build) == "string" and build:sub(1, 1) == ":" then - local cmd = vim.api.nvim_parse_cmd(build:sub(2), {}) - self.output = vim.api.nvim_cmd(cmd, { output = true }) - elseif type(build) == "function" then - build() - else - local shell = vim.env.SHELL or vim.o.shell - local shell_args = shell:find("cmd.exe", 1, true) and "/c" or "-c" - - return self:spawn(shell, { - args = { shell_args, build }, - cwd = self.plugin.dir, - }) + self:spawn(shell, { + args = { shell_args, build }, + cwd = self.plugin.dir, + }) + end end end end,