[Neotree] Add auto expand of empty dirs
This commit is contained in:
		| @@ -1,340 +1,361 @@ | ||||
| return { | ||||
|     "nvim-neo-tree/neo-tree.nvim", | ||||
|     dependencies = { | ||||
|         "nvim-lua/plenary.nvim", | ||||
|         "nvim-tree/nvim-web-devicons", -- not strictly required, but recommended | ||||
|         "MunifTanjim/nui.nvim", | ||||
|         -- {"3rd/image.nvim", opts = {}}, -- Optional image support in preview window: See `# Preview Mode` for more information | ||||
|     }, | ||||
|     lazy = false, -- neo-tree will lazily load itself | ||||
|     config = function() | ||||
|         require("neo-tree").setup({ | ||||
|             close_if_last_window = true, -- Close Neo-tree if it is the last window left in the tab | ||||
|             popup_border_style = "rounded", | ||||
|             enable_git_status = true, | ||||
|             enable_diagnostics = true, | ||||
|             use_default_mappings = false, | ||||
|             open_files_do_not_replace_types = { "terminal", "trouble", "qf" }, -- when opening files, do not use windows containing these filetypes or buftypes | ||||
|             open_files_using_relative_paths = 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)                            -- natural sort | ||||
|                 if a.type == b.type then | ||||
|                     local ap = a.path:lower() | ||||
|                     local bp = b.path:lower() | ||||
| 	"nvim-neo-tree/neo-tree.nvim", | ||||
| 	dependencies = { | ||||
| 		"nvim-lua/plenary.nvim", | ||||
| 		"nvim-tree/nvim-web-devicons", -- not strictly required, but recommended | ||||
| 		"MunifTanjim/nui.nvim", | ||||
| 		-- {"3rd/image.nvim", opts = {}}, -- Optional image support in preview window: See `# Preview Mode` for more information | ||||
| 	}, | ||||
| 	lazy = false, -- neo-tree will lazily load itself | ||||
| 	config = function() | ||||
|         -- Automatically open up  | ||||
| 		local function toggle_single_item_folders() | ||||
| 			local nodes = require("neo-tree.sources.filesystem").get_nodes() | ||||
|  | ||||
|                     if ap == bp then | ||||
|                         return false | ||||
|                     end | ||||
| 			for _, node in ipairs(nodes) do | ||||
| 				-- Check if the node is a directory | ||||
| 				if node.type == "directory" then | ||||
| 					local children = node:get_children() | ||||
| 					if #children == 1 then | ||||
| 						-- If it only has one child, make the folder appear stacked | ||||
| 						node.collapsed = false -- Open the directory automatically | ||||
| 					else | ||||
| 						node.collapsed = true -- Keep multi-item directories collapsed | ||||
| 					end | ||||
| 				end | ||||
| 			end | ||||
|  | ||||
|                     for i = 1, math.max(string.len(ap), string.len(bp)), 1 do | ||||
|                         local l = string.sub(ap, i, -1) | ||||
|                         local r = string.sub(bp, i, -1) | ||||
| 			-- Refresh Neotree to reflect changes | ||||
| 			require("neo-tree").refresh() | ||||
| 		end | ||||
| 		require("neo-tree").setup({ | ||||
| 			close_if_last_window = true, -- Close Neo-tree if it is the last window left in the tab | ||||
| 			popup_border_style = "rounded", | ||||
| 			enable_git_status = true, | ||||
| 			enable_diagnostics = true, | ||||
| 			use_default_mappings = false, | ||||
| 			open_files_do_not_replace_types = { "terminal", "trouble", "qf" }, -- when opening files, do not use windows containing these filetypes or buftypes | ||||
| 			open_files_using_relative_paths = 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) -- natural sort | ||||
| 				if a.type == b.type then | ||||
| 					local ap = a.path:lower() | ||||
| 					local bp = b.path:lower() | ||||
|  | ||||
|                         if | ||||
|                             type(tonumber(string.sub(l, 1, 1))) == "number" | ||||
|                             and type(tonumber(string.sub(r, 1, 1))) == "number" | ||||
|                         then | ||||
|                             local l_number = tonumber(string.match(l, "^[0-9]+")) | ||||
|                             local r_number = tonumber(string.match(r, "^[0-9]+")) | ||||
| 					if ap == bp then | ||||
| 						return false | ||||
| 					end | ||||
|  | ||||
|                             if l_number ~= r_number then | ||||
|                                 return l_number < r_number | ||||
|                             end | ||||
|                         elseif string.sub(l, 1, 1) ~= string.sub(r, 1, 1) then | ||||
|                             return l < r | ||||
|                         end | ||||
|                     end | ||||
|                 else | ||||
|                     return a.type < b.type | ||||
|                 end | ||||
|             end, | ||||
|             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 = "", | ||||
|                     provider = function(icon, node, state) -- default icon provider utilizes nvim-web-devicons if available | ||||
|                         if node.type == "file" or node.type == "terminal" then | ||||
|                             local success, web_devicons = pcall(require, "nvim-web-devicons") | ||||
|                             local name = node.type == "terminal" and "terminal" or node.name | ||||
|                             if success then | ||||
|                                 local devicon, hl = web_devicons.get_icon(name) | ||||
|                                 icon.text = devicon or icon.text | ||||
|                                 icon.highlight = hl or icon.highlight | ||||
|                             end | ||||
|                         end | ||||
|                     end, | ||||
|                     -- 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 = true, | ||||
|                     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 = "", | ||||
|                     }, | ||||
|                 }, | ||||
|                 -- If you don't want to use these columns, you can set `enabled = false` for each of them individually | ||||
|                 file_size = { | ||||
|                     enabled = true, | ||||
|                     width = 12, -- width of the column | ||||
|                     required_width = 64, -- min width of window required to show this column | ||||
|                 }, | ||||
|                 type = { | ||||
|                     enabled = true, | ||||
|                     width = 10, -- width of the column | ||||
|                     required_width = 122, -- min width of window required to show this column | ||||
|                 }, | ||||
|                 last_modified = { | ||||
|                     enabled = true, | ||||
|                     width = 20, -- width of the column | ||||
|                     required_width = 88, -- min width of window required to show this column | ||||
|                 }, | ||||
|                 created = { | ||||
|                     enabled = true, | ||||
|                     width = 20, -- width of the column | ||||
|                     required_width = 110, -- min width of window required to show this column | ||||
|                 }, | ||||
|                 symlink_target = { | ||||
|                     enabled = false, | ||||
|                 }, | ||||
|             }, | ||||
|             -- A list of functions, each representing a global custom command | ||||
|             -- that will be available in all sources (if not overridden in `opts[source_name].commands`) | ||||
|             -- see `:h neo-tree-custom-commands-global` | ||||
|             commands = {}, | ||||
|             window = { | ||||
|                 position = "left", | ||||
|                 width = 40, | ||||
|                 mapping_options = { | ||||
|                     noremap = true, | ||||
|                     nowait = true, | ||||
|                 }, | ||||
|                 mappings = { | ||||
|                     ["<2-LeftMouse>"] = "open", | ||||
|                     ["<cr>"] = "open", | ||||
|                     ["o"] = "open", | ||||
|                     ["<esc>"] = "cancel", -- close preview or floating neo-tree window | ||||
|                     ["P"] = { "toggle_preview", config = { use_float = true, use_image_nvim = true } }, | ||||
|                     -- Read `# Preview Mode` for more information | ||||
|                     ["l"] = "focus_preview", | ||||
|                     ["S"] = "open_split", | ||||
|                     ["v"] = "open_vsplit", | ||||
|                     ["t"] = "open_tabnew", | ||||
|                     ["w"] = "open_with_window_picker", | ||||
|                     ["C"] = "close_node", | ||||
|                     -- ['C'] = 'close_all_subnodes', | ||||
|                     ["z"] = "close_all_nodes", | ||||
|                     --["Z"] = "expand_all_nodes", | ||||
|                     ["q"] = "close_window", | ||||
|                     ["R"] = "refresh", | ||||
|                     ["?"] = "show_help", | ||||
|                     ["<"] = "prev_source", | ||||
|                     [">"] = "next_source", | ||||
|                     ["i"] = "show_file_details", | ||||
|                 }, | ||||
|             }, | ||||
|             nesting_rules = {}, | ||||
|             filesystem = { | ||||
|                 filtered_items = { | ||||
|                     visible = false, -- 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 | ||||
|                         --".gitignored", | ||||
|                     }, | ||||
|                     always_show_by_pattern = { -- uses glob style patterns | ||||
|                         --".env*", | ||||
|                     }, | ||||
|                     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 = { | ||||
|                     enabled = true,         -- This will find and focus the file in the active buffer every time | ||||
|                     --               -- the current file is changed while the tree is open. | ||||
|                     leave_dirs_open = false, -- `false` closes auto expanded dirs, such as with `:Neotree reveal` | ||||
|                 }, | ||||
|                 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 = { | ||||
|                         ["a"] = { | ||||
|                             "add", | ||||
|                             -- this command supports BASH style brace expansion ("x{a,b,c}" -> xa,xb,xc). see `:h neo-tree-file-actions` for details | ||||
|                             -- 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". this also supports BASH style brace expansion. | ||||
|                         ["d"] = "delete", | ||||
|                         ["r"] = "rename", | ||||
|                         ["b"] = "rename_basename", | ||||
|                         ["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": | ||||
|                         ["m"] = "move", -- takes text input for destination, also accepts the optional config.show_path option like "add". | ||||
|                         ["<bs>"] = "navigate_up", | ||||
|                         ["."] = "set_root", | ||||
|                         ["H"] = "toggle_hidden", | ||||
|                         ["/"] = "fuzzy_finder", | ||||
|                         ["D"] = "fuzzy_finder_directory", | ||||
|                         ["#"] = "fuzzy_sorter", -- fuzzy sorting using the fzy algorithm | ||||
|                         -- ["D"] = "fuzzy_sorter_directory", | ||||
|                         ["f"] = "filter_on_submit", | ||||
|                         ["<c-x>"] = "clear_filter", | ||||
|                         ["[g"] = "prev_git_modified", | ||||
|                         ["]g"] = "next_git_modified", | ||||
|                         ["s"] = { | ||||
|                             "show_help", | ||||
|                             nowait = false, | ||||
|                             config = { title = "Order by", prefix_key = "s" }, | ||||
|                         }, | ||||
|                         ["sc"] = { "order_by_created", nowait = false }, | ||||
|                         ["sd"] = { "order_by_diagnostics", nowait = false }, | ||||
|                         ["sg"] = { "order_by_git_status", nowait = false }, | ||||
|                         ["sm"] = { "order_by_modified", nowait = false }, | ||||
|                         ["sn"] = { "order_by_name", nowait = false }, | ||||
|                         ["ss"] = { "order_by_size", nowait = false }, | ||||
|                         ["st"] = { "order_by_type", nowait = false }, | ||||
|                         -- ['<key>'] = function(state) ... end, | ||||
|                     }, | ||||
|                     fuzzy_finder_mappings = { -- define keymaps for filter popup window in fuzzy_finder_mode | ||||
|                         ["<down>"] = "move_cursor_down", | ||||
|                         ["<C-n>"] = "move_cursor_down", | ||||
|                         ["<up>"] = "move_cursor_up", | ||||
|                         ["<C-p>"] = "move_cursor_up", | ||||
|                         ["<esc>"] = "close", | ||||
|                         -- ['<key>'] = function(state, scroll_padding) ... end, | ||||
|                     }, | ||||
|                 }, | ||||
| 					for i = 1, math.max(string.len(ap), string.len(bp)), 1 do | ||||
| 						local l = string.sub(ap, i, -1) | ||||
| 						local r = string.sub(bp, i, -1) | ||||
|  | ||||
|                 commands = {}, -- Add a custom command or override a global one using the same function name | ||||
|             }, | ||||
|             buffers = { | ||||
|                 follow_current_file = { | ||||
|                     enabled = true, -- This will find and focus the file in the active buffer every time | ||||
|                     --              -- the current file is changed while the tree is open. | ||||
|                     leave_dirs_open = false, -- `false` closes auto expanded dirs, such as with `:Neotree reveal` | ||||
|                 }, | ||||
|                 group_empty_dirs = true, -- when true, empty folders will be grouped together | ||||
|                 show_unloaded = true, | ||||
|                 window = { | ||||
|                     mappings = { | ||||
|                         ["d"] = "buffer_delete", | ||||
|                         ["bd"] = "buffer_delete", | ||||
|                         ["<bs>"] = "navigate_up", | ||||
|                         ["."] = "set_root", | ||||
|                         ["s"] = { | ||||
|                             "show_help", | ||||
|                             nowait = false, | ||||
|                             config = { title = "Order by", prefix_key = "s" }, | ||||
|                         }, | ||||
|                         ["sc"] = { "order_by_created", nowait = false }, | ||||
|                         ["sd"] = { "order_by_diagnostics", nowait = false }, | ||||
|                         ["sm"] = { "order_by_modified", nowait = false }, | ||||
|                         ["sn"] = { "order_by_name", nowait = false }, | ||||
|                         ["ss"] = { "order_by_size", nowait = false }, | ||||
|                         ["st"] = { "order_by_type", nowait = false }, | ||||
|                     }, | ||||
|                 }, | ||||
|             }, | ||||
|             git_status = { | ||||
|                 window = { | ||||
|                     position = "float", | ||||
|                     mappings = { | ||||
|                         ["A"] = "git_add_all", | ||||
|                         ["u"] = "git_unstage_file", | ||||
|                         ["a"] = "git_add_file", | ||||
|                         ["r"] = "git_revert_file", | ||||
|                         ["c"] = "git_commit", | ||||
|                         ["p"] = "git_push", | ||||
|                         ["g"] = "git_commit_and_push", | ||||
|                         ["s"] = { | ||||
|                             "show_help", | ||||
|                             nowait = false, | ||||
|                             config = { title = "Order by", prefix_key = "s" }, | ||||
|                         }, | ||||
|                         ["sc"] = { "order_by_created", nowait = false }, | ||||
|                         ["sd"] = { "order_by_diagnostics", nowait = false }, | ||||
|                         ["sm"] = { "order_by_modified", nowait = false }, | ||||
|                         ["sn"] = { "order_by_name", nowait = false }, | ||||
|                         ["ss"] = { "order_by_size", nowait = false }, | ||||
|                         ["st"] = { "order_by_type", nowait = false }, | ||||
|                     }, | ||||
|                 }, | ||||
|             }, | ||||
|         }) | ||||
| 						if | ||||
| 							type(tonumber(string.sub(l, 1, 1))) == "number" | ||||
| 							and type(tonumber(string.sub(r, 1, 1))) == "number" | ||||
| 						then | ||||
| 							local l_number = tonumber(string.match(l, "^[0-9]+")) | ||||
| 							local r_number = tonumber(string.match(r, "^[0-9]+")) | ||||
|  | ||||
|         vim.keymap.set("n", "<leader>e", "<Cmd>Neotree<CR>", { silent = true, desc = "Open Neotree" }) | ||||
|         vim.keymap.set( | ||||
|             "n", | ||||
|             "<leader><leader>e", | ||||
|             "<Cmd>Neotree reveal<CR>", | ||||
|             { silent = true, desc = "Go to currently open file in buffer or close" } | ||||
|         ) | ||||
|         vim.keymap.set( | ||||
|             "n", | ||||
|             "<leader><leader>g", | ||||
|             "<Cmd>Neotree source=git_status position=float<CR>", | ||||
|             { silent = true, desc = "Open git view" } | ||||
|         ) | ||||
|     end, | ||||
| 							if l_number ~= r_number then | ||||
| 								return l_number < r_number | ||||
| 							end | ||||
| 						elseif string.sub(l, 1, 1) ~= string.sub(r, 1, 1) then | ||||
| 							return l < r | ||||
| 						end | ||||
| 					end | ||||
| 				else | ||||
| 					return a.type < b.type | ||||
| 				end | ||||
| 			end, | ||||
| 			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 = "", | ||||
| 					provider = function(icon, node, state) -- default icon provider utilizes nvim-web-devicons if available | ||||
| 						if node.type == "file" or node.type == "terminal" then | ||||
| 							local success, web_devicons = pcall(require, "nvim-web-devicons") | ||||
| 							local name = node.type == "terminal" and "terminal" or node.name | ||||
| 							if success then | ||||
| 								local devicon, hl = web_devicons.get_icon(name) | ||||
| 								icon.text = devicon or icon.text | ||||
| 								icon.highlight = hl or icon.highlight | ||||
| 							end | ||||
| 						end | ||||
| 					end, | ||||
| 					-- 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 = true, | ||||
| 					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 = "", | ||||
| 					}, | ||||
| 				}, | ||||
| 				-- If you don't want to use these columns, you can set `enabled = false` for each of them individually | ||||
| 				file_size = { | ||||
| 					enabled = true, | ||||
| 					width = 12, -- width of the column | ||||
| 					required_width = 64, -- min width of window required to show this column | ||||
| 				}, | ||||
| 				type = { | ||||
| 					enabled = true, | ||||
| 					width = 10, -- width of the column | ||||
| 					required_width = 122, -- min width of window required to show this column | ||||
| 				}, | ||||
| 				last_modified = { | ||||
| 					enabled = true, | ||||
| 					width = 20, -- width of the column | ||||
| 					required_width = 88, -- min width of window required to show this column | ||||
| 				}, | ||||
| 				created = { | ||||
| 					enabled = true, | ||||
| 					width = 20, -- width of the column | ||||
| 					required_width = 110, -- min width of window required to show this column | ||||
| 				}, | ||||
| 				symlink_target = { | ||||
| 					enabled = false, | ||||
| 				}, | ||||
| 			}, | ||||
| 			-- A list of functions, each representing a global custom command | ||||
| 			-- that will be available in all sources (if not overridden in `opts[source_name].commands`) | ||||
| 			-- see `:h neo-tree-custom-commands-global` | ||||
| 			commands = {}, | ||||
| 			window = { | ||||
| 				position = "left", | ||||
| 				width = 40, | ||||
| 				mapping_options = { | ||||
| 					noremap = true, | ||||
| 					nowait = true, | ||||
| 				}, | ||||
| 				mappings = { | ||||
| 					["<2-LeftMouse>"] = "open", | ||||
| 					["<cr>"] = "open", | ||||
| 					["o"] = "open", | ||||
| 					["<esc>"] = "cancel", -- close preview or floating neo-tree window | ||||
| 					["P"] = { "toggle_preview", config = { use_float = true, use_image_nvim = true } }, | ||||
| 					-- Read `# Preview Mode` for more information | ||||
| 					["l"] = "focus_preview", | ||||
| 					["S"] = "open_split", | ||||
| 					["v"] = "open_vsplit", | ||||
| 					["t"] = "open_tabnew", | ||||
| 					["w"] = "open_with_window_picker", | ||||
| 					["C"] = "close_node", | ||||
| 					-- ['C'] = 'close_all_subnodes', | ||||
| 					["z"] = "close_all_nodes", | ||||
| 					--["Z"] = "expand_all_nodes", | ||||
| 					["q"] = "close_window", | ||||
| 					["R"] = "refresh", | ||||
| 					["?"] = "show_help", | ||||
| 					["<"] = "prev_source", | ||||
| 					[">"] = "next_source", | ||||
| 					["i"] = "show_file_details", | ||||
| 				}, | ||||
| 			}, | ||||
| 			nesting_rules = {}, | ||||
| 			filesystem = { | ||||
|                 scan_mode = 'deep', | ||||
| 				filtered_items = { | ||||
| 					visible = false, -- 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 | ||||
| 						--".gitignored", | ||||
| 					}, | ||||
| 					always_show_by_pattern = { -- uses glob style patterns | ||||
| 						--".env*", | ||||
| 					}, | ||||
| 					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 = { | ||||
| 					enabled = true, -- This will find and focus the file in the active buffer every time | ||||
| 					--               -- the current file is changed while the tree is open. | ||||
| 					leave_dirs_open = false, -- `false` closes auto expanded dirs, such as with `:Neotree reveal` | ||||
| 				}, | ||||
| 				group_empty_dirs = true, -- 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 = { | ||||
| 						["a"] = { | ||||
| 							"add", | ||||
| 							-- this command supports BASH style brace expansion ("x{a,b,c}" -> xa,xb,xc). see `:h neo-tree-file-actions` for details | ||||
| 							-- 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". this also supports BASH style brace expansion. | ||||
| 						["d"] = "delete", | ||||
| 						["r"] = "rename", | ||||
| 						["b"] = "rename_basename", | ||||
| 						["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": | ||||
| 						["m"] = "move", -- takes text input for destination, also accepts the optional config.show_path option like "add". | ||||
| 						["<bs>"] = "navigate_up", | ||||
| 						["."] = "set_root", | ||||
| 						["H"] = "toggle_hidden", | ||||
| 						["/"] = "fuzzy_finder", | ||||
| 						["D"] = "fuzzy_finder_directory", | ||||
| 						["#"] = "fuzzy_sorter", -- fuzzy sorting using the fzy algorithm | ||||
| 						-- ["D"] = "fuzzy_sorter_directory", | ||||
| 						["f"] = "filter_on_submit", | ||||
| 						["<c-x>"] = "clear_filter", | ||||
| 						["[g"] = "prev_git_modified", | ||||
| 						["]g"] = "next_git_modified", | ||||
| 						["s"] = { | ||||
| 							"show_help", | ||||
| 							nowait = false, | ||||
| 							config = { title = "Order by", prefix_key = "s" }, | ||||
| 						}, | ||||
| 						["sc"] = { "order_by_created", nowait = false }, | ||||
| 						["sd"] = { "order_by_diagnostics", nowait = false }, | ||||
| 						["sg"] = { "order_by_git_status", nowait = false }, | ||||
| 						["sm"] = { "order_by_modified", nowait = false }, | ||||
| 						["sn"] = { "order_by_name", nowait = false }, | ||||
| 						["ss"] = { "order_by_size", nowait = false }, | ||||
| 						["st"] = { "order_by_type", nowait = false }, | ||||
| 						-- ['<key>'] = function(state) ... end, | ||||
| 					}, | ||||
| 					fuzzy_finder_mappings = { -- define keymaps for filter popup window in fuzzy_finder_mode | ||||
| 						["<down>"] = "move_cursor_down", | ||||
| 						["<C-n>"] = "move_cursor_down", | ||||
| 						["<up>"] = "move_cursor_up", | ||||
| 						["<C-p>"] = "move_cursor_up", | ||||
| 						["<esc>"] = "close", | ||||
| 						-- ['<key>'] = function(state, scroll_padding) ... end, | ||||
| 					}, | ||||
| 				}, | ||||
|  | ||||
| 				commands = {}, -- Add a custom command or override a global one using the same function name | ||||
| 			}, | ||||
| 			buffers = { | ||||
| 				follow_current_file = { | ||||
| 					enabled = true, -- This will find and focus the file in the active buffer every time | ||||
| 					--              -- the current file is changed while the tree is open. | ||||
| 					leave_dirs_open = false, -- `false` closes auto expanded dirs, such as with `:Neotree reveal` | ||||
| 				}, | ||||
| 				group_empty_dirs = true, -- when true, empty folders will be grouped together | ||||
| 				show_unloaded = true, | ||||
| 				window = { | ||||
| 					mappings = { | ||||
| 						["d"] = "buffer_delete", | ||||
| 						["bd"] = "buffer_delete", | ||||
| 						["<bs>"] = "navigate_up", | ||||
| 						["."] = "set_root", | ||||
| 						["s"] = { | ||||
| 							"show_help", | ||||
| 							nowait = false, | ||||
| 							config = { title = "Order by", prefix_key = "s" }, | ||||
| 						}, | ||||
| 						["sc"] = { "order_by_created", nowait = false }, | ||||
| 						["sd"] = { "order_by_diagnostics", nowait = false }, | ||||
| 						["sm"] = { "order_by_modified", nowait = false }, | ||||
| 						["sn"] = { "order_by_name", nowait = false }, | ||||
| 						["ss"] = { "order_by_size", nowait = false }, | ||||
| 						["st"] = { "order_by_type", nowait = false }, | ||||
| 					}, | ||||
| 				}, | ||||
| 			}, | ||||
| 			git_status = { | ||||
| 				window = { | ||||
| 					position = "float", | ||||
| 					mappings = { | ||||
| 						["A"] = "git_add_all", | ||||
| 						["u"] = "git_unstage_file", | ||||
| 						["a"] = "git_add_file", | ||||
| 						["r"] = "git_revert_file", | ||||
| 						["c"] = "git_commit", | ||||
| 						["p"] = "git_push", | ||||
| 						["g"] = "git_commit_and_push", | ||||
| 						["s"] = { | ||||
| 							"show_help", | ||||
| 							nowait = false, | ||||
| 							config = { title = "Order by", prefix_key = "s" }, | ||||
| 						}, | ||||
| 						["sc"] = { "order_by_created", nowait = false }, | ||||
| 						["sd"] = { "order_by_diagnostics", nowait = false }, | ||||
| 						["sm"] = { "order_by_modified", nowait = false }, | ||||
| 						["sn"] = { "order_by_name", nowait = false }, | ||||
| 						["ss"] = { "order_by_size", nowait = false }, | ||||
| 						["st"] = { "order_by_type", nowait = false }, | ||||
| 					}, | ||||
| 				}, | ||||
| 			}, | ||||
| 		}) | ||||
|  | ||||
| 		vim.keymap.set("n", "<leader>e", "<Cmd>Neotree<CR>", { silent = true, desc = "Open Neotree" }) | ||||
| 		vim.keymap.set( | ||||
| 			"n", | ||||
| 			"<leader><leader>e", | ||||
| 			"<Cmd>Neotree reveal<CR>", | ||||
| 			{ silent = true, desc = "Go to currently open file in buffer or close" } | ||||
| 		) | ||||
| 		vim.keymap.set( | ||||
| 			"n", | ||||
| 			"<leader><leader>g", | ||||
| 			"<Cmd>Neotree source=git_status position=float<CR>", | ||||
| 			{ silent = true, desc = "Open git view" } | ||||
| 		) | ||||
| 	end, | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user