diff --git a/.config/nvim/lua/plugins/lualine.lua b/.config/nvim/lua/plugins/lualine.lua index e918406..cb2fb02 100644 --- a/.config/nvim/lua/plugins/lualine.lua +++ b/.config/nvim/lua/plugins/lualine.lua @@ -15,7 +15,7 @@ return { component_separators = { left = "", right = "" }, section_separators = { left = "", right = "" }, disabled_filetypes = { - statusline = { "alpha", "dashboard" }, + statusline = { "alpha", "dashboard", "Outline" }, winbar = {}, }, ignore_focus = { "NvimTree" }, diff --git a/.config/nvim/lua/plugins/outline.lua b/.config/nvim/lua/plugins/outline.lua new file mode 100644 index 0000000..0a96f48 --- /dev/null +++ b/.config/nvim/lua/plugins/outline.lua @@ -0,0 +1,281 @@ +return { + "hedyhli/outline.nvim", + lazy = true, + cmd = { "Outline", "OutlineOpen" }, + keys = { + { "o", "Outline", desc = "Toggle outline" }, + }, + opts = { + outline_window = { + -- Where to open the split window: right/left + position = "right", + -- The default split commands used are 'topleft vs' and 'botright vs' + -- depending on `position`. You can change this by providing your own + -- `split_command`. + -- `position` will not be considered if `split_command` is non-nil. + -- This should be a valid vim command used for opening the split for the + -- outline window. Eg, 'rightbelow vsplit'. + -- Width can be included (with will override the width setting below): + -- Eg, `topleft 20vsp` to prevent a flash of windows when resizing. + split_command = nil, + + -- Percentage or integer of columns + width = 30, + -- Whether width is relative to the total width of nvim + -- When relative_width = true, this means take 25% of the total + -- screen width for outline window. + relative_width = true, + + -- Auto close the outline window if goto_location is triggered and not for + -- peek_location + auto_close = false, + -- Automatically scroll to the location in code when navigating outline window. + auto_jump = false, + -- boolean or integer for milliseconds duration to apply a temporary highlight + -- when jumping. false to disable. + jump_highlight_duration = 300, + -- Whether to center the cursor line vertically in the screen when + -- jumping/focusing. Executes zz. + center_on_jump = true, + + -- Vim options for the outline window + show_numbers = false, + show_relative_numbers = false, + wrap = false, + + -- true/false/'focus_in_outline'/'focus_in_code'. + -- The last two means only show cursorline when the focus is in outline/code. + -- 'focus_in_outline' can be used if the outline_items.auto_set_cursor + -- operations are too distracting due to visual contrast caused by cursorline. + show_cursorline = true, + -- Enable this only if you enabled cursorline so your cursor color can + -- blend with the cursorline, in effect, as if your cursor is hidden + -- in the outline window. + -- This makes your line of cursor have the same color as if the cursor + -- wasn't focused on the outline window. + -- This feature is experimental. + hide_cursor = false, + + -- Whether to auto-focus on the outline window when it is opened. + -- Set to false to *always* retain focus on your previous buffer when opening + -- outline. + -- If you enable this you can still use bangs in :Outline! or :OutlineOpen! to + -- retain focus on your code. If this is false, retaining focus will be + -- enforced for :Outline/:OutlineOpen and you will not be able to have the + -- other behaviour. + focus_on_open = true, + -- Winhighlight option for outline window. + -- See :help 'winhl' + -- To change background color to "CustomHl" for example, use "Normal:CustomHl". + winhl = "", + }, + + outline_items = { + -- Show extra details with the symbols (lsp dependent) as virtual next + show_symbol_details = true, + -- Show corresponding line numbers of each symbol on the left column as + -- virtual text, for quick navigation when not focused on outline. + -- Why? See this comment: + -- https://github.com/simrat39/symbols-outline.nvim/issues/212#issuecomment-1793503563 + show_symbol_lineno = false, + -- Whether to highlight the currently hovered symbol and all direct parents + highlight_hovered_item = true, + -- Whether to automatically set cursor location in outline to match + -- location in code when focus is in code. If disabled you can use + -- `:OutlineFollow[!]` from any window or `` from outline window to + -- trigger this manually. + auto_set_cursor = true, + -- Autocmd events to automatically trigger these operations. + auto_update_events = { + -- Includes both setting of cursor and highlighting of hovered item. + -- The above two options are respected. + -- This can be triggered manually through `follow_cursor` lua API, + -- :OutlineFollow command, or . + follow = { "CursorMoved" }, + -- Re-request symbols from the provider. + -- This can be triggered manually through `refresh_outline` lua API, or + -- :OutlineRefresh command. + items = { "InsertLeave", "WinEnter", "BufEnter", "BufWinEnter", "TabEnter", "BufWritePost" }, + }, + }, + + -- Options for outline guides which help show tree hierarchy of symbols + guides = { + enabled = true, + markers = { + -- It is recommended for bottom and middle markers to use the same number + -- of characters to align all child nodes vertically. + bottom = "└", + middle = "├", + vertical = "│", + }, + }, + + symbol_folding = { + -- Depth past which nodes will be folded by default. Set to false to unfold all on open. + autofold_depth = 1, + -- When to auto unfold nodes + auto_unfold = { + -- Auto unfold currently hovered symbol + hovered = true, + -- Auto fold when the root level only has this many nodes. + -- Set true for 1 node, false for 0. + only = true, + }, + markers = { "", "" }, + }, + + preview_window = { + -- Automatically open preview of code location when navigating outline window + auto_preview = false, + -- Automatically open hover_symbol when opening preview (see keymaps for + -- hover_symbol). + -- If you disable this you can still open hover_symbol using your keymap + -- below. + open_hover_on_preview = false, + width = 50, -- Percentage or integer of columns + min_width = 50, -- Minimum number of columns + -- Whether width is relative to the total width of nvim. + -- When relative_width = true, this means take 50% of the total + -- screen width for preview window, ensure the result width is at least 50 + -- characters wide. + relative_width = true, + height = 50, -- Percentage or integer of lines + min_height = 10, -- Minimum number of lines + -- Similar to relative_width, except the height is relative to the outline + -- window's height. + relative_height = true, + -- Border option for floating preview window. + -- Options include: single/double/rounded/solid/shadow or an array of border + -- characters. + -- See :help nvim_open_win() and search for "border" option. + border = "single", + -- winhl options for the preview window, see ':h winhl' + winhl = "NormalFloat:", + -- Pseudo-transparency of the preview window, see ':h winblend' + winblend = 0, + -- Experimental feature that let's you edit the source content live + -- in the preview window. Like VS Code's "peek editor". + live = false, + }, + + -- These keymaps can be a string or a table for multiple keys. + -- Set to `{}` to disable. (Using 'nil' will fallback to default keys) + keymaps = { + show_help = "?", + close = { "", "q" }, + -- Jump to symbol under cursor. + -- It can auto close the outline window when triggered, see + -- 'auto_close' option above. + goto_location = "", + -- Jump to symbol under cursor but keep focus on outline window. + peek_location = "o", + -- Visit location in code and close outline immediately + goto_and_close = "", + -- Change cursor position of outline window to match current location in code. + -- 'Opposite' of goto/peek_location. + restore_location = "", + -- Open LSP/provider-dependent symbol hover information + hover_symbol = "", + -- Preview location code of the symbol under cursor + toggle_preview = "K", + rename_symbol = "r", + code_actions = "a", + -- These fold actions are collapsing tree nodes, not code folding + fold = "h", + unfold = "l", + fold_toggle = "", + -- Toggle folds for all nodes. + -- If at least one node is folded, this action will fold all nodes. + -- If all nodes are folded, this action will unfold all nodes. + fold_toggle_all = "", + fold_all = "W", + unfold_all = "E", + fold_reset = "R", + -- Move down/up by one line and peek_location immediately. + -- You can also use outline_window.auto_jump=true to do this for any + -- j/k//. + down_and_jump = "", + up_and_jump = "", + }, + + providers = { + priority = { "lsp", "coc", "markdown", "norg" }, + -- Configuration for each provider (3rd party providers are supported) + lsp = { + -- Lsp client names to ignore + blacklist_clients = {}, + }, + markdown = { + -- List of supported ft's to use the markdown provider + filetypes = { "markdown" }, + }, + }, + + symbols = { + -- Filter by kinds (string) for symbols in the outline. + -- Possible kinds are the Keys in the icons table below. + -- A filter list is a string[] with an optional exclude (boolean) field. + -- The symbols.filter option takes either a filter list or ft:filterList + -- key-value pairs. + -- Put exclude=true in the string list to filter by excluding the list of + -- kinds instead. + -- Include all except String and Constant: + -- filter = { 'String', 'Constant', exclude = true } + -- Only include Package, Module, and Function: + -- filter = { 'Package', 'Module', 'Function' } + -- See more examples below. + filter = nil, + + -- You can use a custom function that returns the icon for each symbol kind. + -- This function takes a kind (string) as parameter and should return an + -- icon as string. + ---@param kind string Key of the icons table below + ---@param bufnr integer Code buffer + ---@returns string|boolean The icon string to display, such as "f", or `false` + --- to fallback to `icon_source`. + icon_fetcher = nil, + -- 3rd party source for fetching icons. This is used as a fallback if + -- icon_fetcher returned an empty string. + -- Currently supported values: 'lspkind' + icon_source = nil, + -- The next fallback if both icon_fetcher and icon_source has failed, is + -- the custom mapping of icons specified below. The icons table is also + -- needed for specifying hl group. + icons = { + File = { icon = "󰈔", hl = "Identifier" }, + Module = { icon = "󰆧", hl = "Include" }, + Namespace = { icon = "󰅪", hl = "Include" }, + Package = { icon = "󰏗", hl = "Include" }, + Class = { icon = "𝓒", hl = "Type" }, + Method = { icon = "ƒ", hl = "Function" }, + Property = { icon = "", hl = "Identifier" }, + Field = { icon = "󰆨", hl = "Identifier" }, + Constructor = { icon = "", hl = "Special" }, + Enum = { icon = "ℰ", hl = "Type" }, + Interface = { icon = "󰜰", hl = "Type" }, + Function = { icon = "", hl = "Function" }, + Variable = { icon = "", hl = "Constant" }, + Constant = { icon = "", hl = "Constant" }, + String = { icon = "𝓐", hl = "String" }, + Number = { icon = "#", hl = "Number" }, + Boolean = { icon = "⊨", hl = "Boolean" }, + Array = { icon = "󰅪", hl = "Constant" }, + Object = { icon = "⦿", hl = "Type" }, + Key = { icon = "🔐", hl = "Type" }, + Null = { icon = "NULL", hl = "Type" }, + EnumMember = { icon = "", hl = "Identifier" }, + Struct = { icon = "𝓢", hl = "Structure" }, + Event = { icon = "🗲", hl = "Type" }, + Operator = { icon = "+", hl = "Identifier" }, + TypeParameter = { icon = "𝙏", hl = "Identifier" }, + Component = { icon = "󰅴", hl = "Function" }, + Fragment = { icon = "󰅴", hl = "Constant" }, + TypeAlias = { icon = " ", hl = "Type" }, + Parameter = { icon = " ", hl = "Identifier" }, + StaticMethod = { icon = " ", hl = "Function" }, + Macro = { icon = " ", hl = "Function" }, + }, + }, + }, +}