feat: Auto-resize and re-position preview
Only for auto-preview.
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user