diff --git a/lua/core/commands.lua b/lua/core/commands.lua index 22a98e2..6f86676 100644 --- a/lua/core/commands.lua +++ b/lua/core/commands.lua @@ -17,14 +17,43 @@ vim.api.nvim_create_user_command("PluginUnwatch", function() require("pack").unwatch() end, { desc = "Stop watching plugin configs" }) +local function complete_plugin_names(lead) + return vim.tbl_filter(function(name) + return name:find(lead, 1, true) == 1 + end, require("pack").get_names()) +end + vim.api.nvim_create_user_command("PluginReload", function(opts) require("pack").reload_plugin(opts.args) end, { nargs = 1, - complete = function(lead) - return vim.tbl_filter(function(name) - return name:find(lead, 1, true) == 1 - end, require("pack").get_names()) - end, + complete = complete_plugin_names, desc = "Reload a plugin config by name", }) + +vim.api.nvim_create_user_command("PluginUpdate", function(opts) + local names = #opts.fargs > 0 and opts.fargs or nil + require("pack").update(names) +end, { + nargs = "*", + complete = complete_plugin_names, + desc = "Update plugins (fetch from remote)", +}) + +vim.api.nvim_create_user_command("PluginUpdateOffline", function(opts) + local names = #opts.fargs > 0 and opts.fargs or nil + require("pack").update(names, { offline = true }) +end, { + nargs = "*", + complete = complete_plugin_names, + desc = "Show pending plugin updates without fetching from remote", +}) + +vim.api.nvim_create_user_command("PluginRestore", function(opts) + local names = #opts.fargs > 0 and opts.fargs or nil + require("pack").update(names, { target = "lockfile" }) +end, { + nargs = "*", + complete = complete_plugin_names, + desc = "Restore plugins to revisions in the lockfile", +}) diff --git a/lua/core/keymap.lua b/lua/core/keymap.lua index b9fd776..eace268 100644 --- a/lua/core/keymap.lua +++ b/lua/core/keymap.lua @@ -233,14 +233,6 @@ vim.keymap.set("n", "fD", vim.diagnostic.setqflist) vim.keymap.set("n", "grt", vim.lsp.buf.type_definition) vim.keymap.set("n", "gd", vim.lsp.buf.definition) -vim.keymap.set("n", "pp", function() - vim.pack.update(nil, { offline = true }) -end) -vim.keymap.set("n", "pu", vim.pack.update) -vim.keymap.set("n", "pr", function() - vim.pack.update(nil, { target = "lockfile" }) -end) - -- Default bindings that are good to know: -- insert mode: -- - indent, see :h i_CTRL-T diff --git a/lua/pack.lua b/lua/pack.lua index 688810f..14da174 100644 --- a/lua/pack.lua +++ b/lua/pack.lua @@ -130,12 +130,45 @@ local watcher = nil ---@type ow.Util.KeyedDebounceHandle? local on_change_handle = nil +---@alias ow.Pack.Hook fun(ev: ow.Pack.Event.Data) + +---@type table +local hooks = {} + ---@class ow.Pack ---@field plugins ow.Pack.Plugin[] local M = { plugins = {}, } +---@param name string +---@param fn ow.Pack.Hook +function M.register_hook(name, fn) + hooks[name] = fn +end + +local function setup_event_listener() + local group = + vim.api.nvim_create_augroup("ow.Pack.events", { clear = true }) + vim.api.nvim_create_autocmd("PackChanged", { + group = group, + ---@param ev ow.Pack.Event + callback = function(ev) + local name = ev.data.spec.name + if not name then + return + end + if ev.data.kind ~= "install" and ev.data.kind ~= "update" then + return + end + local hook = hooks[name] + if hook then + hook(ev.data) + end + end, + }) +end + ---@return string[] function M.get_names() return vim.tbl_map(function(p) @@ -277,11 +310,25 @@ function M.setup(specs) end) for _, plugin in ipairs(M.plugins) do - if plugin.build and changed[plugin.name] then - run_build(plugin) + if plugin.build then + if changed[plugin.name] then + run_build(plugin) + end + M.register_hook(plugin.name, function(ev) + plugin.path = ev.path + run_build(plugin) + end) end load(plugin.name, false) end + + setup_event_listener() +end + +---@param names? string[] +---@param opts? table +function M.update(names, opts) + vim.pack.update(names, opts) end return M