diff --git a/lua/symbols-outline/config.lua b/lua/symbols-outline/config.lua index 795d241..d92a351 100644 --- a/lua/symbols-outline/config.lua +++ b/lua/symbols-outline/config.lua @@ -32,7 +32,7 @@ M.defaults = { preview_window = { auto_preview = false, width = 50, - min_width = 100, + min_width = 50, relative_width = true, bg_hl = 'Pmenu', border = 'single', @@ -132,6 +132,20 @@ function M.get_window_width() end end +function M.get_preview_width() + if M.o.preview_window.relative_width then + local relative_width = math.ceil(vim.o.columns * (M.o.preview_window.width / 100)) + + if relative_width < M.o.preview_window.min_width then + return M.o.preview_window.min_width + else + return relative_width + end + else + return M.o.preview_window.width + end +end + function M.get_split_command() if M.o.outline_window.position == 'left' then return 'topleft vs' diff --git a/lua/symbols-outline/preview.lua b/lua/symbols-outline/preview.lua index 0a62eb9..2e68bed 100644 --- a/lua/symbols-outline/preview.lua +++ b/lua/symbols-outline/preview.lua @@ -26,12 +26,14 @@ end M.has_code_win = has_code_win -local function get_offset() +local function get_width_offset() + ---@type integer local outline_winnr = so.view.winnr - local width = 53 - local height = 0 + local width = cfg.get_preview_width() + 3 + local has_numbers = vim.api.nvim_win_get_option(outline_winnr, "number") + has_numbers = has_numbers or vim.api.nvim_win_get_option(outline_winnr, "relativenumber") - if cfg.has_numbers() then + if has_numbers then width = width + 4 end @@ -40,7 +42,8 @@ local function get_offset() else width = vim.api.nvim_win_get_width(outline_winnr) + 1 end - return { height, width } + + return width end local function get_height() @@ -108,17 +111,16 @@ local function show_preview() state.preview_win = nil end, }) - local offsets = get_offset() local height = get_height() local winheight = math.ceil(height / 2) state.preview_win = vim.api.nvim_open_win(state.preview_buf, false, { relative = 'win', - width = 50, height = winheight, + width = cfg.get_preview_width(), bufpos = { 0, 0 }, - col = offsets[2], + col = get_width_offset(), -- Position preview window middle-aligned vertically - row = math.ceil((height - winheight) / 2), + row = math.floor((height - winheight) / 2) - 1, border = cfg.o.preview_window.border, }) setup_preview_buf()