return { "nvim-tree/nvim-tree.lua", lazy = false, dependencies = { "nvim-tree/nvim-web-devicons", }, opts = function() -- Not needed for our float config, if we remove the float mode then this works nicely for sidebar -- local getWidth = function() -- local w = vim.api.nvim_get_option("columns") -- return math.ceil(w * 0.2) -- end -- vim.api.nvim_create_autocmd("VimResized", { -- pattern = "*", -- callback = function() -- vim.cmd("NvimTreeResize " .. tostring(getWidth())) -- end, -- }) return { sort = { sorter = "case_sensitive", }, view = { -- width = getWidth(), float = { enable = true, open_win_config = function() local cols = vim.api.nvim_get_option("columns") local rows = vim.api.nvim_get_option("lines") local width = math.floor(cols / 2) local height = math.floor(rows / 1.2) return { relative = "editor", row = math.floor(rows / 10), col = math.floor(cols / 4), width = width, height = height, border = "rounded", } end, }, }, renderer = { group_empty = true, indent_width = 3, icons = { glyphs = { git = { unstaged = "", }, }, }, }, filters = { dotfiles = false, git_ignored = false, exclude = { ".DS_Store" }, }, actions = { open_file = { quit_on_open = true, window_picker = { enable = false, }, }, }, on_attach = function(bufnr) -- https://github.com/nvim-tree/nvim-tree.lua/wiki/Recipes#modify-you-on_attach-function-to-have-ability-to-operate-multiple-files-at-once local api = require("nvim-tree.api") local opts = function(desc) return { desc = "nvim-tree: " .. desc, buffer = bufnr, noremap = true, silent = true, nowait = true } end -- mark operation local mark_move_j = function() api.marks.toggle() vim.cmd("norm j") end local mark_move_k = function() api.marks.toggle() vim.cmd("norm k") end -- marked files operation local mark_remove = function() local marks = api.marks.list() if #marks == 0 then table.insert(marks, api.tree.get_node_under_cursor()) end vim.ui.input({ prompt = string.format("Remove/Delete %s files? [y/n] ", #marks) }, function(input) if input == "y" then for _, node in ipairs(marks) do api.fs.remove(node) end api.marks.clear() api.tree.reload() end end) end local mark_copy = function() local marks = api.marks.list() if #marks == 0 then table.insert(marks, api.tree.get_node_under_cursor()) end for _, node in pairs(marks) do api.fs.copy.node(node) end api.marks.clear() api.tree.reload() end local mark_cut = function() local marks = api.marks.list() if #marks == 0 then table.insert(marks, api.tree.get_node_under_cursor()) end for _, node in pairs(marks) do api.fs.cut(node) end api.marks.clear() api.tree.reload() end local mark_move_to_cursor = function() local marks = api.marks.list() if #marks == 0 then table.insert(marks, api.tree.get_node_under_cursor()) end for _, node in pairs(marks) do api.fs.cut(node) end api.marks.clear() api.fs.paste() api.tree.reload() end vim.keymap.set("n", "p", api.fs.paste, opts("Paste")) vim.keymap.set("n", "J", mark_move_j, opts("Toggle Bookmark Down")) vim.keymap.set("n", "K", mark_move_k, opts("Toggle Bookmark Up")) vim.keymap.set("n", "x", mark_cut, opts("Cut File(s)")) vim.keymap.set("n", "d", mark_remove, opts("Remove File(s)")) vim.keymap.set("n", "y", mark_copy, opts("Copy File(s)")) vim.keymap.set("n", "mv", mark_move_to_cursor, opts("Move Bookmarked")) vim.keymap.set("n", "M", api.marks.clear, opts("Clear Bookmarks")) -- https://github.com/nvim-tree/nvim-tree.lua/wiki/Recipes#refactoring-of-on_attach-generated-code vim.keymap.set("n", "q", api.tree.close, opts("Close")) vim.keymap.set("n", "", api.tree.close, opts("Close")) vim.keymap.set("n", "o", api.tree.close, opts("Close")) vim.keymap.set("n", "", api.node.open.edit, opts("Open")) vim.keymap.set("n", "o", api.node.open.edit, opts("Open")) vim.keymap.set("n", "l", api.node.open.edit, opts("Open")) vim.keymap.set("n", "h", api.node.navigate.parent_close, opts("Close Directory")) vim.keymap.set("n", "<2-LeftMouse>", api.node.open.edit, opts("Open")) vim.keymap.set("n", "r", api.fs.rename, opts("Rename")) vim.keymap.set("n", "a", api.fs.create, opts("Create")) vim.keymap.set("n", "p", api.fs.paste, opts("Paste")) vim.keymap.set("n", "R", api.tree.reload, opts("Refresh")) vim.keymap.set("n", "m", api.marks.toggle, opts("Toggle Bookmark")) vim.keymap.set("n", "h", api.node.navigate.parent_close, opts("Close Directory")) vim.keymap.set("n", "?", api.tree.toggle_help, opts("Help")) end, } end, keys = { { "e", "NvimTreeToggle", desc = "Open file browser" }, { "o", "NvimTreeFindFile", desc = "Open file browser at current buffer" }, }, }