# A File Explorer For Neovim Written In Lua ## Notice This plugin requires [neovim nightly (>=0.5.0)](https://github.com/neovim/neovim/wiki/Installing-Neovim). ## Install Install with [vim-plug](https://github.com/junegunn/vim-plug): ```vim " requires Plug 'kyazdani42/nvim-web-devicons' " for file icons Plug 'kyazdani42/nvim-tree.lua' ``` ## Setup ```vim let g:nvim_tree_side = 'right' "left by default let g:nvim_tree_width = 40 "30 by default, can be width_in_columns or 'width_in_percent%' let g:nvim_tree_ignore = [ '.git', 'node_modules', '.cache' ] "empty by default let g:nvim_tree_gitignore = 1 "0 by default let g:nvim_tree_auto_open = 1 "0 by default, opens the tree when typing `vim $DIR` or `vim` let g:nvim_tree_auto_close = 1 "0 by default, closes the tree when it's the last window let g:nvim_tree_auto_ignore_ft = [ 'startify', 'dashboard' ] "empty by default, don't auto open tree on specific filetypes. let g:nvim_tree_quit_on_open = 1 "0 by default, closes the tree when you open a file let g:nvim_tree_follow = 1 "0 by default, this option allows the cursor to be updated when entering a buffer let g:nvim_tree_indent_markers = 1 "0 by default, this option shows indent markers when folders are open let g:nvim_tree_hide_dotfiles = 1 "0 by default, this option hides files and folders starting with a dot `.` let g:nvim_tree_git_hl = 1 "0 by default, will enable file highlight for git attributes (can be used without the icons). let g:nvim_tree_highlight_opened_files = 1 "0 by default, will enable folder and file icon highlight for opened files/directories. let g:nvim_tree_root_folder_modifier = ':~' "This is the default. See :help filename-modifiers for more options let g:nvim_tree_tab_open = 1 "0 by default, will open the tree when entering a new tab and the tree was previously open let g:nvim_tree_auto_resize = 0 "1 by default, will resize the tree to its saved width when opening a file let g:nvim_tree_disable_netrw = 0 "1 by default, disables netrw let g:nvim_tree_hijack_netrw = 0 "1 by default, prevents netrw from automatically opening when opening directories (but lets you keep its other utilities) let g:nvim_tree_add_trailing = 1 "0 by default, append a trailing slash to folder names let g:nvim_tree_group_empty = 1 " 0 by default, compact folders that only contain a single folder into one node in the file tree let g:nvim_tree_lsp_diagnostics = 1 "0 by default, will show lsp diagnostics in the signcolumn. See :help nvim_tree_lsp_diagnostics let g:nvim_tree_disable_window_picker = 1 "0 by default, will disable the window picker. let g:nvim_tree_hijack_cursor = 0 "1 by default, when moving cursor in the tree, will position the cursor at the start of the file on the current line let g:nvim_tree_icon_padding = ' ' "one space by default, used for rendering the space between the icon and the filename. Use with caution, it could break rendering if you set an empty string depending on your font. let g:nvim_tree_update_cwd = 1 "0 by default, will update the tree cwd when changing nvim's directory (DirChanged event). Behaves strangely with autochdir set. let g:nvim_tree_window_picker_exclude = { \ 'filetype': [ \ 'packer', \ 'qf' \ ], \ 'buftype': [ \ 'terminal' \ ] \ } " Dictionary of buffer option names mapped to a list of option values that " indicates to the window picker that the buffer's window should not be " selectable. let g:nvim_tree_special_files = { 'README.md': 1, 'Makefile': 1, 'MAKEFILE': 1 } " List of filenames that gets highlighted with NvimTreeSpecialFile let g:nvim_tree_show_icons = { \ 'git': 1, \ 'folders': 0, \ 'files': 0, \ 'folder_arrows': 0, \ } "If 0, do not show the icons for one of 'git' 'folder' and 'files' "1 by default, notice that if 'files' is 1, it will only display "if nvim-web-devicons is installed and on your runtimepath. "if folder is 1, you can also tell folder_arrows 1 to show small arrows next to the folder icons. "but this will not work when you set indent_markers (because of UI conflict) " default will show icon by default if no icon is provided " default shows no icon by default let g:nvim_tree_icons = { \ 'default': '', \ 'symlink': '', \ 'git': { \ 'unstaged': "✗", \ 'staged': "✓", \ 'unmerged': "", \ 'renamed': "➜", \ 'untracked': "★", \ 'deleted': "", \ 'ignored': "◌" \ }, \ 'folder': { \ 'arrow_open': "", \ 'arrow_closed': "", \ 'default': "", \ 'open': "", \ 'empty': "", \ 'empty_open': "", \ 'symlink': "", \ 'symlink_open': "", \ }, \ 'lsp': { \ 'hint': "", \ 'info': "", \ 'warning': "", \ 'error': "", \ } \ } nnoremap :NvimTreeToggle nnoremap r :NvimTreeRefresh nnoremap n :NvimTreeFindFile " NvimTreeOpen and NvimTreeClose are also available if you need them 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 ``` ## KeyBindings ### Default actions - move around like in any vim buffer - `` or `o` on `..` will cd in the above directory - `` will cd in the directory under the cursor - `` will close current opened directory or parent - type `a` to 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 `r` to rename a file - type `` to rename a file and omit the filename on input - type `x` to add/remove file/directory to cut clipboard - type `c` to add/remove file/directory to copy clipboard - type `y` will copy name to system clipboard - type `Y` will copy relative path to system clipboard - type `gy` will copy absolute path to system clipboard - type `p` to paste from clipboard. Cut clipboard has precedence over copy (will prompt for confirmation) - type `d` to delete a file (will prompt for confirmation) - type `]c` to go to next git item - type `[c` to go to prev git item - type `-` to navigate up to the parent directory of the current file/directory - if the file is a directory, `` will open the directory otherwise it will open the file in the buffer near the tree - if the file is a symlink, `` will follow the symlink (if the target is a file) - `` will open the file in a vertical split - `` will open the file in a horizontal split - `` will open the file in a new tab - `` will open the file as a preview (keeps the cursor in the tree) - `I` will toggle visibility of folders hidden via |g:nvim_tree_ignore| - `H` will toggle visibility of dotfiles (files/folders starting with a `.`) - `R` will refresh the tree - Double left click acts like `` - Double right click acts like `` ### Setup You can disable default mappings with ```vim " let g:nvim_tree_disable_keybindings=1 ``` But you won't be able to map any keys from the setup with nvim_tree_bindings. Use with caution. You can use only your mappings with ```vim let g:nvim_tree_disable_default_keybindings = 1 ``` You can define your own keymaps with this syntax: ```vim lua <", "o" }, cb = ":lua some_func()"} { key = "", mode = "v", cb = ":lua some_func()"} } EOF ``` Notes: - `key` can be either a string or a table of strings - `mode` is `n` by default if you don't specify it - `cb` is the command that will be called when the keymap is triggered If you don't use one of the options above, your keymaps will be added to the default keymaps. ```vim lua <", "o", "<2-LeftMouse>"}, cb = tree_cb("edit") }, { key = {"<2-RightMouse>", ""}, cb = tree_cb("cd") }, { key = "", cb = tree_cb("vsplit") }, { key = "", cb = tree_cb("split") }, { key = "", cb = tree_cb("tabnew") }, { key = "<", cb = tree_cb("prev_sibling") }, { key = ">", cb = tree_cb("next_sibling") }, { key = "P", cb = tree_cb("parent_node") }, { key = "", cb = tree_cb("close_node") }, { key = "", cb = tree_cb("close_node") }, { key = "", cb = tree_cb("preview") }, { key = "K", cb = tree_cb("first_sibling") }, { key = "J", cb = tree_cb("last_sibling") }, { key = "I", cb = tree_cb("toggle_ignored") }, { key = "H", cb = tree_cb("toggle_dotfiles") }, { key = "R", cb = tree_cb("refresh") }, { key = "a", cb = tree_cb("create") }, { key = "d", cb = tree_cb("remove") }, { key = "r", cb = tree_cb("rename") }, { key = "", cb = tree_cb("full_rename") }, { key = "x", cb = tree_cb("cut") }, { key = "c", cb = tree_cb("copy") }, { key = "p", cb = tree_cb("paste") }, { key = "y", cb = tree_cb("copy_name") }, { key = "Y", cb = tree_cb("copy_path") }, { key = "gy", cb = tree_cb("copy_absolute_path") }, { key = "[c", cb = tree_cb("prev_git_item") }, { key = "]c", cb = tree_cb("next_git_item") }, { key = "-", cb = tree_cb("dir_up") }, { key = "q", cb = tree_cb("close") }, { key = "g?", cb = tree_cb("toggle_help") }, } EOF ``` You can toggle the help UI by pressing `g?`. ## Note This plugin is very fast because it uses the `libuv` `scandir` and `scandir_next` functions instead of spawning an `ls` process which can get slow on large files when combining with `stat` to get file informations. ## Features - Open file in current buffer or in split with FzF like bindings (``, ``, ``, ``) - File icons with nvim-web-devicons - Syntax highlighting ([exa](https://github.com/ogham/exa) like) - Change directory with `.` - Add / Rename / delete files - Git integration (icons and file highlight) - Lsp diagnostics integration (signs) - Indent markers - Mouse support - It's fast ## Tips - You can edit the size of the tree during runtime with `:lua require'nvim-tree.view'.View.width = 50` - Open the node under the cursor with the OS default application (usually file explorer for folders): ```lua function NvimTreeOSOpen() local lib = require "nvim-tree.lib" local node = lib.get_node_at_cursor() if node then vim.fn.jobstart("open '" .. node.absolute_path .. "' &", {detach = true}) end end ``` ## Screenshots ![alt text](.github/screenshot.png?raw=true "kyazdani42 tree") ![alt text](.github/screenshot2.png?raw=true "akin909 tree") ![alt text](.github/screenshot3.png?raw=true "stsewd tree")