This plugin requires neovim >=0.7.0.
If you have issues since the recent setup migration, check out this guide
Install with vim-plug:
" requires
Plug 'kyazdani42/nvim-web-devicons' " for file icons
Plug 'kyazdani42/nvim-tree.lua'Install with packer:
use {
'kyazdani42/nvim-tree.lua',
requires = {
'kyazdani42/nvim-web-devicons', -- optional, for file icon
},
tag = 'nightly' -- optional, updated every week. (see issue #1193)
}Setup should be run in a lua file or in a lua heredoc (:help lua-heredoc) if using in a vim file.
Legacy g: options have been migrated to the setup function. See this issue for information on migrating your configuration.
" vimrc
nnoremap <C-n> :NvimTreeToggle<CR>
nnoremap <leader>r :NvimTreeRefresh<CR>
nnoremap <leader>n :NvimTreeFindFile<CR>
" More available functions:
" NvimTreeOpen
" NvimTreeClose
" NvimTreeFocus
" NvimTreeFindFileToggle
" NvimTreeResize
" NvimTreeCollapse
" NvimTreeCollapseKeepBuffers
set termguicolors " this variable must be enabled for colors to be applied properly
" a list of groups can be found at `:help nvim_tree_highlight`
highlight NvimTreeFolderIcon guibg=blue-- init.lua
-- empty setup using defaults: add your own options
require'nvim-tree'.setup {
}
-- OR
-- setup with all defaults
-- each of these are documented in `:help nvim-tree.OPTION_NAME`
-- nested options are documented by accessing them with `.` (eg: `:help nvim-tree.view.mappings.list`).
require'nvim-tree'.setup { -- BEGIN_DEFAULT_OPTS
auto_reload_on_write = true,
create_in_closed_folder = false,
disable_netrw = false,
hijack_cursor = false,
hijack_netrw = true,
hijack_unnamed_buffer_when_opening = false,
ignore_buffer_on_setup = false,
open_on_setup = false,
open_on_setup_file = false,
open_on_tab = false,
sort_by = "name",
update_cwd = false,
reload_on_bufenter = false,
respect_buf_cwd = false,
view = {
width = 30,
height = 30,
hide_root_folder = false,
side = "left",
preserve_window_proportions = false,
number = false,
relativenumber = false,
signcolumn = "yes",
mappings = {
custom_only = false,
list = {
-- user mappings go here
},
},
},
renderer = {
add_trailing = false,
group_empty = false,
highlight_git = false,
highlight_opened_files = "none",
root_folder_modifier = ":~",
indent_markers = {
enable = false,
icons = {
corner = "└ ",
edge = "│ ",
none = " ",
},
},
icons = {
webdev_colors = true,
git_placement = "before",
padding = " ",
symlink_arrow = " ➛ ",
show = {
file = true,
folder = true,
folder_arrow = true,
git = true,
},
glyphs = {
default = "",
symlink = "",
folder = {
arrow_closed = "",
arrow_open = "",
default = "",
open = "",
empty = "",
empty_open = "",
symlink = "",
symlink_open = "",
},
git = {
unstaged = "✗",
staged = "✓",
unmerged = "",
renamed = "➜",
untracked = "★",
deleted = "",
ignored = "◌",
},
},
},
special_files = { "Cargo.toml", "Makefile", "README.md", "readme.md" },
},
hijack_directories = {
enable = true,
auto_open = true,
},
update_focused_file = {
enable = false,
update_cwd = false,
ignore_list = {},
},
ignore_ft_on_setup = {},
system_open = {
cmd = "",
args = {},
},
diagnostics = {
enable = false,
show_on_dirs = false,
icons = {
hint = "",
info = "",
warning = "",
error = "",
},
},
filters = {
dotfiles = false,
custom = {},
exclude = {},
},
git = {
enable = true,
ignore = true,
timeout = 400,
},
actions = {
use_system_clipboard = true,
change_dir = {
enable = true,
global = false,
restrict_above_cwd = false,
},
open_file = {
quit_on_open = false,
resize_window = true,
window_picker = {
enable = true,
chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890",
exclude = {
filetype = { "notify", "packer", "qf", "diff", "fugitive", "fugitiveblame" },
buftype = { "nofile", "terminal", "help" },
},
},
},
},
trash = {
cmd = "trash",
require_confirm = true,
},
live_filter = {
prefix = "[FILTER]: ",
always_show_folders = true,
},
log = {
enable = false,
truncate = false,
types = {
all = false,
config = false,
copy_paste = false,
diagnostics = false,
git = false,
profile = false,
},
},
} -- END_DEFAULT_OPTS<CR>oroon the root folder will cd in the above directory<C-]>will cd in the directory under the cursor<BS>will close current opened directory or parent- type
ato add a file. Adding a directory requires leaving a leading/at the end of the path.you can add multiple directories by doing foo/bar/baz/f and it will add foo bar and baz directories and f as a file
- type
rto rename a file - type
<C-r>to rename a file and omit the filename on input - type
xto add/remove file/directory to cut clipboard - type
cto add/remove file/directory to copy clipboard - type
ywill copy name to system clipboard - type
Ywill copy relative path to system clipboard - type
gywill copy absolute path to system clipboard - type
pto paste from clipboard. Cut clipboard has precedence over copy (will prompt for confirmation) - type
dto delete a file (will prompt for confirmation) - type
Dto trash a file (configured in setup()) - type
]cto go to next git item - type
[cto go to prev git item - type
-to navigate up to the parent directory of the current file/directory - type
sto open a file with default system application or a folder with default file manager (if you want to change the command used to do it see:h nvim-tree.setupundersystem_open) - if the file is a directory,
<CR>will open the directory otherwise it will open the file in the buffer near the tree - if the file is a symlink,
<CR>will follow the symlink (if the target is a file) <C-v>will open the file in a vertical split<C-x>will open the file in a horizontal split<C-t>will open the file in a new tab<Tab>will open the file as a preview (keeps the cursor in the tree)Iwill toggle visibility of hidden folders / filesHwill toggle visibility of dotfiles (files/folders starting with a.)Rwill refresh the tree- Double left click acts like
<CR> - Double right click acts like
<C-]> Wwill collapse the whole treeSwill prompt the user to enter a path and then expands the tree to match the path.will enter vim command mode with the file the cursor is onC-kwill toggle a popup with file infos about the file under the cursorfwill allow you to filter nodes dynamically based on regex matching.
The list option in view.mappings.list is a table of
-- key can be either a string or a table of string (lhs)
-- action is the name of the action, set to `""` to remove default action
-- action_cb is the function that will be called, it receives the node as a parameter. Optional for default actions
-- mode is normal by default
local tree_cb = require'nvim-tree.config'.nvim_tree_callback
local function print_node_path(node) {
print(node.absolute_path)
}
local list = {
{ key = {"<CR>", "o" }, action = "edit", mode = "n"},
{ key = "p", action = "print_path", action_cb = print_node_path },
{ key = "s", cb = tree_cb("vsplit") }, --tree_cb and the cb property are deprecated
{ key = "<2-RightMouse>", action = "" }, -- will remove default cd action
}These are the default bindings:
-- default mappings
local list = {
{ key = {"<CR>", "o", "<2-LeftMouse>"}, action = "edit" },
{ key = "<C-e>", action = "edit_in_place" },
{ key = {"O"}, action = "edit_no_picker" },
{ key = {"<2-RightMouse>", "<C-]>"}, action = "cd" },
{ key = "<C-v>", action = "vsplit" },
{ key = "<C-x>", action = "split" },
{ key = "<C-t>", action = "tabnew" },
{ key = "<", action = "prev_sibling" },
{ key = ">", action = "next_sibling" },
{ key = "P", action = "parent_node" },
{ key = "<BS>", action = "close_node" },
{ key = "<Tab>", action = "preview" },
{ key = "K", action = "first_sibling" },
{ key = "J", action = "last_sibling" },
{ key = "I", action = "toggle_git_ignored" },
{ key = "H", action = "toggle_dotfiles" },
{ key = "R", action = "refresh" },
{ key = "a", action = "create" },
{ key = "d", action = "remove" },
{ key = "D", action = "trash" },
{ key = "r", action = "rename" },
{ key = "<C-r>", action = "full_rename" },
{ key = "x", action = "cut" },
{ key = "c", action = "copy" },
{ key = "p", action = "paste" },
{ key = "y", action = "copy_name" },
{ key = "Y", action = "copy_path" },
{ key = "gy", action = "copy_absolute_path" },
{ key = "[c", action = "prev_git_item" },
{ key = "]c", action = "next_git_item" },
{ key = "-", action = "dir_up" },
{ key = "s", action = "system_open" },
{ key = "f", action = "live_filter" },
{ key = "F", action = "clear_live_filter" },
{ key = "q", action = "close" },
{ key = "g?", action = "toggle_help" },
{ key = "W", action = "collapse_all" },
{ key = "S", action = "search_node" },
{ key = "<C-k>", action = "toggle_file_info" },
{ key = ".", action = "run_file_command" }
}You can toggle the help UI by pressing g?.
- You can add a directory by adding a
/at the end of the paths, entering multiple directoriesBASE/foo/bar/bazwill add directory foo, then bar and add a file baz to it. - You can update window options for the tree by setting
require"nvim-tree.view".View.winopts.MY_OPTION = MY_OPTION_VALUE togglehas a second parameter which allows to toggle without focusing the explorer (require"nvim-tree".toggle(false, true)).- You can allow nvim-tree to behave like vinegar (see
:help nvim-tree-vinegar). - If you
:set nosplitright, the files will open on the left side of the tree, placing the tree window in the right side of the file you opened. - You can automatically close the tab/vim when nvim-tree is the last window in the tab. WARNING: other plugins or automation may interfere with this:
autocmd BufEnter * ++nested if winnr('$') == 1 && bufname() == 'NvimTree_' . tabpagenr() | quit | endifYou may enable diagnostic logging to $XDG_CACHE_HOME/nvim/nvim-tree.log. See :help nvim-tree.log.
If you are experiencing performance issues with nvim-tree.lua, you can enable profiling in the logs. It is advisable to enable git logging at the same time, as that can be a source of performance problems.
log = {
enable = true,
truncate = true,
types = {
git = true,
profile = true,
},
},Please attach $XDG_CACHE_HOME/nvim/nvim-tree.log if you raise an issue.
Performance Tips:
-
If you are using fish as an editor shell (which might be fixed in the future), try set
shell=/bin/bashin your vim config. Alternatively, you can prevent fish from loading interactive configuration in a non-interactive shell. -
Try manually running the git command (see the logs) in your shell e.g.
git --no-optional-locks status --porcelain=v1 --ignored=matching -u. -
Huge git repositories may timeout after the default
git.timeoutof 400ms. Try increasing that in your setup if you see[git] job timed outin the logs. -
Try temporarily disabling git integration by setting
git.enable = falsein your setup.



