*nvim-navic* *navic* A simple statusline/winbar component that shows your current code context. Named after the Indian satellite navigation system. Requires : - nvim-lspconfig: `https://github.com/neovim/nvim-lspconfig` - Neovim: 0.7 or above ============================================================================= CONTENTS *navic-components* API |navic-api| Usage |navic-usage| Variables |navic-variables| Customisation |navic-customise| Highlights |navic-highlights| ============================================================================= API *navic-api* |nvim-navic| provides the following functions for the user. *navic.setup* (opts) Configure |nvim-navic|'s options. See more |navic-configuration|. *navic.attach* (client, bufnr) Used to attach |nvim-navic| to lsp server. Pass this function as on_attach while setting up your desired lsp server. *navic.is_available* (bufnr) Returns boolean value indicating whether |nvim-navic| is able to provide output for current buffer. 'bufnr' is optional argument. If bufnr is not provied, current open buffer is used. *navic.get_location* (opts, bufnr) Returns a pretty string that shows code context and can be used directly in statusline or winbar. opts table can be passed to override any of |nvim-navic|'s options. Follows same table format as |navic-setup|'s opts table. You can pass |bufnr| value to determine which buffer is used to get code context. If not provided, the current buffer will be used. *navic.get_data* (bufnr) Returns a table of tables representing the current code context. Contains information about the symbol's name, kind, type, scope and its icon at each level. Relation between type and kind is defiend on LSP's website. `https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#symbolKind` 'bufnr' is optional argument. If bufnr is not provied, current open buffer is used. *navic.format_data* (data, opts) Formats data of the type returned by |navic.get_data| for use in the statusline or winbar. This can be used to modify the raw data before formatting it. |opts| table can be passed to override any of |nvim-navic|'s options. Follows same table format as |navic-setup|'s opts table. ============================================================================= Usage *navic-usage* |nvim-navic| needs to be attached to lsp servers of the buffer to work. Use the |navic.attach| function while setting up lsp servers. You can skip this step if you have enabled auto_attach option during setup. NOTE: You can attach to only one lsp server per buffer. Example: >lua require("lspconfig").clangd.setup { on_attach = function(client, bufnr) navic.attach(client, bufnr) end } < Next you can use |nvim-navic| in your statusline or winbar with your favorite statusline/winbar plugins. Example setup with lualine.nvim `https://github.com/nvim-lualine/lualine.nvim`: >lua local navic = require("nvim-navic") require("lualine").setup({ sections = { lualine_c = { "navic", -- Component specific options color_correction = nil, -- Can be nil, "static" or "dynamic". This option is useful only when you have highlights enabled. -- Many colorschemes don't define same backgroud for nvim-navic as their lualine statusline backgroud. -- Setting it to "static" will perform a adjustment once when the component is being setup. This should -- be enough when the lualine section isn't changing colors based on the mode. -- Setting it to "dynamic" will keep updating the highlights according to the current modes colors for -- the current section. navic_opts = nil -- lua table with same format as setup's option. All options except "lsp" options take effect when set here. } }, -- OR in winbar winbar = { lualine_c = { "navic", color_correction = nil, navic_opts = nil } } }) -- OR a more hands on approach require("lualine").setup({ sections = { lualine_c = { { function() return navic.get_location() end, cond = function() return navic.is_available() end }, } }, -- OR in winbar winbar = { lualine_c = { { function() return navic.get_location() end, cond = function() return navic.is_available() end }, } } }) < Example setup with feline.nvim `https://github.com/feline-nvim/feline.nvim`: Statusline: >lua local navic = require("nvim-navic") local components = { active = {{}, {}, {}}, } table.insert(components.active[1], { provider = function() return navic.get_location() end, enabled = function() return navic.is_available() end, }) require("feline").setup({ components = components }) < Winbar: >lua local navic = require("nvim-navic") local components = { active = {{}, {}, {}}, } table.insert(components.active[1], { provider = function() return navic.get_location() end, enabled = function() return navic.is_available() end, }) require("feline").winbar.setup({ components = components }) < You can silence warning/error messages thrown by |nvim-navic| by setting >lua vim.g.navic_silence = true. < at the start of your config. However this is not advisable, the error messages indicate issues in your setup. ============================================================================= Variables *navic-variables* *vim.g.navic_silence* Set it to true to silence the any warnings/error messages thrown by nvim-navic *vim.b.navic_lazy_update_context* Set it to true to update context only on CursorHold event. Could be usefull if you are facing performance issues on large files. Example usage >lua vim.api.nvim_create_autocmd("BufEnter", { callback = function() if vim.api.nvim_buf_line_count(0) > 10000 then vim.b.navic_lazy_update_context = true end end, }) < ============================================================================= Customisation *navic-customise* Use |navic.setup| to override any of the default options icons: table Icons to show for captured symbols. Default icons assume that you have nerd-font. highlight: boolean Add colors to icons and text as defined by highlight groups NavicIcons* (NavicIconsFile, NavicIconsModule.. etc.), NavicText and NavicSeparator. separator: string Icon to be used to separate two symbols. depth_limit: integer Maximum depth of context to be shown. If the context depth exceeds this parameter, context information is truncated. default is infinite depth_limit_indicator: string Indicator signifing that displayed string is truncated. safe_output: boolean Sanitize the output for use in statusline and winbar. click: boolean Single click to goto element, double click to open nvim-navbuddy on the clicked element. lazy_update_context: boolean If true, turns off context updates for the "CursorMoved" event, updates will only happen on the "CursorHold" event. The difference between this option and the vim.b.navic_lazy_update_context variable is that this option turns off context updates on the "CursorMoved" completely for all buffers, whereas the vim.b.navic_lazy_update_context variable allows you to control that behavior with more flexibility, like disabling context updates depending on file size, total lines etc. lsp : auto_attach: boolean Enable to have nvim-navic automatically attach to every LSP for current buffer. Its disabled by default. preference: table Table ranking lsp_servers. Lower the index, higher the priority of the server. If there are more than one server attached to a buffer, nvim-navic will refer to this list to make a decision on which one to use. For example - In case a buffer is attached to clangd and ccls both and the preference list is `{ "clangd", "pyright" }`. Then clangd will be preferred. Defaults >lua navic.setup { icons = { File = "󰈙 ", Module = " ", Namespace = "󰌗 ", Package = " ", Class = "󰌗 ", Method = "󰆧 ", Property = " ", Field = " ", Constructor = " ", Enum = "󰕘", Interface = "󰕘", Function = "󰊕 ", Variable = "󰆧 ", Constant = "󰏿 ", String = "󰀬 ", Number = "󰎠 ", Boolean = "◩ ", Array = "󰅪 ", Object = "󰅩 ", Key = "󰌋 ", Null = "󰟢 ", EnumMember = " ", Struct = "󰌗 ", Event = " ", Operator = "󰆕 ", TypeParameter = "󰊄 ", }, lsp = { auto_attach = false, preference = nil, }, highlight = false, separator = " > ", depth_limit = 0, depth_limit_indicator = "..", safe_output = true, lazy_update_context = false, click = false } < ============================================================================= Highlight *navic-highlights* |nvim-navic| provides the following highlights which get used when highlight option is set to `true`. `NavicIconsFile` `NavicIconsModule` `NavicIconsNamespace` `NavicIconsPackage` `NavicIconsClass` `NavicIconsMethod` `NavicIconsProperty` `NavicIconsField` `NavicIconsConstructor` `NavicIconsEnum` `NavicIconsInterface` `NavicIconsFunction` `NavicIconsVariable` `NavicIconsConstant` `NavicIconsString` `NavicIconsNumber` `NavicIconsBoolean` `NavicIconsArray` `NavicIconsObject` `NavicIconsKey` `NavicIconsNull` `NavicIconsEnumMember` `NavicIconsStruct` `NavicIconsEvent` `NavicIconsOperator` `NavicIconsTypeParameter` `NavicText` `NavicSeparator` ============================================================================= vim:tw=78:ts=4:ft=help:norl: