local M = { 'nvim-neo-tree/neo-tree.nvim', branch = 'v2.x', lazy = false, keys = { { 'ft', [[Neotree toggle]], desc = 'Toggle Neotree' }, { 'fr', [[Neotree reveal]], desc = 'Reveal current file in Neotree' }, { 'gt', [[Neotree git_status]], desc = 'Neotree git status (Git Tree)' }, }, cmd = 'Neotree', dependencies = { 'nvim-lua/plenary.nvim', 'nvim-tree/nvim-web-devicons', -- not strictly required, but recommended 'MunifTanjim/nui.nvim', }, } function M.config() vim.g.neo_tree_remove_legacy_commands = 1 require('neo-tree').setup({ close_if_last_window = false, -- Close Neo-tree if it is the last window left in the tab popup_border_style = 'rounded', enable_git_status = true, enable_diagnostics = false, sort_case_insensitive = false, -- used when sorting files and directories in the tree sort_function = nil, -- use a custom function for sorting files and directories in the tree -- sort_function = function (a,b) -- if a.type == b.type then -- return a.path > b.path -- else -- return a.type > b.type -- end -- end , -- this sorts files and directories descendantly event_handlers = { { event = 'neo_tree_window_after_open', handler = function(ev) vim.api.nvim_win_set_option(ev.winid, 'statusline', ' %{fnamemodify(getcwd(),":~")}') end, }, }, sources = { 'filesystem', 'buffers', 'git_status', 'document_symbols', }, renderers = { directory = { { 'indent' }, { 'icon' }, { 'current_filter' }, { 'name' }, { 'clipboard' }, { 'diagnostics', errors_only = true }, }, file = { { 'indent' }, { 'icon' }, { 'diagnostics' }, { 'modified' }, { 'git_status' }, { 'name', use_git_status_colors = true, zindex = 10, }, { 'clipboard' }, { 'bufnr' }, }, }, default_component_configs = { container = { enable_character_fade = true, }, indent = { indent_size = 2, padding = 1, -- extra padding on left hand side -- indent guides with_markers = true, indent_marker = '│', last_indent_marker = '└', highlight = 'NeoTreeIndentMarker', -- expander config, needed for nesting files with_expanders = nil, -- if nil and file nesting is enabled, will enable expanders expander_collapsed = '', expander_expanded = '', expander_highlight = 'NeoTreeExpander', }, icon = { folder_closed = '', folder_open = '', folder_empty = '󰜌', -- The next two settings are only a fallback, if you use nvim-web-devicons and configure default icons there -- then these will never be used. default = '*', highlight = 'NeoTreeFileIcon' }, modified = { symbol = '[+]', highlight = 'NeoTreeModified', }, name = { trailing_slash = false, use_git_status_colors = true, highlight = 'NeoTreeFileName', }, git_status = { symbols = { -- Change type added = '', -- or "✚", but this is redundant info if you use git_status_colors on the name modified = '', -- or "", but this is redundant info if you use git_status_colors on the name deleted = '', -- this can only be used in the git_status source renamed = '󰁕', -- this can only be used in the git_status source -- Status type untracked = '', ignored = '', unstaged = '󰄱', staged = '', conflict = '', }, }, }, window = { position = 'left', width = 40, mapping_options = { noremap = true, nowait = true, }, mappings = { [''] = { 'toggle_node', nowait = false, -- disable `nowait` if you have existing combos starting with this char that you want to use }, ['<2-LeftMouse>'] = 'open', [''] = 'open', [''] = 'revert_preview', ['P'] = { 'toggle_preview', config = { use_float = true } }, ['S'] = 'open_split', ['s'] = 'open_vsplit', -- ["S"] = "split_with_window_picker", -- ["s"] = "vsplit_with_window_picker", ['t'] = 'open_tabnew', -- [""] = "open_drop", -- ["t"] = "open_tab_drop", ['w'] = 'open_with_window_picker', --["P"] = "toggle_preview", -- enter preview mode, which shows the current node without focusing ['C'] = 'close_node', ['z'] = 'close_all_nodes', --["Z"] = "expand_all_nodes", ['a'] = { 'add', -- some commands may take optional config options, see `:h neo-tree-mappings` for details config = { show_path = 'none' -- "none", "relative", "absolute" }, }, ['A'] = 'add_directory', -- also accepts the optional config.show_path option like "add". ['d'] = 'delete', ['r'] = 'rename', ['y'] = 'copy_to_clipboard', ['x'] = 'cut_to_clipboard', ['p'] = 'paste_from_clipboard', ['c'] = 'copy', -- takes text input for destination, also accepts the optional config.show_path option like "add": -- ["c"] = { -- "copy", -- config = { -- show_path = "none" -- "none", "relative", "absolute" -- } --} ['m'] = 'move', -- takes text input for destination, also accepts the optional config.show_path option like "add". ['q'] = 'close_window', ['R'] = 'refresh', ['?'] = 'show_help', ['<'] = 'prev_source', ['>'] = 'next_source', }, }, nesting_rules = {}, filesystem = { filtered_items = { visible = true, -- when true, they will just be displayed differently than normal items hide_dotfiles = true, hide_gitignored = true, hide_hidden = true, -- only works on Windows for hidden files/directories hide_by_name = { --"node_modules" }, hide_by_pattern = { -- uses glob style patterns --"*.meta", --"*/src/*/tsconfig.json", }, always_show = { -- remains visible even if other settings would normally hide it '.config', --".gitignored", }, never_show = { -- remains hidden even if visible is toggled to true, this overrides always_show --".DS_Store", --"thumbs.db" }, never_show_by_pattern = { -- uses glob style patterns '.null-ls_*', }, }, follow_current_file = false, -- This will find and focus the file in the active buffer every -- time the current file is changed while the tree is open. group_empty_dirs = false, -- when true, empty folders will be grouped together hijack_netrw_behavior = 'open_default', -- netrw disabled, opening a directory opens neo-tree -- in whatever position is specified in window.position -- "open_current", -- netrw disabled, opening a directory opens within the -- window like netrw would, regardless of window.position -- "disabled", -- netrw left alone, neo-tree does not handle opening dirs use_libuv_file_watcher = false, -- This will use the OS level file watchers to detect changes -- instead of relying on nvim autocmd events. window = { mappings = { [''] = 'navigate_up', ['.'] = 'set_root', ['H'] = 'toggle_hidden', ['/'] = 'noop', ['D'] = 'fuzzy_finder_directory', ['f'] = 'filter_on_submit', [''] = 'clear_filter', ['[g'] = 'prev_git_modified', [']g'] = 'next_git_modified', }, }, }, buffers = { follow_current_file = true, -- This will find and focus the file in the active buffer every -- time the current file is changed while the tree is open. group_empty_dirs = true, -- when true, empty folders will be grouped together show_unloaded = true, window = { mappings = { ['bd'] = 'buffer_delete', [''] = 'navigate_up', ['.'] = 'set_root', }, }, }, git_status = { window = { position = 'left', mappings = { ['A'] = 'git_add_all', ['gu'] = 'git_unstage_file', ['ga'] = 'git_add_file', ['gr'] = 'git_revert_file', ['gc'] = 'git_commit', ['gp'] = 'git_push', ['gg'] = 'git_commit_and_push', }, }, }, }) end return M