A simple popup display that provides breadcrumbs like navigation feature but in keyboard centric manner inspired by ranger file manager.
2023-03-26.09-48-54.mp4
- Neovim >= 0.8.0
- nvim-lspconfig
- nvim-navic
- nui.nvim
Install the plugin with your preferred package manager:
use {
"SmiteshP/nvim-navbuddy",
requires = {
"neovim/nvim-lspconfig",
"SmiteshP/nvim-navic",
"MunifTanjim/nui.nvim"
}
}Plug "neovim/nvim-lspconfig"
Plug "SmiteshP/nvim-navic"
Plug "MunifTanjim/nui.nvim"
Plug "SmiteshP/nvim-navbuddy"If you want to lazy load navbuddy you need to load it before your Lsp related Stuff.
For Example with Lazy and lspconfig
return {
"neovim/nvim-lspconfig",
dependencies = {
{
"SmiteshP/nvim-navbuddy",
dependencies = {
"SmiteshP/nvim-navic",
"MunifTanjim/nui.nvim"
},
opts = { lsp = { auto_attach = true } }
}
},
-- your lsp config or other stuff
}nvim-navbuddy needs to be attached to lsp servers of the buffer to work. You can pass the
navbuddy's attach function as on_attach while setting up the lsp server. You can skip this
step if you have enabled auto_attach option in setup function.
Example:
local navbuddy = require("nvim-navbuddy")
require("lspconfig").clangd.setup {
on_attach = function(client, bufnr)
navbuddy.attach(client, bufnr)
end
}Use setup to override any of the default options
icons: Indicate the type of symbol captured. Default icons assume you have nerd-fonts.window: Set options related to window's "border", "size", "position".use_default_mappings: If set to false, only mappings set by user are set. Else default mappings are used for keys that are not set by user.mappings: Actions to be triggered for specified keybindings. If you wish to set custom keybindings, you will have to set all the keybindings.lsp:auto_attach: Enable to have Navbuddy automatically attach to every LSP for current buffer. Its disabled by default.preference: Table ranking lsp_servers. Lower the index, higher the priority of the server. If there are more than one server attached to a buffer, navbuddy 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 prefered.
source_buffer:follow_node: Keep the current node in focus on the source bufferhighlight: Highlight the currently focused node- reorient: Reorient buffer after changing nodes. options are "smart", "top", "mid" or "none"
local navbuddy = require("nvim-navbuddy")
local actions = require("nvim-navbuddy.actions")
navbuddy.setup {
window = {
border = "single", -- "rounded", "double", "solid", "none"
-- or an array with eight chars building up the border in a clockwise fashion
-- starting with the top-left corner. eg: { "β", "β" ,"β", "β", "β", "β", "β", "β" }.
size = "60%", -- Or table format example: { height = "40%", width = "100%"}
position = "50%", -- Or table format example: { row = "100%", col = "0%"}
scrolloff = nil, -- scrolloff value within navbuddy window
sections = {
left = {
size = "20%",
border = nil, -- You can set border style for each section individually as well.
},
mid = {
size = "40%",
border = nil,
},
right = {
-- No size option for right most section. It fills to
-- remaining area.
border = nil,
preview = "leaf", -- Right section can show previews too.
-- Options: "leaf", "always" or "never"
}
}
},
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 = "ο ",
},
use_default_mappings = true, -- If set to false, only mappings set
-- by user are set. Else default
-- mappings are used for keys
-- that are not set by user
mappings = {
["<esc>"] = actions.close, -- Close and cursor to original location
["q"] = actions.close,
["j"] = actions.next_sibling, -- down
["k"] = actions.previous_sibling, -- up
["h"] = actions.parent, -- Move to left panel
["l"] = actions.children, -- Move to right panel
["0"] = actions.root, -- Move to first panel
["v"] = actions.visual_name, -- Visual selection of name
["V"] = actions.visual_scope, -- Visual selection of scope
["y"] = actions.yank_name, -- Yank the name to system clipboard "+
["Y"] = actions.yank_scope, -- Yank the scope to system clipboard "+
["i"] = actions.insert_name, -- Insert at start of name
["I"] = actions.insert_scope, -- Insert at start of scope
["a"] = actions.append_name, -- Insert at end of name
["A"] = actions.append_scope, -- Insert at end of scope
["r"] = actions.rename, -- Rename currently focused symbol
["d"] = actions.delete, -- Delete scope
["f"] = actions.fold_create, -- Create fold of current scope
["F"] = actions.fold_delete, -- Delete fold of current scope
["c"] = actions.comment, -- Comment out current scope
["<enter>"] = actions.select, -- Goto selected symbol
["o"] = actions.select,
["J"] = actions.move_down, -- Move focused node down
["K"] = actions.move_up, -- Move focused node up
},
lsp = {
auto_attach = false, -- If set to true, you don't need to manually use attach function
preference = nil, -- list of lsp server names in order of preference
},
source_buffer = {
follow_node = true, -- Keep the current node in focus on the source buffer
highlight = true, -- Highlight the currently focused node
reorient = "smart", -- "smart", "top", "mid" or "none"
scrolloff = nil -- scrolloff value when navbuddy is open
}
}Navbuddy command can be used to open navbuddy.
:Navbuddy
And alternatively lua function open can also be used to open navbuddy.
:lua require("nvim-navbuddy").open()