diff --git a/README.md b/README.md index 1425166..b23ad08 100644 --- a/README.md +++ b/README.md @@ -483,21 +483,21 @@ Any operation can be started from the UI, with a sub command or an API function: -| Command | Lua | Description | -| ------------------------- | -------------------------------- | --------------------------------------------------------------------------------------------- | -| `:Lazy check [plugins]` | `require("lazy").check(opts?)` | Check for updates and show the log (git fetch) | -| `:Lazy clean [plugins]` | `require("lazy").clean(opts?)` | Clean plugins that are no longer needed | -| `:Lazy clear` | `require("lazy").clear()` | Clear finished tasks | -| `:Lazy debug` | `require("lazy").debug()` | Show debug information | -| `:Lazy help` | `require("lazy").help()` | Toggle this help page | -| `:Lazy home` | `require("lazy").home()` | Go back to plugin list | -| `:Lazy install [plugins]` | `require("lazy").install(opts?)` | Install missing plugins | -| `:Lazy load {plugins}` | `require("lazy").load(opts)` | Load a plugin that has not been loaded yet. Similar to `:packadd`. Like `:Lazy load foo.nvim` | -| `:Lazy log [plugins]` | `require("lazy").log(opts?)` | Show recent updates | -| `:Lazy profile` | `require("lazy").profile()` | Show detailed profiling | -| `:Lazy restore [plugins]` | `require("lazy").restore(opts?)` | Updates all plugins to the state in the lockfile | -| `:Lazy sync [plugins]` | `require("lazy").sync(opts?)` | Run install, clean and update | -| `:Lazy update [plugins]` | `require("lazy").update(opts?)` | Update plugins. This will also update the lockfile | +| Command | Lua | Description | +| ------------------------- | -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | +| `:Lazy check [plugins]` | `require("lazy").check(opts?)` | Check for updates and show the log (git fetch) | +| `:Lazy clean [plugins]` | `require("lazy").clean(opts?)` | Clean plugins that are no longer needed | +| `:Lazy clear` | `require("lazy").clear()` | Clear finished tasks | +| `:Lazy debug` | `require("lazy").debug()` | Show debug information | +| `:Lazy help` | `require("lazy").help()` | Toggle this help page | +| `:Lazy home` | `require("lazy").home()` | Go back to plugin list | +| `:Lazy install [plugins]` | `require("lazy").install(opts?)` | Install missing plugins | +| `:Lazy load {plugins}` | `require("lazy").load(opts)` | Load a plugin that has not been loaded yet. Similar to `:packadd`. Like `:Lazy load foo.nvim` | +| `:Lazy log [plugins]` | `require("lazy").log(opts?)` | Show recent updates | +| `:Lazy profile` | `require("lazy").profile()` | Show detailed profiling | +| `:Lazy restore [plugins]` | `require("lazy").restore(opts?)` | Updates all plugins to the state in the lockfile. For a single plugin: restore it to the state in the lockfile or to a given commit under the cursor | +| `:Lazy sync [plugins]` | `require("lazy").sync(opts?)` | Run install, clean and update | +| `:Lazy update [plugins]` | `require("lazy").update(opts?)` | Update plugins. This will also update the lockfile | diff --git a/lua/lazy/view/config.lua b/lua/lazy/view/config.lua index 84bd294..1d0243a 100644 --- a/lua/lazy/view/config.lua +++ b/lua/lazy/view/config.lua @@ -96,8 +96,8 @@ M.commands = { }, restore = { button = true, - desc = "Updates all plugins to the state in the lockfile", - desc_plugin = "Restore a plugin to the state in the lockfile", + desc = "Updates all plugins to the state in the lockfile. For a single plugin: restore it to the state in the lockfile or to a given commit under the cursor", + desc_plugin = "Restore a plugin to the state in the lockfile or to a given commit under the cursor", id = 8, key = "R", key_plugin = "r", diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index 46a0235..e3007ec 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -164,6 +164,25 @@ function M:setup_patterns() self:diff({ commit = hash }) end, }, self.diff) + self:on_pattern(ViewConfig.commands.restore.key_plugin, { + [commit_pattern] = function(hash) + self:restore({ commit = hash }) + end, + }, self.restore) +end + +---@param opts? {commit:string} +function M:restore(opts) + opts = opts or {} + local Lockfile = require("lazy.manage.lock") + local Commands = require("lazy.view.commands") + local plugin = self.render:get_plugin() + if plugin then + if opts.commit then + Lockfile.get(plugin).commit = opts.commit + end + Commands.cmd("restore", { plugins = { plugin } }) + end end function M:hover() @@ -246,7 +265,7 @@ function M:setup_modes() Commands.cmd(name) end, m.desc) end - if m.key_plugin then + if m.key_plugin and name ~= "restore" then self:on_key(m.key_plugin, function() local plugin = self.render:get_plugin() if plugin then