diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e62294..1a75f16 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -91,6 +91,8 @@ rarely beneficial to show neighboring symbol locations (sometimes even same line!) when opening outline with the intention of getting an overall view of the file and jumping elsewhere. +- If auto-preview is enabled the preview window will automatically resize and + reposition ### Fixes diff --git a/README.md b/README.md index 1877eda..9c64818 100644 --- a/README.md +++ b/README.md @@ -949,6 +949,12 @@ preview_window = { https://github.com/hedyhli/outline.nvim/assets/50042066/a473d791-d1b9-48e9-917f-b816b564a645 +Note that auto-resizing of the preview window is only enabled for auto-preview. +Otherwise, close and reopen the preview after resizing the code window. + +https://github.com/hedyhli/outline.nvim/assets/50042066/b7f6d2b6-98b3-4557-8143-e49583e99d3b + + Alternatively, if you want to automatically navigate to the corresponding code location directly and not use the preview window: diff --git a/lua/outline/config.lua b/lua/outline/config.lua index 920f39e..a75afad 100644 --- a/lua/outline/config.lua +++ b/lua/outline/config.lua @@ -227,9 +227,9 @@ function M.should_include_symbol(kind, bufnr) end end - -- XXX: If the given kind is not known by outline.nvim (ie: not in - -- all_kinds), still return true. Only exclude those symbols that were - -- explicitly filtered out. + -- If the given kind is not known by outline.nvim (ie: not in all_kinds), + -- still return true. Only exclude those symbols that were explicitly + -- filtered out. return filter_table[kind] ~= false end diff --git a/lua/outline/preview.lua b/lua/outline/preview.lua index 0107c99..dc782aa 100644 --- a/lua/outline/preview.lua +++ b/lua/outline/preview.lua @@ -15,6 +15,7 @@ local Preview = {} ---@field outline_height integer ---@field s outline.Sidebar ---@field conf table +---@field size_augroup integer ---@class outline.LivePreview local LivePreview = {} @@ -30,6 +31,7 @@ local LivePreview = {} ---@field last_node outline.FlatSymbol ---@field initial_cursorline boolean ---@field conf table +---@field size_augroup integer ---@param conf table function Preview:new(conf) @@ -82,6 +84,30 @@ local function calc_row(self) return vim.api.nvim_win_get_position(self.s.view.win)[1] + offset end +---@param self outline.Preview|outline.LivePreview +local function update_size(self) + if self.size_augroup and (not self.win or not vim.api.nvim_win_is_valid(self.win)) then + vim.api.nvim_del_augroup_by_id(self.size_augroup) + self.win = nil + self.buf = nil + self.size_augroup = nil + return + end + + self.outline_height = vim.api.nvim_win_get_height(self.s.view.win) + self.width = self.conf.width + self.height = math.max(math.ceil(self.outline_height / 2), self.conf.min_height) + local row = calc_row(self) + local col = calc_col(self) + vim.api.nvim_win_set_config(self.win, { + height = self.height, + width = self.width, + row = row, + col = col, + relative = 'editor', + }) +end + function Preview:create() self.buf = vim.api.nvim_create_buf(false, true) vim.api.nvim_buf_attach(self.buf, false, { @@ -105,8 +131,21 @@ function Preview:create() }) self:setup() self:update() -end + if self.conf.auto_preview then + self.size_augroup = vim.api.nvim_create_augroup('outline_' .. self.s.id .. '_preview_size', { + clear = true, + }) + vim.api.nvim_create_autocmd('WinResized', { + -- XXX: Using view.win doesn't work here? + pattern = tostring(self.s.code.win), + group = self.size_augroup, + callback = function() + update_size(self) + end, + }) + end +end ---Set buf & win options, and setup highlight function Preview:setup() @@ -131,7 +170,6 @@ function Preview:setup() vim.api.nvim_win_set_option(self.win, 'cursorline', true) end - function Preview:update() local node = self.s:_current_node() if not node then @@ -195,6 +233,19 @@ function LivePreview:create() focusable = false, }) self:setup() + if self.conf.auto_preview then + self.size_augroup = vim.api.nvim_create_augroup('outline_' .. self.s.id .. '_preview_size', { + clear = true, + }) + vim.api.nvim_create_autocmd('WinResized', { + -- XXX: Using view.win doesn't work here? + pattern = tostring(self.s.code.win), + group = self.size_augroup, + callback = function() + update_size(self) + end, + }) + end end ---Set buf & win options, and autocmds @@ -209,7 +260,7 @@ function LivePreview:setup() callback = function() self.s.code.win = self.codewin self.win = nil - end + end, }) vim.api.nvim_create_autocmd('WinEnter', { pattern = tostring(self.win), @@ -217,7 +268,7 @@ function LivePreview:setup() callback = function() -- This doesn't work at all? vim.api.nvim_win_set_option(self.win, 'cursorline', self.initial_cursorline) - end + end, }) end diff --git a/lua/outline/sidebar.lua b/lua/outline/sidebar.lua index ae2d413..50fc38c 100644 --- a/lua/outline/sidebar.lua +++ b/lua/outline/sidebar.lua @@ -237,8 +237,8 @@ end ---Set hide_cursor depending on whether cursorline is 'focus_in_outline' function Sidebar:update_cursor_style() local cl = cfg.o.outline_window.show_cursorline - -- XXX: Still 'hide' cursor if show_cursorline set to false, because we've - -- already warned the user during setup. + -- Still 'hide' cursor if show_cursorline set to false, because we've already + -- warned the user during setup. local hide_cursor = type(cl) ~= 'string' if cl == 'focus_in_outline' or cl == 'focus_in_code' then @@ -342,6 +342,7 @@ function Sidebar:__refresh() end -- stylua: ignore start +-- TODO: Is this still needed? function Sidebar:_refresh() (utils.debounce(function() self:__refresh() end, 100))() end @@ -731,7 +732,7 @@ function Sidebar:build_outline(find_node) node.line == hovered_line or (hovered_line >= node.range_start and hovered_line <= node.range_end) then - -- XXX: not setting for children, but it works because when unfold is called + -- Not setting for children, but it works because when unfold is called -- this function is called again anyway. node.hovered = true table.insert(self.hovered, node)