diff --git a/README.md b/README.md index 0670dc5..d209c4c 100644 --- a/README.md +++ b/README.md @@ -34,10 +34,11 @@ Below is a list of features I've included in this fork which, at the time of writing, has not been included upstream (in the original repo). I try my best to keep this list up to date. -Features: +Features/Changes: - Feat: Toggling folds (and added default keymaps for it) (simrat39/symbols-outline.nvim#194) + - Feat: Control focus between outline and code window. - New commands: SymbolsOutline`Focus,FocusOutline,FocusCode` (see [commands](#commands)) @@ -45,10 +46,21 @@ Features: - simrat39/symbols-outline.nvim#143 - simrat39/symbols-outline.nvim#174 - simrat39/symbols-outline.nvim#207 + - Feat: when `auto_close=true` only auto close if `goto_location` is used (where focus changed), and not for `focus_location` (simrat39/symbols-outline.nvim#119) + - Feat: Cursorline option for the outline window +- MAJOR: Removed hover floating window from `toggle_preview`. + - Instead, you can set `open_hover_on_preview=true` (true by default) so that + the `hover_symbol` action can be triggered when `toggle_preview`is + triggered. + - The preview window's size changed to half of neovim height (rather than a + third). This is planned to be configurable. + - The preview window is positioned to be vertically center-aligned (rather + than fixed to the top). This is planned to be configurable. + Fixes: - Fix symbol preview (simrat39/symbols-outline.nvim#176) @@ -60,6 +72,12 @@ Fixes: ### PRs +Key: +``` +✅ = Either merged superseded +📮 = Planned for merge +``` + - Open handler checks if view is not already open (#235 by eyalz800) @@ -107,10 +125,10 @@ Fixes: - feat: Add window_bg_highlight to config (#137 by Zane-) -- Added preview width and relative size +- 📮 Added preview width and relative size (#130 by Freyskeyd) -- Improve preview, hover windows configurability and looks +- 📮 Improve preview, hover windows configurability and looks (#128 by toppair) - ✅ Do not close outline when focus_location occurs @@ -128,7 +146,7 @@ Fixes: ### TODO -KEY: +Key: ``` - [ ] : Planned - [/] : WIP @@ -138,19 +156,24 @@ KEY: Items will be moved to above list when complete. - Folds - - [ ] Org-like shift+tab behavior: Open folds level-by-level - - [ ] Optionally not opening all child nodes when opening parent node + - `[ ]` Org-like shift+tab behavior: Open folds level-by-level + - `[ ]` Optionally not opening all child nodes when opening parent node - Fold siblings and siblings of parent on startup - Navigation - Go to parent - Cycle siblings -- [ ] simrat39/symbols-outline.nvim#75: Handling of the outline window when attached +- `[ ]` simrat39/symbols-outline.nvim#75: Handling of the outline window when attached buffer is closed. Maybe it should continue working, so that pressing enter can open a split to the correct location, and pressing `q` can properly close the buffer. +- Preview / Hover + - `[/]` Configurable winhighlight options for preview window (like nvim-cmp) + (simrat39/symbols-outline#128) + - `[/]` Configurable width and height (simrat39/symbols-outline#130) + ### Related plugins - nvim-navic @@ -229,16 +252,26 @@ require("symbols-outline").setup({}) ## Configuration -Pass a table to the setup call above with your configuration options. +### Terminology + +- **Provider**: Source of the items in the outline view. Could be LSP, CoC, etc. +- **Node**: An item in the outline view +- **Fold**: Collapse a collapsible node +- **Location**: Where in the source file a node is from +- **Preview**: Peek the location of a node in code using a floating window +- **Hover**: Cursor currently on the line of a node +- **Hover symbol**: Displaying a floating window to show symbol information +provided by provider. +- **Focus**: Which window the cursor is in + +### Options + +Pass a table to the setup call with your configuration options. + +Default values are shown: ```lua local opts = { - -- Whether to highlight the currently hovered symbol (high cpu usage) - highlight_hovered_item = true, - -- Whether to show outline guides - show_guides = true, - -- Automatically open preview of code on hover - auto_preview = false, -- Where to open the split window: right/left position = 'right', -- Whether width is relative to existing windows @@ -246,10 +279,21 @@ local opts = { -- Percentage or integer of columns width = 25, + -- Whether to highlight the currently hovered symbol (high cpu usage) + highlight_hovered_item = true, + -- Whether to show outline guides + show_guides = true, + -- Automatically open preview of code on hover + auto_preview = false, + -- Automatically open hover_symbol when opening toggle_preview (see keymaps). + -- If you disable this you can still open hover_symbol using your keymap + -- below. + open_hover_on_preview = true, -- Behaviour changed in this fork: -- Auto close the outline window if goto_location is triggered and not for -- focus_location auto_close = false, + -- Vim options for the outline window show_numbers = false, show_relative_numbers = false, diff --git a/lua/symbols-outline/config.lua b/lua/symbols-outline/config.lua index a1bcf89..438e9e8 100644 --- a/lua/symbols-outline/config.lua +++ b/lua/symbols-outline/config.lua @@ -11,6 +11,7 @@ M.defaults = { width = 25, auto_close = false, auto_preview = false, + open_hover_on_preview = true, show_numbers = false, show_relative_numbers = false, show_cursorline = true, diff --git a/lua/symbols-outline/hover.lua b/lua/symbols-outline/hover.lua index cc75e81..683811d 100644 --- a/lua/symbols-outline/hover.lua +++ b/lua/symbols-outline/hover.lua @@ -1,4 +1,5 @@ local so = require 'symbols-outline' +local soconfig = require 'symbols-outline.config' local util = vim.lsp.util local M = {} @@ -28,7 +29,6 @@ function M.show_hover() ---@diagnostic disable-next-line: param-type-mismatch function(_, result, _, config) if not (result and result.contents) then - -- return { 'No information available' } return end local markdown_lines = util.convert_input_to_markdown_lines( @@ -36,10 +36,12 @@ function M.show_hover() ) markdown_lines = util.trim_empty_lines(markdown_lines) if vim.tbl_isempty(markdown_lines) then - -- return { 'No information available' } return end - return util.open_floating_preview(markdown_lines, 'markdown', config) + -- FIXME + local bufnr, winnr = util.open_floating_preview(markdown_lines, 'markdown', config) + local winhi = 'Normal:' .. soconfig.options.preview_bg_highlight + vim.api.nvim_win_set_option(winnr, 'winhighlight', winhi) end ) end diff --git a/lua/symbols-outline/preview.lua b/lua/symbols-outline/preview.lua index 50a886f..1715d61 100644 --- a/lua/symbols-outline/preview.lua +++ b/lua/symbols-outline/preview.lua @@ -1,13 +1,12 @@ local so = require 'symbols-outline' local config = require 'symbols-outline.config' +local hover = require 'symbols-outline.hover' local M = {} local state = { preview_buf = nil, preview_win = nil, - hover_buf = nil, - hover_win = nil, } local function is_current_win_outline() @@ -43,8 +42,7 @@ local function get_offset() end local function get_height() - local uis = vim.api.nvim_list_uis() - return math.ceil(uis[1].height / 3) + return vim.api.nvim_list_uis()[1].height end local function get_hovered_node() @@ -90,78 +88,13 @@ local function setup_preview_buf() update_preview(code_buf) end -local function get_hover_params(node, winnr) - local bufnr = vim.api.nvim_win_get_buf(winnr) - local uri = vim.uri_from_bufnr(bufnr) - - return { - textDocument = { uri = uri }, - position = { line = node.line, character = node.character }, - bufnr = bufnr, - } -end - -local function update_hover() - if not has_code_win() then - return - end - - local node = get_hovered_node() - if not node then - return - end - - local provider = _G._symbols_outline_current_provider - local params = get_hover_params(node, so.state.code_win) - - provider.hover_info(params.bufnr, params, function(err, result) - if err then - print(vim.inspect(err)) - return - end - local markdown_lines = {} - if result ~= nil then - markdown_lines = vim.lsp.util.convert_input_to_markdown_lines( - result.contents - ) - end - markdown_lines = vim.lsp.util.trim_empty_lines(markdown_lines) - if vim.tbl_isempty(markdown_lines) then - markdown_lines = { 'No info available' } - end - - markdown_lines = vim.lsp.util.stylize_markdown( - state.hover_buf, - markdown_lines, - {} - ) - - if state.hover_buf ~= nil then - vim.api.nvim_buf_set_lines(state.hover_buf, 0, -1, 0, markdown_lines) - end - end) -end - -local function setup_hover_buf() - if not has_code_win() then - return - end - local code_buf = vim.api.nvim_win_get_buf(so.state.code_win) - local ft = vim.api.nvim_buf_get_option(code_buf, 'filetype') - vim.api.nvim_buf_set_option(state.hover_buf, 'syntax', ft) - vim.api.nvim_buf_set_option(state.hover_buf, 'bufhidden', 'delete') - vim.api.nvim_win_set_option(state.hover_win, 'wrap', true) - vim.api.nvim_win_set_option(state.hover_win, 'cursorline', false) - update_hover() -end - local function set_bg_hl() local winhi = 'Normal:' .. config.options.preview_bg_highlight vim.api.nvim_win_set_option(state.preview_win, 'winhighlight', winhi) - vim.api.nvim_win_set_option(state.hover_win, 'winhighlight', winhi) + -- vim.api.nvim_win_set_option(state.hover_win, 'winhighlight', winhi) local winblend = config.options.winblend vim.api.nvim_win_set_option(state.preview_win, 'winblend', winblend) - vim.api.nvim_win_set_option(state.hover_win, 'winblend', winblend) + -- vim.api.nvim_win_set_option(state.hover_win, 'winblend', winblend) end local function show_preview() @@ -174,13 +107,16 @@ local function show_preview() 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 = get_height(), + height = winheight, bufpos = { 0, 0 }, - row = offsets[1], col = offsets[2], + -- Position preview window middle-aligned vertically + row = math.ceil((height - winheight) / 2), border = config.options.border, }) setup_preview_buf() @@ -189,40 +125,16 @@ local function show_preview() end end -local function show_hover() - if state.hover_win == nil and state.hover_buf == nil then - state.hover_buf = vim.api.nvim_create_buf(false, true) - vim.api.nvim_buf_attach(state.hover_buf, false, { - on_detach = function() - state.hover_buf = nil - state.hover_win = nil - end, - }) - local offsets = get_offset() - local height = get_height() - state.hover_win = vim.api.nvim_open_win(state.hover_buf, false, { - relative = 'win', - width = 50, - height = height, - bufpos = { 0, 0 }, - row = offsets[1] + height + 2, - col = offsets[2], - border = config.options.border, - }) - setup_hover_buf() - else - update_hover() - end -end - function M.show() if not is_current_win_outline() or #vim.api.nvim_list_wins() < 2 then return end show_preview() - show_hover() set_bg_hl() + if config.options.open_hover_on_preview then + hover.show_hover() + end end function M.close()