diff --git a/lua/trouble/config/init.lua b/lua/trouble/config/init.lua index 630bb8b..eccea1f 100644 --- a/lua/trouble/config/init.lua +++ b/lua/trouble/config/init.lua @@ -18,6 +18,7 @@ local defaults = { auto_preview = true, -- automatically open preview when on an item auto_refresh = true, -- auto refresh when open focus = false, -- Focus the window when opened + restore = true, -- restores the last location in the list when opening follow = true, -- Follow the current item indent_guides = true, -- show indent guides max_items = 200, -- limit number of items that can be displayed per section diff --git a/lua/trouble/view/init.lua b/lua/trouble/view/init.lua index d9bf968..4657d0e 100644 --- a/lua/trouble/view/init.lua +++ b/lua/trouble/view/init.lua @@ -20,6 +20,9 @@ local _idx = 0 ---@type table M._views = setmetatable({}, { __mode = "k" }) +---@type table +M._last = {} + ---@param opts trouble.Mode function M.new(opts) local self = setmetatable({}, M) @@ -30,6 +33,9 @@ function M.new(opts) self.opts.win.on_mount = function() self:on_mount() end + self.opts.win.on_close = function() + M._last[self.opts.mode or ""] = self:at() + end self.sections = {} for _, s in ipairs(Spec.sections(self.opts)) do @@ -408,7 +414,13 @@ function M:render() if not self.win:valid() then return end + local loc = self:at() + local restore_loc = self.opts.restore and M._last[self.opts.mode or ""] + if restore_loc then + loc = restore_loc + M._last[self.opts.mode or ""] = nil + end -- render sections self.renderer:clear() @@ -441,7 +453,7 @@ function M:render() end -- when window is at top, dont move cursor - if view.topline == 1 then + if not restore_loc and view.topline == 1 then return end diff --git a/lua/trouble/view/render.lua b/lua/trouble/view/render.lua index 0d1c6cd..ef30d33 100644 --- a/lua/trouble/view/render.lua +++ b/lua/trouble/view/render.lua @@ -4,8 +4,9 @@ local Indent = require("trouble.view.indent") local Text = require("trouble.view.text") local Util = require("trouble.util") +---@alias trouble.Render.Location {item?: trouble.Item, node?: trouble.Node, first_line?:boolean} ---@class trouble.Render: trouble.Text ----@field _locations {item?: trouble.Item, node?: trouble.Node, first_line?:boolean}[] Maps line numbers to items. +---@field _locations trouble.Render.Location[] Maps line numbers to items. ---@field _folded table ---@field root_nodes trouble.Node[] ---@field foldlevel? number diff --git a/lua/trouble/view/window.lua b/lua/trouble/view/window.lua index 8a30652..b3beb54 100644 --- a/lua/trouble/view/window.lua +++ b/lua/trouble/view/window.lua @@ -32,6 +32,7 @@ local Util = require("trouble.util") ---@field minimal? boolean (defaults to true) ---@field win? number ---@field on_mount? fun(self: trouble.Window) +---@field on_close? fun(self: trouble.Window) ---@alias trouble.Window.opts trouble.Window.base|trouble.Window.split|trouble.Window.float|trouble.Window.main @@ -205,6 +206,9 @@ function M:mount() self:on({ "BufWinLeave" }, vim.schedule_wrap(self.check_alien)) self:on("WinClosed", function() + if self.opts.on_close then + self.opts.on_close(self) + end self:augroup(true) end, { win = true })