From 9da4462377019acc552f823bc669ab4b0b223a87 Mon Sep 17 00:00:00 2001 From: kiyan Date: Sun, 31 Jul 2022 12:23:50 +0200 Subject: [PATCH 01/42] chore(mappings): migrate legacy mappings under the hood --- lua/nvim-tree.lua | 3 +- lua/nvim-tree/api.lua | 16 +++++-- lua/nvim-tree/legacy.lua | 94 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 108 insertions(+), 5 deletions(-) diff --git a/lua/nvim-tree.lua b/lua/nvim-tree.lua index 2baa9235d37..3aae845dd21 100644 --- a/lua/nvim-tree.lua +++ b/lua/nvim-tree.lua @@ -666,8 +666,9 @@ function M.setup(conf) validate_options(conf) local opts = merge_options(conf) - local netrw_disabled = opts.disable_netrw or opts.hijack_netrw + legacy.move_mappings_to_keymap(opts) + local netrw_disabled = opts.disable_netrw or opts.hijack_netrw _config.root_dirs = opts.root_dirs _config.prefer_startup_root = opts.prefer_startup_root _config.update_focused_file = opts.update_focused_file diff --git a/lua/nvim-tree/api.lua b/lua/nvim-tree/api.lua index 4d9798e1bec..cf6b0b5d7b1 100644 --- a/lua/nvim-tree/api.lua +++ b/lua/nvim-tree/api.lua @@ -15,12 +15,20 @@ local function inject_node(f) end end -Api.tree.open = require("nvim-tree").open -Api.tree.toggle = require("nvim-tree").toggle +Api.tree.open = function(...) + require("nvim-tree").open(...) +end +Api.tree.toggle = function(...) + require("nvim-tree").toggle(...) +end Api.tree.close = require("nvim-tree.view").close -Api.tree.focus = require("nvim-tree").focus +Api.tree.focus = function() + require("nvim-tree").focus() +end Api.tree.reload = require("nvim-tree.actions.reloaders.reloaders").reload_explorer -Api.tree.change_root = require("nvim-tree").change_dir +Api.tree.change_root = function(...) + require("nvim-tree").change_dir(...) +end Api.tree.change_root_to_node = inject_node(function(node) if node.name == ".." then require("nvim-tree.actions.root.change-dir").fn ".." diff --git a/lua/nvim-tree/legacy.lua b/lua/nvim-tree/legacy.lua index 7f803f73c04..6c64579d1df 100644 --- a/lua/nvim-tree/legacy.lua +++ b/lua/nvim-tree/legacy.lua @@ -1,4 +1,5 @@ local utils = require "nvim-tree.utils" +local Api = require "nvim-tree.api" local M = {} @@ -297,6 +298,99 @@ local function removed(opts) end end +local OLD_MAPPING_TABLE = { + edit = Api.node.open.edit, + edit_in_place = Api.node.open.replace_tree_buffer, + edit_no_picker = Api.node.open.no_window_picker, + cd = Api.tree.change_root_to_node, + vsplit = Api.node.open.vertical, + split = Api.node.open.horizontal, + tabnew = Api.node.open.tab, + preview = Api.node.open.preview, + prev_sibling = Api.node.navigate.sibling.prev, + next_sibling = Api.node.navigate.sibling.next, + parent_node = Api.node.navigate.parent, + close_node = Api.node.navigate.parent_close, + first_sibling = Api.node.navigate.sibling.first, + last_sibling = Api.node.navigate.sibling.last, + toggle_git_ignored = Api.tree.toggle_gitignore_filter, + toggle_dotfiles = Api.tree.toggle_hidden_filter, + toggle_custom = Api.tree.toggle_custom_filter, + refresh = Api.tree.reload, + create = Api.fs.create, + remove = Api.fs.remove, + trash = Api.fs.trash, + rename = Api.fs.rename, + full_rename = Api.fs.rename_sub, + cut = Api.fs.cut, + copy = Api.fs.copy.node, + paste = Api.fs.paste, + copy_name = Api.fs.copy.filename, + copy_path = Api.fs.copy.relative_path, + copy_absolute_path = Api.fs.copy.absolute_path, + prev_git_item = Api.node.navigate.git.prev, + next_git_item = Api.node.navigate.git.next, + prev_diag_item = Api.node.navigate.diagnostics.prev, + next_diag_item = Api.node.navigate.diagnostics.next, + dir_up = Api.tree.change_root_to_parent, + system_open = Api.node.run.system, + live_filter = Api.live_filter.start, + clear_live_filter = Api.live_filter.clear, + close = Api.tree.close, + collapse_all = Api.tree.collapse_all, + expand_all = Api.tree.expand_all, + search_node = Api.tree.search_node, + run_file_command = Api.node.run.cmd, + toggle_file_info = Api.node.show_info_popup, + toggle_help = Api.tree.toggle_help, + toggle_mark = Api.marks.toggle, + bulk_move = Api.marks.bulk.move, +} + +function M.move_mappings_to_keymap(opts) + if opts.on_attach == "disable" and opts.view and opts.view.mappings then + local custom_only, list = opts.view.mappings.custom_only, opts.view.mappings.list + if custom_only then + opts.remove_keymaps = true + opts.view.mappings.custom_only = nil + end + if list then + if not custom_only then + opts.remove_keymaps = {} + end + local call_list = {} + opts.on_attach = function(bufnr) + for _, el in pairs(call_list) do + vim.keymap.set(el.mode or "n", el.key, el.callback, { buffer = bufnr, remap = false, silent = true }) + end + end + for _, map in pairs(list) do + local keys = type(map.key) == "table" and map.key or { map.key } + local mode = map.mode or "n" + local callback + if map.action ~= "" then + if map.action_cb then + callback = map.action_cb + else + callback = OLD_MAPPING_TABLE[map.action] + end + end + + for _, k in pairs(keys) do + if not custom_only and not vim.tbl_contains(opts.remove_keymaps, k) then + table.insert(opts.remove_keymaps, k) + end + + if callback then + table.insert(call_list, { mode = mode, key = k, callback = callback }) + end + end + end + opts.view.mappings.list = nil + end + end +end + function M.migrate_legacy_options(opts) -- g: options local msg From 2df271038cd82d3cbaf4cbeecbd34b83cc080ab4 Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Mon, 1 Aug 2022 14:17:46 +1000 Subject: [PATCH 02/42] chore(mappings): POC for help and :help on_attach keymaps --- lua/nvim-tree/keymap.lua | 236 +++++++++++++++++++++++++------- lua/nvim-tree/renderer/help.lua | 65 +++++++-- 2 files changed, 237 insertions(+), 64 deletions(-) diff --git a/lua/nvim-tree/keymap.lua b/lua/nvim-tree/keymap.lua index 74b96d1d2fd..d7fd0525fae 100644 --- a/lua/nvim-tree/keymap.lua +++ b/lua/nvim-tree/keymap.lua @@ -2,236 +2,374 @@ local Api = require "nvim-tree.api" local M = {} -local DEFAULT_KEYMAPS = { +M.DEFAULT_KEYMAPS = { { key = { "", "o", "<2-LeftMouse>" }, callback = Api.node.open.edit, - desc = "open a file or folder; root will cd to the above directory", + desc = { + long = "open a file or folder; root will cd to the above directory", + short = "Open", + }, }, { key = "", callback = Api.node.open.replace_tree_buffer, - desc = "edit the file in place, effectively replacing the tree explorer", + desc = { + long = "edit the file in place, effectively replacing the tree explorer", + short = "Open: In Place", + }, }, { key = "O", callback = Api.node.open.no_window_picker, - desc = "same as (edit) with no window picker", + desc = { + long = "same as (edit) with no window picker", + short = "Open: No Window Picker", + }, }, { key = { "", "<2-RightMouse>" }, callback = Api.tree.change_root_to_node, - desc = "cd in the directory under the cursor", + desc = { + long = "cd in the directory under the cursor", + short = "cd", + }, }, { key = "", callback = Api.node.open.vertical, - desc = "open the file in a vertical split", + desc = { + long = "open the file in a vertical split", + short = "Open: Vertical Split", + }, }, { key = "", callback = Api.node.open.horizontal, - desc = "open the file in a horizontal split", + desc = { + long = "open the file in a horizontal split", + short = "Open: Horizontal Split", + }, }, { key = "", callback = Api.node.open.tab, - desc = "open the file in a new tab", + desc = { + long = "open the file in a new tab", + short = "Open: New Tab", + }, }, { key = "<", callback = Api.node.navigate.sibling.prev, - desc = "navigate to the previous sibling of current file/directory", + desc = { + long = "navigate to the previous sibling of current file/directory", + short = "Previous Sibling", + }, }, { key = ">", callback = Api.node.navigate.sibling.next, - desc = "navigate to the next sibling of current file/directory", + desc = { + long = "navigate to the next sibling of current file/directory", + short = "Next Sibling", + }, }, { key = "P", callback = Api.node.navigate.parent, - desc = "move cursor to the parent directory", + desc = { + long = "move cursor to the parent directory", + short = "Parent Directory", + }, }, { key = "", callback = Api.node.navigate.parent_close, - desc = "close current opened directory or parent", + desc = { + long = "close current opened directory or parent", + short = "Close Folder", + }, }, { key = "", callback = Api.node.open.preview, - desc = "open the file as a preview (keeps the cursor in the tree)", + desc = { + long = "open the file as a preview (keeps the cursor in the tree)", + short = "Open Preview", + }, }, { key = "K", callback = Api.node.navigate.sibling.first, - desc = "navigate to the first sibling of current file/directory", + desc = { + long = "navigate to the first sibling of current file/directory", + short = "First Sibling", + }, }, { key = "J", callback = Api.node.navigate.sibling.last, - desc = "navigate to the last sibling of current file/directory", + desc = { + long = "navigate to the last sibling of current file/directory", + short = "Last Sibling", + }, }, { key = "I", callback = Api.tree.toggle_gitignore_filter, - desc = "toggle visibility of files/folders hidden via |git.ignore| option", + desc = { + long = "toggle visibility of files/folders hidden via |git.ignore| option", + short = "Toggle Git Ignore", + }, }, { key = "H", callback = Api.tree.toggle_hidden_filter, - desc = "toggle visibility of dotfiles via |filters.dotfiles| option", + desc = { + long = "toggle visibility of dotfiles via |filters.dotfiles| option", + short = "Toggle Dotfiles", + }, }, { key = "U", callback = Api.tree.toggle_custom_filter, - desc = "toggle visibility of files/folders hidden via |filters.custom| option", + desc = { + long = "toggle visibility of files/folders hidden via |filters.custom| option", + short = "Toggle Hidden", + }, }, { key = "R", callback = Api.tree.reload, - desc = "refresh the tree", + desc = { + long = "refresh the tree", + short = "Refresh", + }, }, { key = "a", callback = Api.fs.create, - desc = "add a file; leaving a trailing `/` will add a directory", + desc = { + long = "add a file; leaving a trailing `/` will add a directory", + short = "Create", + }, }, { key = "d", callback = Api.fs.remove, - desc = "delete a file (will prompt for confirmation)", + desc = { + long = "delete a file (will prompt for confirmation)", + short = "Delete", + }, }, { key = "D", callback = Api.fs.trash, - desc = "trash a file via |trash| option", + desc = { + long = "trash a file via |trash| option", + short = "Trash", + }, }, { key = "r", callback = Api.fs.rename, - desc = "rename a file", + desc = { + long = "rename a file", + short = "Rename", + }, }, { key = "", callback = Api.fs.rename_sub, - desc = "rename a file and omit the filename on input", + desc = { + long = "rename a file and omit the filename on input", + short = "Rename - Omit Filename", + }, }, { key = "x", callback = Api.fs.cut, - desc = "add/remove file/directory to cut clipboard", + desc = { + long = "add/remove file/directory to cut clipboard", + short = "Cut", + }, }, { key = "c", callback = Api.fs.copy.node, - desc = "add/remove file/directory to copy clipboard", + desc = { + long = "add/remove file/directory to copy clipboard", + short = "Copy", + }, }, { key = "p", callback = Api.fs.paste, - desc = "paste from clipboard; cut clipboard has precedence over copy; will prompt for confirmation", + desc = { + long = "paste from clipboard; cut clipboard has precedence over copy; will prompt for confirmation", + short = "Paste", + }, }, { key = "y", callback = Api.fs.copy.filename, - desc = "copy name to system clipboard", + desc = { + long = "copy name to system clipboard", + short = "Copy File Name", + }, }, { key = "Y", callback = Api.fs.copy.relative_path, - desc = "copy relative path to system clipboard", + desc = { + long = "copy relative path to system clipboard", + short = "Copy Relative Path", + }, }, { key = "gy", callback = Api.fs.copy.absolute_path, - desc = "copy absolute path to system clipboard", + desc = { + long = "copy absolute path to system clipboard", + short = "Copy Absolute Path", + }, }, { key = "[e", callback = Api.node.navigate.diagnostics.next, - desc = "go to next diagnostic item", + desc = { + long = "go to next diagnostic item", + short = "Next Diagnostic", + }, }, { key = "[c", callback = Api.node.navigate.git.next, - desc = "go to next git item", + desc = { + long = "go to next git item", + short = "Next Git", + }, }, { key = "]e", callback = Api.node.navigate.diagnostics.prev, - desc = "go to prev diagnostic item", + desc = { + long = "go to prev diagnostic item", + short = "Prev Diagnostic", + }, }, { key = "]c", callback = Api.node.navigate.git.prev, - desc = "go to prev git item", + desc = { + long = "go to prev git item", + short = "Prev Git", + }, }, { key = "-", callback = Api.tree.change_root_to_parent, - desc = "navigate up to the parent directory of the current file/directory", + desc = { + long = "navigate up to the parent directory of the current file/directory", + short = "Up", + }, }, { key = "s", callback = Api.node.run.system, - desc = "open a file with default system application or a folder with default file manager, using |system_open| option", + desc = { + long = "open a file with default system application or a folder with default file manager, using |system_open| option", + short = "Run System", + }, }, { key = "f", callback = Api.live_filter.start, - desc = "live filter nodes dynamically based on regex matching.", + desc = { + long = "live filter nodes dynamically based on regex matching.", + short = "Filter", + }, }, { key = "F", callback = Api.live_filter.clear, - desc = "clear live filter", + desc = { + long = "clear live filter", + short = "Clean Filter", + }, }, { key = "q", callback = Api.tree.close, - desc = "close tree window", + desc = { + long = "close tree window", + short = "Close", + }, }, { key = "W", callback = Api.tree.collapse_all, - desc = "collapse the whole tree", + desc = { + long = "collapse the whole tree", + short = "Collapse", + }, }, { key = "E", callback = Api.tree.expand_all, - desc = "expand the whole tree, stopping after expanding |callbacks.expand_all.max_folder_discovery| folders; this might hang neovim for a while if running on a big folder", + desc = { + long = "expand the whole tree, stopping after expanding |callbacks.expand_all.max_folder_discovery| folders; this might hang neovim for a while if running on a big folder", + short = "Expand All", + }, }, { key = "S", callback = Api.tree.search_node, - desc = "prompt the user to enter a path and then expands the tree to match the path", + desc = { + long = "prompt the user to enter a path and then expands the tree to match the path", + short = "Search", + }, }, { key = ".", callback = Api.node.run.cmd, - desc = "enter vim command mode with the file the cursor is on", + desc = { + long = "enter vim command mode with the file the cursor is on", + short = "Run Command", + }, }, { key = "", callback = Api.node.show_info_popup, - desc = "toggle a popup with file infos about the file under the cursor", + desc = { + long = "toggle a popup with file infos about the file under the cursor", + short = "Info", + }, }, { key = "g?", callback = Api.tree.toggle_help, - desc = "toggle help", + desc = { + long = "toggle help", + short = "Help", + }, }, { key = "m", callback = Api.marks.toggle, - desc = "Toggle node in bookmarks", + desc = { + long = "Toggle node in bookmarks", + short = "Toggle Bookmark", + }, }, { key = "bmv", callback = Api.marks.bulk.move, - desc = "Move all bookmarked nodes into specified location", + desc = { + long = "Move all bookmarked nodes into specified location", + short = "Move Bookmarked", + }, }, } @@ -247,7 +385,7 @@ end local function filter_default_mappings(keys_to_disable) local new_map = {} - for _, m in pairs(DEFAULT_KEYMAPS) do + for _, m in pairs(M.DEFAULT_KEYMAPS) do local keys = type(m.key) == "table" and m.key or { m.key } local reminding_keys = {} for _, key in pairs(keys) do @@ -280,7 +418,7 @@ local function get_keymaps(keys_to_disable) return filter_default_mappings(keys_to_disable) end - return DEFAULT_KEYMAPS + return M.DEFAULT_KEYMAPS end function M.setup(opts) diff --git a/lua/nvim-tree/renderer/help.lua b/lua/nvim-tree/renderer/help.lua index 61f00eb5827..210704a7a19 100644 --- a/lua/nvim-tree/renderer/help.lua +++ b/lua/nvim-tree/renderer/help.lua @@ -1,27 +1,62 @@ +local log = require "nvim-tree.log" + local M = {} +local function shorten_lhs(lhs) + lhs = lhs:gsub("LeftMouse", "LM") + lhs = lhs:gsub("RightMouse", "RM") + lhs = lhs:gsub("MiddleMouse", "MM") + lhs = lhs:gsub("ScrollWheelDown", "SWD") + lhs = lhs:gsub("ScrollWheelUp", "SWU") + lhs = lhs:gsub("ScrollWheelLeft", "SWL") + lhs = lhs:gsub("ScrollWheelRight", "SWR") + return lhs +end + function M.compute_lines() local help_lines = { "HELP" } local help_hl = { { "NvimTreeRootFolder", 0, 0, #help_lines[1] } } - local mappings = vim.tbl_filter(function(v) - return (v.cb ~= nil and v.cb ~= "") or (v.action ~= nil and v.action ~= "") - end, require("nvim-tree.actions").mappings) + + local buf_keymaps = vim.api.nvim_buf_get_keymap(vim.api.nvim_get_current_buf(), "n") + + log.line("dev", "%s", vim.inspect(buf_keymaps)) + local processed = {} - for _, b in pairs(mappings) do - local cb = b.cb - local key = b.key - local name - if cb and cb:sub(1, 35) == require("nvim-tree.config").nvim_tree_callback("test"):sub(1, 35) then - name = cb:match "'[^']+'[^']*$" - name = name:match "'[^']+'" - elseif b.action then - name = b.action + for _, bkm in ipairs(buf_keymaps) do + local default_keymap = nil + for _, dkm in ipairs(require("nvim-tree.keymap").DEFAULT_KEYMAPS) do + if bkm.callback == dkm.callback then + default_keymap = dkm + end + end + local lhs = shorten_lhs(bkm.lhs) + if default_keymap then + table.insert(processed, { lhs, default_keymap.desc.short }) else - name = (b.name ~= nil) and b.name or cb - name = '"' .. name .. '"' + table.insert(processed, { lhs, "" }) end - table.insert(processed, { key, name, true }) end + + -- local mappings = vim.tbl_filter(function(v) + -- return (v.cb ~= nil and v.cb ~= "") or (v.action ~= nil and v.action ~= "") + -- end, require("nvim-tree.actions").mappings) + -- local processed = {} + -- for _, b in pairs(mappings) do + -- local cb = b.cb + -- local key = b.key + -- local name + -- if cb and cb:sub(1, 35) == require("nvim-tree.config").nvim_tree_callback("test"):sub(1, 35) then + -- name = cb:match "'[^']+'[^']*$" + -- name = name:match "'[^']+'" + -- elseif b.action then + -- name = b.action + -- else + -- name = (b.name ~= nil) and b.name or cb + -- name = '"' .. name .. '"' + -- end + -- table.insert(processed, { key, name, true }) + -- end + table.sort(processed, function(a, b) return (a[3] == b[3] and (a[2] < b[2] or (a[2] == b[2] and #a[1] < #b[1]))) or (a[3] and not b[3]) end) From de53d6499a5aa37798f0386bc78191c2c6348795 Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Mon, 1 Aug 2022 15:32:50 +1000 Subject: [PATCH 03/42] chore(mappings): POC for help and :help on_attach keymaps --- lua/nvim-tree/keymap.lua | 10 ++++-- scripts/generate_default_keymaps.lua | 54 ++++++++++++++++++++++++++++ scripts/update-help.sh | 7 ++++ 3 files changed, 68 insertions(+), 3 deletions(-) create mode 100644 scripts/generate_default_keymaps.lua diff --git a/lua/nvim-tree/keymap.lua b/lua/nvim-tree/keymap.lua index d7fd0525fae..b54bb31d331 100644 --- a/lua/nvim-tree/keymap.lua +++ b/lua/nvim-tree/keymap.lua @@ -2,7 +2,8 @@ local Api = require "nvim-tree.api" local M = {} -M.DEFAULT_KEYMAPS = { +-- BEGIN_DEFAULT_KEYMAPS +local DEFAULT_KEYMAPS = { { key = { "", "o", "<2-LeftMouse>" }, callback = Api.node.open.edit, @@ -372,6 +373,7 @@ M.DEFAULT_KEYMAPS = { }, }, } +-- END_DEFAULT_KEYMAPS function M.set_keymaps(bufnr) local opts = { noremap = true, silent = true, nowait = true, buffer = bufnr } @@ -385,7 +387,7 @@ end local function filter_default_mappings(keys_to_disable) local new_map = {} - for _, m in pairs(M.DEFAULT_KEYMAPS) do + for _, m in pairs(DEFAULT_KEYMAPS) do local keys = type(m.key) == "table" and m.key or { m.key } local reminding_keys = {} for _, key in pairs(keys) do @@ -418,11 +420,13 @@ local function get_keymaps(keys_to_disable) return filter_default_mappings(keys_to_disable) end - return M.DEFAULT_KEYMAPS + return DEFAULT_KEYMAPS end function M.setup(opts) M.keymaps = get_keymaps(opts.remove_keymaps) end +M.DEFAULT_KEYMAPS = DEFAULT_KEYMAPS + return M diff --git a/scripts/generate_default_keymaps.lua b/scripts/generate_default_keymaps.lua new file mode 100644 index 00000000000..daa46a7c17c --- /dev/null +++ b/scripts/generate_default_keymaps.lua @@ -0,0 +1,54 @@ +-- luacheck:ignore 113 +---@diagnostic disable: undefined-global + +-- write DEFAULT_KEYMAPS in various formats + +local max_key_help = 0 +local max_short_help = 0 +local outs_help = {} + +for _, m in pairs(DEFAULT_KEYMAPS) do + local first = true + local keys = type(m.key) == "table" and m.key or { m.key } + for _, key in ipairs(keys) do + local out = {} + out.key = key + max_key_help = math.max(#out.key, max_key_help) + if first then + out.short = m.desc.short + max_short_help = math.max(#out.short, max_short_help) + out.long = m.desc.long + first = false + end + table.insert(outs_help, out) + end +end + +-- help +local file = io.open("/tmp/DEFAULT_KEYMAPS.help", "w") +io.output(file) +io.write "\n" +local fmt = string.format("%%-%d.%ds %%-%d.%ds %%s\n", max_key_help, max_key_help, max_short_help, max_short_help) +for _, m in pairs(outs_help) do + if not m.short then + io.write(string.format("%s\n", m.key)) + else + io.write(string.format(fmt, m.key, m.short, m.long)) + end +end +io.write "\n" +io.close(file) + +-- lua on_attach +file = io.open("/tmp/DEFAULT_KEYMAPS.on_attach.lua", "w") +io.output(file) +io.write "local function on_attach(bufnr, mode, opts)\n" +io.write "local Api = require('nvim-tree.api')\n" +for _, m in pairs(DEFAULT_KEYMAPS) do + local keys = type(m.key) == "table" and m.key or { m.key } + for _, key in ipairs(keys) do + io.write(string.format(" vim.keymap.set(mode, '%s', %s, opts)\n", key, m.callback)) + end +end +io.write "end\n" +io.close(file) diff --git a/scripts/update-help.sh b/scripts/update-help.sh index 46ac7c68937..8b284049192 100755 --- a/scripts/update-help.sh +++ b/scripts/update-help.sh @@ -31,3 +31,10 @@ sed -i -e "/${begin}/,/${end}/{ /${begin}/{p; r /tmp/DEFAULT_MAPPINGS.lua }; /${end}/p; d }" doc/nvim-tree-lua.txt sed -i -e "/^DEFAULT MAPPINGS/,/^>$/{ /^DEFAULT MAPPINGS/{p; r /tmp/DEFAULT_MAPPINGS.help }; /^>$/p; d }" doc/nvim-tree-lua.txt + +# generate various DEFAULT_KEYMAPS +begin="BEGIN_DEFAULT_KEYMAPS" +end="END_DEFAULT_KEYMAPS" +sed -n -e "/${begin}/,/${end}/{ /${begin}/d; /${end}/d; s/callback = \(.*\),/callback = '\1',/g; p; }" lua/nvim-tree/keymap.lua > /tmp/DEFAULT_KEYMAPS.M.lua +cat /tmp/DEFAULT_KEYMAPS.M.lua scripts/generate_default_keymaps.lua | lua + From 2320d173e0baa4235b20468c088f9e8a6c1b47c5 Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Tue, 2 Aug 2022 12:09:01 +1000 Subject: [PATCH 04/42] chore(mappings): add desc to all mappings, show in help, reformat help --- lua/nvim-tree/actions/init.lua | 5 +- lua/nvim-tree/keymap.lua | 74 +++++++++-------- lua/nvim-tree/renderer/help.lua | 141 +++++++++++++++++--------------- 3 files changed, 118 insertions(+), 102 deletions(-) diff --git a/lua/nvim-tree/actions/init.lua b/lua/nvim-tree/actions/init.lua index 65e28fefd65..ed542fa0662 100644 --- a/lua/nvim-tree/actions/init.lua +++ b/lua/nvim-tree/actions/init.lua @@ -248,8 +248,9 @@ local M = { local function set_map_for(bufnr) local opts = { noremap = true, silent = true, nowait = true, buffer = bufnr } - return function(mode, rhs) + return function(mode, rhs, desc) return function(lhs) + opts.desc = desc vim.keymap.set(mode or "n", lhs, rhs, opts) end end @@ -266,7 +267,7 @@ function M.apply_mappings(bufnr) for _, b in pairs(M.mappings) do local rhs = b.cb or run_dispatch(b.action) if rhs then - local setter = setter_for(b.mode, rhs) + local setter = setter_for(b.mode, rhs, b.action) local keys = type(b.key) == "table" and b.key or { b.key } for _, key in pairs(keys) do diff --git a/lua/nvim-tree/keymap.lua b/lua/nvim-tree/keymap.lua index b54bb31d331..bf3b051c502 100644 --- a/lua/nvim-tree/keymap.lua +++ b/lua/nvim-tree/keymap.lua @@ -8,7 +8,7 @@ local DEFAULT_KEYMAPS = { key = { "", "o", "<2-LeftMouse>" }, callback = Api.node.open.edit, desc = { - long = "open a file or folder; root will cd to the above directory", + long = "Open a file or directory; root will cd to the above directory.", short = "Open", }, }, @@ -16,7 +16,7 @@ local DEFAULT_KEYMAPS = { key = "", callback = Api.node.open.replace_tree_buffer, desc = { - long = "edit the file in place, effectively replacing the tree explorer", + long = "Open file in place, effectively replacing the tree explorer.", short = "Open: In Place", }, }, @@ -24,7 +24,7 @@ local DEFAULT_KEYMAPS = { key = "O", callback = Api.node.open.no_window_picker, desc = { - long = "same as (edit) with no window picker", + long = "Open file with no window picker.", short = "Open: No Window Picker", }, }, @@ -32,15 +32,16 @@ local DEFAULT_KEYMAPS = { key = { "", "<2-RightMouse>" }, callback = Api.tree.change_root_to_node, desc = { - long = "cd in the directory under the cursor", - short = "cd", + long = "cd in the directory under the cursor.", + short = "CD", }, }, { - key = "", + -- key = "", + key = "", callback = Api.node.open.vertical, desc = { - long = "open the file in a vertical split", + long = "Open file in a vertical split.", short = "Open: Vertical Split", }, }, @@ -48,7 +49,7 @@ local DEFAULT_KEYMAPS = { key = "", callback = Api.node.open.horizontal, desc = { - long = "open the file in a horizontal split", + long = "Open file in a horizontal split.", short = "Open: Horizontal Split", }, }, @@ -56,7 +57,7 @@ local DEFAULT_KEYMAPS = { key = "", callback = Api.node.open.tab, desc = { - long = "open the file in a new tab", + long = "Open file in a new tab.", short = "Open: New Tab", }, }, @@ -64,7 +65,7 @@ local DEFAULT_KEYMAPS = { key = "<", callback = Api.node.navigate.sibling.prev, desc = { - long = "navigate to the previous sibling of current file/directory", + long = "Navigate to the previous sibling.", short = "Previous Sibling", }, }, @@ -72,7 +73,7 @@ local DEFAULT_KEYMAPS = { key = ">", callback = Api.node.navigate.sibling.next, desc = { - long = "navigate to the next sibling of current file/directory", + long = "Navigate to the next sibling", short = "Next Sibling", }, }, @@ -80,7 +81,7 @@ local DEFAULT_KEYMAPS = { key = "P", callback = Api.node.navigate.parent, desc = { - long = "move cursor to the parent directory", + long = "Move cursor to the parent directory.", short = "Parent Directory", }, }, @@ -88,15 +89,15 @@ local DEFAULT_KEYMAPS = { key = "", callback = Api.node.navigate.parent_close, desc = { - long = "close current opened directory or parent", - short = "Close Folder", + long = "Close current opened directory or parent.", + short = "Close Directory", }, }, { key = "", callback = Api.node.open.preview, desc = { - long = "open the file as a preview (keeps the cursor in the tree)", + long = "Open file as a preview (keeps the cursor in the tree).", short = "Open Preview", }, }, @@ -104,7 +105,7 @@ local DEFAULT_KEYMAPS = { key = "K", callback = Api.node.navigate.sibling.first, desc = { - long = "navigate to the first sibling of current file/directory", + long = "Navigate to the first sibling.", short = "First Sibling", }, }, @@ -112,7 +113,7 @@ local DEFAULT_KEYMAPS = { key = "J", callback = Api.node.navigate.sibling.last, desc = { - long = "navigate to the last sibling of current file/directory", + long = "Navigate to the last sibling.", short = "Last Sibling", }, }, @@ -120,7 +121,7 @@ local DEFAULT_KEYMAPS = { key = "I", callback = Api.tree.toggle_gitignore_filter, desc = { - long = "toggle visibility of files/folders hidden via |git.ignore| option", + long = "Toggle visibility of files/directories hidden via |git.ignore| option.", short = "Toggle Git Ignore", }, }, @@ -128,7 +129,7 @@ local DEFAULT_KEYMAPS = { key = "H", callback = Api.tree.toggle_hidden_filter, desc = { - long = "toggle visibility of dotfiles via |filters.dotfiles| option", + long = "Toggle visibility of dotfiles via |filters.dotfiles| option.", short = "Toggle Dotfiles", }, }, @@ -136,7 +137,7 @@ local DEFAULT_KEYMAPS = { key = "U", callback = Api.tree.toggle_custom_filter, desc = { - long = "toggle visibility of files/folders hidden via |filters.custom| option", + long = "Toggle visibility of files/directories hidden via |filters.custom| option.", short = "Toggle Hidden", }, }, @@ -144,7 +145,7 @@ local DEFAULT_KEYMAPS = { key = "R", callback = Api.tree.reload, desc = { - long = "refresh the tree", + long = "Refresh the tree.", short = "Refresh", }, }, @@ -152,7 +153,7 @@ local DEFAULT_KEYMAPS = { key = "a", callback = Api.fs.create, desc = { - long = "add a file; leaving a trailing `/` will add a directory", + long = "Create a file; leaving a trailing `/` will add a directory.", short = "Create", }, }, @@ -160,7 +161,7 @@ local DEFAULT_KEYMAPS = { key = "d", callback = Api.fs.remove, desc = { - long = "delete a file (will prompt for confirmation)", + long = "Delete a file, prompting for confirmation.", short = "Delete", }, }, @@ -168,7 +169,7 @@ local DEFAULT_KEYMAPS = { key = "D", callback = Api.fs.trash, desc = { - long = "trash a file via |trash| option", + long = "Trash a file via |trash| option.", short = "Trash", }, }, @@ -176,7 +177,7 @@ local DEFAULT_KEYMAPS = { key = "r", callback = Api.fs.rename, desc = { - long = "rename a file", + long = "Rename a file or directory.", short = "Rename", }, }, @@ -280,7 +281,7 @@ local DEFAULT_KEYMAPS = { key = "s", callback = Api.node.run.system, desc = { - long = "open a file with default system application or a folder with default file manager, using |system_open| option", + long = "Open a file with default system application or a directory with default file manager, using |system_open| option.", short = "Run System", }, }, @@ -288,7 +289,7 @@ local DEFAULT_KEYMAPS = { key = "f", callback = Api.live_filter.start, desc = { - long = "live filter nodes dynamically based on regex matching.", + long = "Live filter nodes dynamically based on regex matching.", short = "Filter", }, }, @@ -296,7 +297,7 @@ local DEFAULT_KEYMAPS = { key = "F", callback = Api.live_filter.clear, desc = { - long = "clear live filter", + long = "Clear live filter.", short = "Clean Filter", }, }, @@ -304,7 +305,7 @@ local DEFAULT_KEYMAPS = { key = "q", callback = Api.tree.close, desc = { - long = "close tree window", + long = "Close tree window.", short = "Close", }, }, @@ -312,7 +313,7 @@ local DEFAULT_KEYMAPS = { key = "W", callback = Api.tree.collapse_all, desc = { - long = "collapse the whole tree", + long = "Collapse the whole tree.", short = "Collapse", }, }, @@ -320,7 +321,7 @@ local DEFAULT_KEYMAPS = { key = "E", callback = Api.tree.expand_all, desc = { - long = "expand the whole tree, stopping after expanding |callbacks.expand_all.max_folder_discovery| folders; this might hang neovim for a while if running on a big folder", + long = "Expand the whole tree, stopping after expanding |callbacks.expand_all.max_folder_discovery| directories; this might hang neovim for a while if running on a big directory.", short = "Expand All", }, }, @@ -328,7 +329,7 @@ local DEFAULT_KEYMAPS = { key = "S", callback = Api.tree.search_node, desc = { - long = "prompt the user to enter a path and then expands the tree to match the path", + long = "Prompt the user to enter a path and then expands the tree to match the path.", short = "Search", }, }, @@ -336,7 +337,7 @@ local DEFAULT_KEYMAPS = { key = ".", callback = Api.node.run.cmd, desc = { - long = "enter vim command mode with the file the cursor is on", + long = "Enter vim command mode with the file the cursor is on.", short = "Run Command", }, }, @@ -344,7 +345,7 @@ local DEFAULT_KEYMAPS = { key = "", callback = Api.node.show_info_popup, desc = { - long = "toggle a popup with file infos about the file under the cursor", + long = "Toggle a popup with file info about the file under the cursor.", short = "Info", }, }, @@ -352,7 +353,7 @@ local DEFAULT_KEYMAPS = { key = "g?", callback = Api.tree.toggle_help, desc = { - long = "toggle help", + long = "Toggle help.", short = "Help", }, }, @@ -360,7 +361,7 @@ local DEFAULT_KEYMAPS = { key = "m", callback = Api.marks.toggle, desc = { - long = "Toggle node in bookmarks", + long = "Toggle node in bookmarks.", short = "Toggle Bookmark", }, }, @@ -380,6 +381,7 @@ function M.set_keymaps(bufnr) for _, km in ipairs(M.keymaps) do local keys = type(km.key) == "table" and km.key or { km.key } for _, key in ipairs(keys) do + opts.desc = km.desc.short vim.keymap.set("n", key, km.callback, opts) end end diff --git a/lua/nvim-tree/renderer/help.lua b/lua/nvim-tree/renderer/help.lua index 210704a7a19..0289b814386 100644 --- a/lua/nvim-tree/renderer/help.lua +++ b/lua/nvim-tree/renderer/help.lua @@ -1,83 +1,96 @@ -local log = require "nvim-tree.log" - local M = {} +local function tidy_lhs(lhs) + -- nvim_buf_get_keymap replaces leading "<" with "" e.g. "CTRL-v>" + lhs = lhs:gsub("^", "<") + + -- shorten ctrls + if lhs:lower():match "^$", "LM>") + :gsub("RightMouse>$", "RM>") + :gsub("MiddleMouse>$", "MM>") + :gsub("ScrollWheelDown>$", "SD>") + :gsub("ScrollWheelUp>$", "SU>") + :gsub("ScrollWheelLeft>$", "SL>") + :gsub("ScrollWheelRight>$", "SR>") +end + +-- sort lhs roughly as per :help index +local PAT_MOUSE = "^<.*Mouse" +local PAT_CTRL = "^" }) - end - end + local buf_keymaps = vim.api.nvim_buf_get_keymap(vim.api.nvim_get_current_buf(), "") - -- local mappings = vim.tbl_filter(function(v) - -- return (v.cb ~= nil and v.cb ~= "") or (v.action ~= nil and v.action ~= "") - -- end, require("nvim-tree.actions").mappings) - -- local processed = {} - -- for _, b in pairs(mappings) do - -- local cb = b.cb - -- local key = b.key - -- local name - -- if cb and cb:sub(1, 35) == require("nvim-tree.config").nvim_tree_callback("test"):sub(1, 35) then - -- name = cb:match "'[^']+'[^']*$" - -- name = name:match "'[^']+'" - -- elseif b.action then - -- name = b.action - -- else - -- name = (b.name ~= nil) and b.name or cb - -- name = '"' .. name .. '"' - -- end - -- table.insert(processed, { key, name, true }) - -- end + local processed = vim.tbl_map(function(bkm) + return { lhs = tidy_lhs(bkm.lhs), desc = bkm.desc } + end, buf_keymaps) table.sort(processed, function(a, b) - return (a[3] == b[3] and (a[2] < b[2] or (a[2] == b[2] and #a[1] < #b[1]))) or (a[3] and not b[3]) + return sort_lhs(a.lhs, b.lhs) end) + for _, p in pairs(processed) do + p.lhs = shorten_lhs(p.lhs) + end + local num = 0 - for _, val in pairs(processed) do - local keys = type(val[1]) == "string" and { val[1] } or val[1] - local map_name = val[2] - local builtin = val[3] - for _, key in pairs(keys) do - num = num + 1 - local bind_string = string.format("%6s : %s", key, map_name) - table.insert(help_lines, bind_string) - - local hl_len = math.max(6, string.len(key)) + 2 - table.insert(help_hl, { "NvimTreeFolderName", num, 0, hl_len }) - - if not builtin then - table.insert(help_hl, { "NvimTreeFileRenamed", num, hl_len, -1 }) - end - end + for _, p in pairs(processed) do + num = num + 1 + local bind_string = string.format("%-6.6s %s", shorten_lhs(p.lhs), p.desc) + table.insert(help_lines, bind_string) + + table.insert(help_hl, { "NvimTreeFolderName", num, 0, 6 }) + + table.insert(help_hl, { "NvimTreeFileRenamed", num, 6, -1 }) end return help_lines, help_hl end From cd6d295414c0955410bcd1a6fd4214ec180ab1df Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Tue, 2 Aug 2022 12:35:11 +1000 Subject: [PATCH 05/42] chore(mappings): add desc to all mappings --- lua/nvim-tree/keymap.lua | 30 ++++++++++++++-------------- lua/nvim-tree/renderer/help.lua | 8 ++++---- scripts/generate_default_keymaps.lua | 25 +++++++++++++++-------- 3 files changed, 36 insertions(+), 27 deletions(-) diff --git a/lua/nvim-tree/keymap.lua b/lua/nvim-tree/keymap.lua index bf3b051c502..b6203a61a64 100644 --- a/lua/nvim-tree/keymap.lua +++ b/lua/nvim-tree/keymap.lua @@ -185,15 +185,15 @@ local DEFAULT_KEYMAPS = { key = "", callback = Api.fs.rename_sub, desc = { - long = "rename a file and omit the filename on input", - short = "Rename - Omit Filename", + long = "Rename a file or directory and omit the filename on input.", + short = "Rename: Omit Filename", }, }, { key = "x", callback = Api.fs.cut, desc = { - long = "add/remove file/directory to cut clipboard", + long = "Cut file or directory to cut clipboard.", short = "Cut", }, }, @@ -201,7 +201,7 @@ local DEFAULT_KEYMAPS = { key = "c", callback = Api.fs.copy.node, desc = { - long = "add/remove file/directory to copy clipboard", + long = "Copy file or directory to copy clipboard.", short = "Copy", }, }, @@ -209,7 +209,7 @@ local DEFAULT_KEYMAPS = { key = "p", callback = Api.fs.paste, desc = { - long = "paste from clipboard; cut clipboard has precedence over copy; will prompt for confirmation", + long = "Paste from clipboard; cut clipboard has precedence over copy; will prompt for confirmation.", short = "Paste", }, }, @@ -217,15 +217,15 @@ local DEFAULT_KEYMAPS = { key = "y", callback = Api.fs.copy.filename, desc = { - long = "copy name to system clipboard", - short = "Copy File Name", + long = "Copy name to system clipboard.", + short = "Copy Name", }, }, { key = "Y", callback = Api.fs.copy.relative_path, desc = { - long = "copy relative path to system clipboard", + long = "Copy relative path to system clipboard.", short = "Copy Relative Path", }, }, @@ -233,7 +233,7 @@ local DEFAULT_KEYMAPS = { key = "gy", callback = Api.fs.copy.absolute_path, desc = { - long = "copy absolute path to system clipboard", + long = "Copy absolute path to system clipboard.", short = "Copy Absolute Path", }, }, @@ -241,7 +241,7 @@ local DEFAULT_KEYMAPS = { key = "[e", callback = Api.node.navigate.diagnostics.next, desc = { - long = "go to next diagnostic item", + long = "Go to next diagnostic item.", short = "Next Diagnostic", }, }, @@ -249,7 +249,7 @@ local DEFAULT_KEYMAPS = { key = "[c", callback = Api.node.navigate.git.next, desc = { - long = "go to next git item", + long = "Go to next git item.", short = "Next Git", }, }, @@ -257,7 +257,7 @@ local DEFAULT_KEYMAPS = { key = "]e", callback = Api.node.navigate.diagnostics.prev, desc = { - long = "go to prev diagnostic item", + long = "Go to prev diagnostic item.", short = "Prev Diagnostic", }, }, @@ -265,7 +265,7 @@ local DEFAULT_KEYMAPS = { key = "]c", callback = Api.node.navigate.git.prev, desc = { - long = "go to prev git item", + long = "Go to prev git item.", short = "Prev Git", }, }, @@ -273,7 +273,7 @@ local DEFAULT_KEYMAPS = { key = "-", callback = Api.tree.change_root_to_parent, desc = { - long = "navigate up to the parent directory of the current file/directory", + long = "Navigate up to the parent directory of the current file/directory.", short = "Up", }, }, @@ -369,7 +369,7 @@ local DEFAULT_KEYMAPS = { key = "bmv", callback = Api.marks.bulk.move, desc = { - long = "Move all bookmarked nodes into specified location", + long = "Move all bookmarked nodes into specified location.", short = "Move Bookmarked", }, }, diff --git a/lua/nvim-tree/renderer/help.lua b/lua/nvim-tree/renderer/help.lua index 0289b814386..13b73bdce31 100644 --- a/lua/nvim-tree/renderer/help.lua +++ b/lua/nvim-tree/renderer/help.lua @@ -70,20 +70,20 @@ function M.compute_lines() local buf_keymaps = vim.api.nvim_buf_get_keymap(vim.api.nvim_get_current_buf(), "") - local processed = vim.tbl_map(function(bkm) + local lines = vim.tbl_map(function(bkm) return { lhs = tidy_lhs(bkm.lhs), desc = bkm.desc } end, buf_keymaps) - table.sort(processed, function(a, b) + table.sort(lines, function(a, b) return sort_lhs(a.lhs, b.lhs) end) - for _, p in pairs(processed) do + for _, p in pairs(lines) do p.lhs = shorten_lhs(p.lhs) end local num = 0 - for _, p in pairs(processed) do + for _, p in pairs(lines) do num = num + 1 local bind_string = string.format("%-6.6s %s", shorten_lhs(p.lhs), p.desc) table.insert(help_lines, bind_string) diff --git a/scripts/generate_default_keymaps.lua b/scripts/generate_default_keymaps.lua index daa46a7c17c..fd0d46bcbe0 100644 --- a/scripts/generate_default_keymaps.lua +++ b/scripts/generate_default_keymaps.lua @@ -3,8 +3,9 @@ -- write DEFAULT_KEYMAPS in various formats -local max_key_help = 0 -local max_short_help = 0 +local max_key = 0 +local max_short = 0 +local max_callback = 0 local outs_help = {} for _, m in pairs(DEFAULT_KEYMAPS) do @@ -13,22 +14,23 @@ for _, m in pairs(DEFAULT_KEYMAPS) do for _, key in ipairs(keys) do local out = {} out.key = key - max_key_help = math.max(#out.key, max_key_help) + max_key = math.max(#out.key, max_key) if first then out.short = m.desc.short - max_short_help = math.max(#out.short, max_short_help) + max_short = math.max(#out.short, max_short) out.long = m.desc.long first = false end table.insert(outs_help, out) end + max_callback = math.max(#m.callback, max_callback) end -- help local file = io.open("/tmp/DEFAULT_KEYMAPS.help", "w") io.output(file) io.write "\n" -local fmt = string.format("%%-%d.%ds %%-%d.%ds %%s\n", max_key_help, max_key_help, max_short_help, max_short_help) +local fmt = string.format("%%-%d.%ds %%-%d.%ds %%s\n", max_key, max_key, max_short, max_short) for _, m in pairs(outs_help) do if not m.short then io.write(string.format("%s\n", m.key)) @@ -42,12 +44,19 @@ io.close(file) -- lua on_attach file = io.open("/tmp/DEFAULT_KEYMAPS.on_attach.lua", "w") io.output(file) -io.write "local function on_attach(bufnr, mode, opts)\n" -io.write "local Api = require('nvim-tree.api')\n" +io.write "local Api = require('nvim-tree.api')\n\n" +io.write "local function on_attach(bufnr)\n" +fmt = string.format( + " vim.keymap.set('n', %%-%d.%ds %%-%d.%ds { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = '%%s', })\n", + max_key + 3, + max_key + 3, + max_callback + 1, + max_callback + 1 +) for _, m in pairs(DEFAULT_KEYMAPS) do local keys = type(m.key) == "table" and m.key or { m.key } for _, key in ipairs(keys) do - io.write(string.format(" vim.keymap.set(mode, '%s', %s, opts)\n", key, m.callback)) + io.write(string.format(fmt, "'" .. key .. "',", m.callback .. ",", m.desc.short)) end end io.write "end\n" From 5fac9a1bc992bed6e25af7abb4222b373c7f243a Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Sat, 6 Aug 2022 16:14:08 +1000 Subject: [PATCH 06/42] chore(mappings): add desc to all mappings --- lua/nvim-tree/renderer/help.lua | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/lua/nvim-tree/renderer/help.lua b/lua/nvim-tree/renderer/help.lua index 13b73bdce31..3dddd468b12 100644 --- a/lua/nvim-tree/renderer/help.lua +++ b/lua/nvim-tree/renderer/help.lua @@ -10,22 +10,14 @@ local function tidy_lhs(lhs) end -- uppercase ctrls - if lhs:match "^") -local function shorten_lhs(lhs) return lhs - :gsub("LeftMouse>$", "LM>") - :gsub("RightMouse>$", "RM>") - :gsub("MiddleMouse>$", "MM>") - :gsub("ScrollWheelDown>$", "SD>") - :gsub("ScrollWheelUp>$", "SU>") - :gsub("ScrollWheelLeft>$", "SL>") - :gsub("ScrollWheelRight>$", "SR>") end -- sort lhs roughly as per :help index @@ -78,19 +70,16 @@ function M.compute_lines() return sort_lhs(a.lhs, b.lhs) end) - for _, p in pairs(lines) do - p.lhs = shorten_lhs(p.lhs) - end - local num = 0 for _, p in pairs(lines) do num = num + 1 - local bind_string = string.format("%-6.6s %s", shorten_lhs(p.lhs), p.desc) + local bind_string = string.format("%-5s %s", p.lhs, p.desc) + local hl_len = math.max(5, string.len(p.lhs)) table.insert(help_lines, bind_string) - table.insert(help_hl, { "NvimTreeFolderName", num, 0, 6 }) + table.insert(help_hl, { "NvimTreeFolderName", num, 0, hl_len }) - table.insert(help_hl, { "NvimTreeFileRenamed", num, 6, -1 }) + table.insert(help_hl, { "NvimTreeFileRenamed", num, hl_len, -1 }) end return help_lines, help_hl end From 420c90943cd405197de6dbf4f13cc53977e09812 Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Sun, 4 Sep 2022 14:07:04 +1000 Subject: [PATCH 07/42] chore(mappings): escape help keys --- scripts/generate_default_keymaps.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/generate_default_keymaps.lua b/scripts/generate_default_keymaps.lua index fd0d46bcbe0..23ed0398374 100644 --- a/scripts/generate_default_keymaps.lua +++ b/scripts/generate_default_keymaps.lua @@ -13,7 +13,7 @@ for _, m in pairs(DEFAULT_KEYMAPS) do local keys = type(m.key) == "table" and m.key or { m.key } for _, key in ipairs(keys) do local out = {} - out.key = key + out.key = string.format("`%s`", key) max_key = math.max(#out.key, max_key) if first then out.short = m.desc.short From 3eb5e4c942b5d0afaca86446f77a4b6638b0050e Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Sun, 4 Sep 2022 15:56:36 +1000 Subject: [PATCH 08/42] chore(mappings): migrate legacy mappings under the hood: map keymap to legacy mappings --- lua/nvim-tree/keymap.lua | 46 ++++++++++++++++++++++++++ lua/nvim-tree/legacy.lua | 71 ++++++++++------------------------------ lua/nvim-tree/utils.lua | 4 ++- 3 files changed, 67 insertions(+), 54 deletions(-) diff --git a/lua/nvim-tree/keymap.lua b/lua/nvim-tree/keymap.lua index e863de32951..e72aaf0dc3a 100644 --- a/lua/nvim-tree/keymap.lua +++ b/lua/nvim-tree/keymap.lua @@ -11,6 +11,7 @@ local DEFAULT_KEYMAPS = { long = "Open a file or directory; root will cd to the above directory.", short = "Open", }, + legacy_action = "edit", }, { key = "", @@ -19,6 +20,7 @@ local DEFAULT_KEYMAPS = { long = "Open file in place, effectively replacing the tree explorer.", short = "Open: In Place", }, + legacy_action = "edit_in_place", }, { key = "O", @@ -27,6 +29,7 @@ local DEFAULT_KEYMAPS = { long = "Open file with no window picker.", short = "Open: No Window Picker", }, + legacy_action = "edit_no_picker", }, { key = { "", "<2-RightMouse>" }, @@ -35,6 +38,7 @@ local DEFAULT_KEYMAPS = { long = "cd in the directory under the cursor.", short = "CD", }, + legacy_action = "cd", }, { -- key = "", @@ -44,6 +48,7 @@ local DEFAULT_KEYMAPS = { long = "Open file in a vertical split.", short = "Open: Vertical Split", }, + legacy_action = "vsplit", }, { key = "", @@ -52,6 +57,7 @@ local DEFAULT_KEYMAPS = { long = "Open file in a horizontal split.", short = "Open: Horizontal Split", }, + legacy_action = "split", }, { key = "", @@ -60,6 +66,7 @@ local DEFAULT_KEYMAPS = { long = "Open file in a new tab.", short = "Open: New Tab", }, + legacy_action = "tabnew", }, { key = "<", @@ -68,6 +75,7 @@ local DEFAULT_KEYMAPS = { long = "Navigate to the previous sibling.", short = "Previous Sibling", }, + legacy_action = "prev_sibling", }, { key = ">", @@ -76,6 +84,7 @@ local DEFAULT_KEYMAPS = { long = "Navigate to the next sibling", short = "Next Sibling", }, + legacy_action = "next_sibling", }, { key = "P", @@ -84,6 +93,7 @@ local DEFAULT_KEYMAPS = { long = "Move cursor to the parent directory.", short = "Parent Directory", }, + legacy_action = "parent_node", }, { key = "", @@ -92,6 +102,7 @@ local DEFAULT_KEYMAPS = { long = "Close current opened directory or parent.", short = "Close Directory", }, + legacy_action = "close_node", }, { key = "", @@ -100,6 +111,7 @@ local DEFAULT_KEYMAPS = { long = "Open file as a preview (keeps the cursor in the tree).", short = "Open Preview", }, + legacy_action = "preview", }, { key = "K", @@ -108,6 +120,7 @@ local DEFAULT_KEYMAPS = { long = "Navigate to the first sibling.", short = "First Sibling", }, + legacy_action = "first_sibling", }, { key = "J", @@ -116,6 +129,7 @@ local DEFAULT_KEYMAPS = { long = "Navigate to the last sibling.", short = "Last Sibling", }, + legacy_action = "last_sibling", }, { key = "I", @@ -124,6 +138,7 @@ local DEFAULT_KEYMAPS = { long = "Toggle visibility of files/directories hidden via |git.ignore| option.", short = "Toggle Git Ignore", }, + legacy_action = "toggle_git_ignored", }, { key = "H", @@ -132,6 +147,7 @@ local DEFAULT_KEYMAPS = { long = "Toggle visibility of dotfiles via |filters.dotfiles| option.", short = "Toggle Dotfiles", }, + legacy_action = "toggle_dotfiles", }, { key = "U", @@ -140,6 +156,7 @@ local DEFAULT_KEYMAPS = { long = "Toggle visibility of files/directories hidden via |filters.custom| option.", short = "Toggle Hidden", }, + legacy_action = "toggle_custom", }, { key = "R", @@ -148,6 +165,7 @@ local DEFAULT_KEYMAPS = { long = "Refresh the tree.", short = "Refresh", }, + legacy_action = "refresh", }, { key = "a", @@ -156,6 +174,7 @@ local DEFAULT_KEYMAPS = { long = "Create a file; leaving a trailing `/` will add a directory.", short = "Create", }, + legacy_action = "create", }, { key = "d", @@ -164,6 +183,7 @@ local DEFAULT_KEYMAPS = { long = "Delete a file, prompting for confirmation.", short = "Delete", }, + legacy_action = "remove", }, { key = "D", @@ -172,6 +192,7 @@ local DEFAULT_KEYMAPS = { long = "Trash a file via |trash| option.", short = "Trash", }, + legacy_action = "trash", }, { key = "r", @@ -180,6 +201,7 @@ local DEFAULT_KEYMAPS = { long = "Rename a file or directory.", short = "Rename", }, + legacy_action = "rename", }, { key = "", @@ -188,6 +210,7 @@ local DEFAULT_KEYMAPS = { long = "Rename a file or directory and omit the filename on input.", short = "Rename: Omit Filename", }, + legacy_action = "full_rename", }, { key = "x", @@ -196,6 +219,7 @@ local DEFAULT_KEYMAPS = { long = "Cut file or directory to cut clipboard.", short = "Cut", }, + legacy_action = "cut", }, { key = "c", @@ -204,6 +228,7 @@ local DEFAULT_KEYMAPS = { long = "Copy file or directory to copy clipboard.", short = "Copy", }, + legacy_action = "copy", }, { key = "p", @@ -212,6 +237,7 @@ local DEFAULT_KEYMAPS = { long = "Paste from clipboard; cut clipboard has precedence over copy; will prompt for confirmation.", short = "Paste", }, + legacy_action = "paste", }, { key = "y", @@ -220,6 +246,7 @@ local DEFAULT_KEYMAPS = { long = "Copy name to system clipboard.", short = "Copy Name", }, + legacy_action = "copy_name", }, { key = "Y", @@ -228,6 +255,7 @@ local DEFAULT_KEYMAPS = { long = "Copy relative path to system clipboard.", short = "Copy Relative Path", }, + legacy_action = "copy_path", }, { key = "gy", @@ -236,6 +264,7 @@ local DEFAULT_KEYMAPS = { long = "Copy absolute path to system clipboard.", short = "Copy Absolute Path", }, + legacy_action = "copy_absolute_path", }, { key = "]e", @@ -244,6 +273,7 @@ local DEFAULT_KEYMAPS = { long = "Go to next diagnostic item.", short = "Next Diagnostic", }, + legacy_action = "next_diag_item", }, { key = "]c", @@ -252,6 +282,7 @@ local DEFAULT_KEYMAPS = { long = "Go to next git item.", short = "Next Git", }, + legacy_action = "next_git_item", }, { key = "[e", @@ -260,6 +291,7 @@ local DEFAULT_KEYMAPS = { long = "Go to prev diagnostic item.", short = "Prev Diagnostic", }, + legacy_action = "prev_diag_item", }, { key = "[c", @@ -268,6 +300,7 @@ local DEFAULT_KEYMAPS = { long = "Go to prev git item.", short = "Prev Git", }, + legacy_action = "prev_git_item", }, { key = "-", @@ -276,6 +309,7 @@ local DEFAULT_KEYMAPS = { long = "Navigate up to the parent directory of the current file/directory.", short = "Up", }, + legacy_action = "dir_up", }, { key = "s", @@ -284,6 +318,7 @@ local DEFAULT_KEYMAPS = { long = "Open a file with default system application or a directory with default file manager, using |system_open| option.", short = "Run System", }, + legacy_action = "system_open", }, { key = "f", @@ -292,6 +327,7 @@ local DEFAULT_KEYMAPS = { long = "Live filter nodes dynamically based on regex matching.", short = "Filter", }, + legacy_action = "live_filter", }, { key = "F", @@ -300,6 +336,7 @@ local DEFAULT_KEYMAPS = { long = "Clear live filter.", short = "Clean Filter", }, + legacy_action = "clear_live_filter", }, { key = "q", @@ -308,6 +345,7 @@ local DEFAULT_KEYMAPS = { long = "Close tree window.", short = "Close", }, + legacy_action = "close", }, { key = "W", @@ -316,6 +354,7 @@ local DEFAULT_KEYMAPS = { long = "Collapse the whole tree.", short = "Collapse", }, + legacy_action = "collapse_all", }, { key = "E", @@ -324,6 +363,7 @@ local DEFAULT_KEYMAPS = { long = "Expand the whole tree, stopping after expanding |callbacks.expand_all.max_folder_discovery| directories; this might hang neovim for a while if running on a big directory.", short = "Expand All", }, + legacy_action = "expand_all", }, { key = "S", @@ -332,6 +372,7 @@ local DEFAULT_KEYMAPS = { long = "Prompt the user to enter a path and then expands the tree to match the path.", short = "Search", }, + legacy_action = "search_node", }, { key = ".", @@ -340,6 +381,7 @@ local DEFAULT_KEYMAPS = { long = "Enter vim command mode with the file the cursor is on.", short = "Run Command", }, + legacy_action = "run_file_command", }, { key = "", @@ -348,6 +390,7 @@ local DEFAULT_KEYMAPS = { long = "Toggle a popup with file info about the file under the cursor.", short = "Info", }, + legacy_action = "toggle_file_info", }, { key = "g?", @@ -356,6 +399,7 @@ local DEFAULT_KEYMAPS = { long = "Toggle help.", short = "Help", }, + legacy_action = "toggle_help", }, { key = "m", @@ -364,6 +408,7 @@ local DEFAULT_KEYMAPS = { long = "Toggle node in bookmarks.", short = "Toggle Bookmark", }, + legacy_action = "toggle_mark", }, { key = "bmv", @@ -372,6 +417,7 @@ local DEFAULT_KEYMAPS = { long = "Move all bookmarked nodes into specified location.", short = "Move Bookmarked", }, + legacy_action = "bulk_move", }, } -- END_DEFAULT_KEYMAPS diff --git a/lua/nvim-tree/legacy.lua b/lua/nvim-tree/legacy.lua index 6c64579d1df..03fb2f39e36 100644 --- a/lua/nvim-tree/legacy.lua +++ b/lua/nvim-tree/legacy.lua @@ -1,5 +1,6 @@ local utils = require "nvim-tree.utils" -local Api = require "nvim-tree.api" + +local DEFAULT_KEYMAPS = require("nvim-tree.keymap").DEFAULT_KEYMAPS local M = {} @@ -298,55 +299,6 @@ local function removed(opts) end end -local OLD_MAPPING_TABLE = { - edit = Api.node.open.edit, - edit_in_place = Api.node.open.replace_tree_buffer, - edit_no_picker = Api.node.open.no_window_picker, - cd = Api.tree.change_root_to_node, - vsplit = Api.node.open.vertical, - split = Api.node.open.horizontal, - tabnew = Api.node.open.tab, - preview = Api.node.open.preview, - prev_sibling = Api.node.navigate.sibling.prev, - next_sibling = Api.node.navigate.sibling.next, - parent_node = Api.node.navigate.parent, - close_node = Api.node.navigate.parent_close, - first_sibling = Api.node.navigate.sibling.first, - last_sibling = Api.node.navigate.sibling.last, - toggle_git_ignored = Api.tree.toggle_gitignore_filter, - toggle_dotfiles = Api.tree.toggle_hidden_filter, - toggle_custom = Api.tree.toggle_custom_filter, - refresh = Api.tree.reload, - create = Api.fs.create, - remove = Api.fs.remove, - trash = Api.fs.trash, - rename = Api.fs.rename, - full_rename = Api.fs.rename_sub, - cut = Api.fs.cut, - copy = Api.fs.copy.node, - paste = Api.fs.paste, - copy_name = Api.fs.copy.filename, - copy_path = Api.fs.copy.relative_path, - copy_absolute_path = Api.fs.copy.absolute_path, - prev_git_item = Api.node.navigate.git.prev, - next_git_item = Api.node.navigate.git.next, - prev_diag_item = Api.node.navigate.diagnostics.prev, - next_diag_item = Api.node.navigate.diagnostics.next, - dir_up = Api.tree.change_root_to_parent, - system_open = Api.node.run.system, - live_filter = Api.live_filter.start, - clear_live_filter = Api.live_filter.clear, - close = Api.tree.close, - collapse_all = Api.tree.collapse_all, - expand_all = Api.tree.expand_all, - search_node = Api.tree.search_node, - run_file_command = Api.node.run.cmd, - toggle_file_info = Api.node.show_info_popup, - toggle_help = Api.tree.toggle_help, - toggle_mark = Api.marks.toggle, - bulk_move = Api.marks.bulk.move, -} - function M.move_mappings_to_keymap(opts) if opts.on_attach == "disable" and opts.view and opts.view.mappings then local custom_only, list = opts.view.mappings.custom_only, opts.view.mappings.list @@ -355,24 +307,35 @@ function M.move_mappings_to_keymap(opts) opts.view.mappings.custom_only = nil end if list then + local keymap_by_action = utils.key_by(DEFAULT_KEYMAPS, "legacy_action") if not custom_only then opts.remove_keymaps = {} end local call_list = {} opts.on_attach = function(bufnr) for _, el in pairs(call_list) do - vim.keymap.set(el.mode or "n", el.key, el.callback, { buffer = bufnr, remap = false, silent = true }) + if el.callback then + vim.keymap.set(el.mode or "n", el.key, el.callback, { buffer = bufnr, remap = false, silent = true }) + elseif el.keymap then + vim.keymap.set( + el.mode or "n", + el.key, + el.keymap.callback, + { buffer = bufnr, remap = false, silent = true, desc = el.keymap.desc.short } + ) + end end end for _, map in pairs(list) do local keys = type(map.key) == "table" and map.key or { map.key } local mode = map.mode or "n" local callback + local keymap if map.action ~= "" then if map.action_cb then callback = map.action_cb - else - callback = OLD_MAPPING_TABLE[map.action] + elseif keymap_by_action[map.action] then + keymap = keymap_by_action[map.action] end end @@ -383,6 +346,8 @@ function M.move_mappings_to_keymap(opts) if callback then table.insert(call_list, { mode = mode, key = k, callback = callback }) + elseif keymap then + table.insert(call_list, { mode = mode, key = k, keymap = keymap }) end end end diff --git a/lua/nvim-tree/utils.lua b/lua/nvim-tree/utils.lua index 37ff8ebe58d..5dfb032f3e2 100644 --- a/lua/nvim-tree/utils.lua +++ b/lua/nvim-tree/utils.lua @@ -342,7 +342,9 @@ end function M.key_by(tbl, key) local keyed = {} for _, val in ipairs(tbl) do - keyed[val[key]] = val + if val[key] then + keyed[val[key]] = val + end end return keyed end From f6f439ba59b051e16f17d56bf1271af67fb5b662 Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Sun, 4 Sep 2022 16:28:12 +1000 Subject: [PATCH 09/42] chore(mappings): migrate legacy mappings under the hood: remove dispatch --- lua/nvim-tree.lua | 3 - lua/nvim-tree/actions/dispatch.lua | 128 --------- lua/nvim-tree/actions/init.lua | 402 +---------------------------- lua/nvim-tree/view.lua | 2 - scripts/update-help.sh | 26 +- 5 files changed, 18 insertions(+), 543 deletions(-) delete mode 100644 lua/nvim-tree/actions/dispatch.lua diff --git a/lua/nvim-tree.lua b/lua/nvim-tree.lua index 54bbfe9e554..e4e011771a7 100644 --- a/lua/nvim-tree.lua +++ b/lua/nvim-tree.lua @@ -68,9 +68,6 @@ function M.change_root(filepath, bufnr) change_dir.fn(vim.fn.fnamemodify(filepath, ":p:h")) end ----@deprecated -M.on_keypress = require("nvim-tree.actions.dispatch").dispatch - function M.toggle(find_file, no_focus, cwd) if view.is_visible() then view.close() diff --git a/lua/nvim-tree/actions/dispatch.lua b/lua/nvim-tree/actions/dispatch.lua deleted file mode 100644 index 44eff9834b0..00000000000 --- a/lua/nvim-tree/actions/dispatch.lua +++ /dev/null @@ -1,128 +0,0 @@ -local view = require "nvim-tree.view" -local lib = require "nvim-tree.lib" - -local M = {} - -local Actions = { - close = view.close, - - -- Tree modifiers - collapse_all = require("nvim-tree.actions.tree-modifiers.collapse-all").fn, - expand_all = require("nvim-tree.actions.tree-modifiers.expand-all").fn, - toggle_dotfiles = require("nvim-tree.actions.tree-modifiers.toggles").dotfiles, - toggle_custom = require("nvim-tree.actions.tree-modifiers.toggles").custom, - toggle_git_ignored = require("nvim-tree.actions.tree-modifiers.toggles").git_ignored, - - -- Filesystem operations - copy_absolute_path = require("nvim-tree.actions.fs.copy-paste").copy_absolute_path, - copy_name = require("nvim-tree.actions.fs.copy-paste").copy_filename, - copy_path = require("nvim-tree.actions.fs.copy-paste").copy_path, - copy = require("nvim-tree.actions.fs.copy-paste").copy, - create = require("nvim-tree.actions.fs.create-file").fn, - cut = require("nvim-tree.actions.fs.copy-paste").cut, - full_rename = require("nvim-tree.actions.fs.rename-file").fn(true), - paste = require("nvim-tree.actions.fs.copy-paste").paste, - trash = require("nvim-tree.actions.fs.trash").fn, - remove = require("nvim-tree.actions.fs.remove-file").fn, - rename = require("nvim-tree.actions.fs.rename-file").fn(false), - - -- Movements in tree - close_node = require("nvim-tree.actions.moves.parent").fn(true), - first_sibling = require("nvim-tree.actions.moves.sibling").fn "first", - last_sibling = require("nvim-tree.actions.moves.sibling").fn "last", - next_diag_item = require("nvim-tree.actions.moves.item").fn("next", "diag"), - next_git_item = require("nvim-tree.actions.moves.item").fn("next", "git"), - next_sibling = require("nvim-tree.actions.moves.sibling").fn "next", - parent_node = require("nvim-tree.actions.moves.parent").fn(false), - prev_diag_item = require("nvim-tree.actions.moves.item").fn("prev", "diag"), - prev_git_item = require("nvim-tree.actions.moves.item").fn("prev", "git"), - prev_sibling = require("nvim-tree.actions.moves.sibling").fn "prev", - - -- Other types - refresh = require("nvim-tree.actions.reloaders.reloaders").reload_explorer, - dir_up = require("nvim-tree.actions.root.dir-up").fn, - search_node = require("nvim-tree.actions.finders.search-node").fn, - run_file_command = require("nvim-tree.actions.node.run-command").run_file_command, - toggle_file_info = require("nvim-tree.actions.node.file-popup").toggle_file_info, - system_open = require("nvim-tree.actions.node.system-open").fn, - toggle_mark = require("nvim-tree.marks").toggle_mark, - bulk_move = require("nvim-tree.marks.bulk-move").bulk_move, -} - -local function handle_action_on_help_ui(action) - if action == "close" or action == "toggle_help" then - require("nvim-tree.actions.tree-modifiers.toggles").help() - end -end - -local function handle_filter_actions(action) - if action == "live_filter" then - require("nvim-tree.live-filter").start_filtering() - elseif action == "clear_live_filter" then - require("nvim-tree.live-filter").clear_filter() - end -end - -local function change_dir_action(node) - if node.name == ".." then - require("nvim-tree.actions.root.change-dir").fn ".." - elseif node.nodes ~= nil then - require("nvim-tree.actions.root.change-dir").fn(lib.get_last_group_node(node).absolute_path) - end -end - -local function open_file(action, node) - local path = node.absolute_path - if node.link_to and not node.nodes then - path = node.link_to - end - require("nvim-tree.actions.node.open-file").fn(action, path) -end - -local function handle_tree_actions(action) - local node = lib.get_node_at_cursor() - if not node then - return - end - - local custom_function = M.custom_keypress_funcs[action] - local defined_action = Actions[action] - - if type(custom_function) == "function" then - return custom_function(node) - elseif defined_action then - return defined_action(node) - end - - local is_parent = node.name == ".." - - if action == "preview" and is_parent then - return - end - - if action == "cd" or is_parent then - return change_dir_action(node) - end - - if node.nodes then - lib.expand_or_collapse(node) - else - open_file(action, node) - end -end - -function M.dispatch(action) - if view.is_help_ui() or action == "toggle_help" then - handle_action_on_help_ui(action) - elseif action == "live_filter" or action == "clear_live_filter" then - handle_filter_actions(action) - else - handle_tree_actions(action) - end -end - -function M.setup(custom_keypress_funcs) - M.custom_keypress_funcs = custom_keypress_funcs -end - -return M diff --git a/lua/nvim-tree/actions/init.lua b/lua/nvim-tree/actions/init.lua index e69775a2601..edbd976377e 100644 --- a/lua/nvim-tree/actions/init.lua +++ b/lua/nvim-tree/actions/init.lua @@ -1,391 +1,6 @@ --- @deprecated: new implementation in nvim-tree.keymap. Please do not edit this file. - -local a = vim.api - local log = require "nvim-tree.log" -local view = require "nvim-tree.view" -local util = require "nvim-tree.utils" - --- BEGIN_DEFAULT_MAPPINGS -local DEFAULT_MAPPINGS = { - { - key = { "", "o", "<2-LeftMouse>" }, - action = "edit", - desc = "open a file or folder; root will cd to the above directory", - }, - { - key = "", - action = "edit_in_place", - desc = "edit the file in place, effectively replacing the tree explorer", - }, - { - key = "O", - action = "edit_no_picker", - desc = "same as (edit) with no window picker", - }, - { - key = { "", "<2-RightMouse>" }, - action = "cd", - desc = "cd in the directory under the cursor", - }, - { - key = "", - action = "vsplit", - desc = "open the file in a vertical split", - }, - { - key = "", - action = "split", - desc = "open the file in a horizontal split", - }, - { - key = "", - action = "tabnew", - desc = "open the file in a new tab", - }, - { - key = "<", - action = "prev_sibling", - desc = "navigate to the previous sibling of current file/directory", - }, - { - key = ">", - action = "next_sibling", - desc = "navigate to the next sibling of current file/directory", - }, - { - key = "P", - action = "parent_node", - desc = "move cursor to the parent directory", - }, - { - key = "", - action = "close_node", - desc = "close current opened directory or parent", - }, - { - key = "", - action = "preview", - desc = "open the file as a preview (keeps the cursor in the tree)", - }, - { - key = "K", - action = "first_sibling", - desc = "navigate to the first sibling of current file/directory", - }, - { - key = "J", - action = "last_sibling", - desc = "navigate to the last sibling of current file/directory", - }, - { - key = "I", - action = "toggle_git_ignored", - desc = "toggle visibility of files/folders hidden via |git.ignore| option", - }, - { - key = "H", - action = "toggle_dotfiles", - desc = "toggle visibility of dotfiles via |filters.dotfiles| option", - }, - { - key = "U", - action = "toggle_custom", - desc = "toggle visibility of files/folders hidden via |filters.custom| option", - }, - { - key = "R", - action = "refresh", - desc = "refresh the tree", - }, - { - key = "a", - action = "create", - desc = "add a file; leaving a trailing `/` will add a directory", - }, - { - key = "d", - action = "remove", - desc = "delete a file (will prompt for confirmation)", - }, - { - key = "D", - action = "trash", - desc = "trash a file via |trash| option", - }, - { - key = "r", - action = "rename", - desc = "rename a file", - }, - { - key = "", - action = "full_rename", - desc = "rename a file and omit the filename on input", - }, - { - key = "x", - action = "cut", - desc = "add/remove file/directory to cut clipboard", - }, - { - key = "c", - action = "copy", - desc = "add/remove file/directory to copy clipboard", - }, - { - key = "p", - action = "paste", - desc = "paste from clipboard; cut clipboard has precedence over copy; will prompt for confirmation", - }, - { - key = "y", - action = "copy_name", - desc = "copy name to system clipboard", - }, - { - key = "Y", - action = "copy_path", - desc = "copy relative path to system clipboard", - }, - { - key = "gy", - action = "copy_absolute_path", - desc = "copy absolute path to system clipboard", - }, - { - key = "[e", - action = "prev_diag_item", - desc = "go to next diagnostic item", - }, - { - key = "[c", - action = "prev_git_item", - desc = "go to next git item", - }, - { - key = "]e", - action = "next_diag_item", - desc = "go to prev diagnostic item", - }, - { - key = "]c", - action = "next_git_item", - desc = "go to prev git item", - }, - { - key = "-", - action = "dir_up", - desc = "navigate up to the parent directory of the current file/directory", - }, - { - key = "s", - action = "system_open", - desc = "open a file with default system application or a folder with default file manager, using |system_open| option", - }, - { - key = "f", - action = "live_filter", - desc = "live filter nodes dynamically based on regex matching.", - }, - { - key = "F", - action = "clear_live_filter", - desc = "clear live filter", - }, - { - key = "q", - action = "close", - desc = "close tree window", - }, - { - key = "W", - action = "collapse_all", - desc = "collapse the whole tree", - }, - { - key = "E", - action = "expand_all", - desc = "expand the whole tree, stopping after expanding |actions.expand_all.max_folder_discovery| folders; this might hang neovim for a while if running on a big folder", - }, - { - key = "S", - action = "search_node", - desc = "prompt the user to enter a path and then expands the tree to match the path", - }, - { - key = ".", - action = "run_file_command", - desc = "enter vim command mode with the file the cursor is on", - }, - { - key = "", - action = "toggle_file_info", - desc = "toggle a popup with file infos about the file under the cursor", - }, - { - key = "g?", - action = "toggle_help", - desc = "toggle help", - }, - { - key = "m", - action = "toggle_mark", - desc = "Toggle node in bookmarks", - }, - { - key = "bmv", - action = "bulk_move", - desc = "Move all bookmarked nodes into specified location", - }, -} --- END_DEFAULT_MAPPINGS - -local M = { - mappings = {}, - custom_keypress_funcs = {}, -} - -local function set_map_for(bufnr) - local opts = { noremap = true, silent = true, nowait = true, buffer = bufnr } - return function(mode, rhs, desc) - return function(lhs) - opts.desc = desc - vim.keymap.set(mode or "n", lhs, rhs, opts) - end - end -end - -local function run_dispatch(action) - return function() - require("nvim-tree.actions.dispatch").dispatch(action) - end -end - -function M.apply_mappings(bufnr) - local setter_for = set_map_for(bufnr) - for _, b in pairs(M.mappings) do - local rhs = b.cb or run_dispatch(b.action) - if rhs then - local setter = setter_for(b.mode, rhs, b.action) - - local keys = type(b.key) == "table" and b.key or { b.key } - for _, key in pairs(keys) do - setter(key) - end - end - end -end - -local function merge_mappings(user_mappings) - if #user_mappings == 0 then - return M.mappings - end - - local function is_empty(s) - return s == "" - end - - local user_keys = {} - local removed_keys = {} - -- remove default mappings if action is a empty string - for _, map in pairs(user_mappings) do - if type(map.key) == "table" then - for _, key in pairs(map.key) do - table.insert(user_keys, key) - if is_empty(map.action) then - table.insert(removed_keys, key) - end - end - else - table.insert(user_keys, map.key) - if is_empty(map.action) then - table.insert(removed_keys, map.key) - end - end - - if map.action and type(map.action_cb) == "function" then - if not is_empty(map.action) then - M.custom_keypress_funcs[map.action] = map.action_cb - else - util.notify.warn "action can't be empty if action_cb provided" - end - end - end - - local default_map = vim.tbl_filter(function(map) - if type(map.key) == "table" then - local filtered_keys = {} - for _, key in pairs(map.key) do - if not vim.tbl_contains(user_keys, key) and not vim.tbl_contains(removed_keys, key) then - table.insert(filtered_keys, key) - end - end - map.key = filtered_keys - return not vim.tbl_isempty(map.key) - else - return not vim.tbl_contains(user_keys, map.key) and not vim.tbl_contains(removed_keys, map.key) - end - end, M.mappings) - local user_map = vim.tbl_filter(function(map) - return not is_empty(map.action) - end, user_mappings) - - return vim.fn.extend(default_map, user_map) -end - -local function copy_mappings(user_mappings) - if #user_mappings == 0 then - return M.mappings - end - - for _, map in pairs(user_mappings) do - if map.action and type(map.action_cb) == "function" then - M.custom_keypress_funcs[map.action] = map.action_cb - end - end - - return user_mappings -end - -local function cleanup_existing_mappings() - local bufnr = view.get_bufnr() - if bufnr == nil or not a.nvim_buf_is_valid(bufnr) then - return - end - - for _, b in pairs(M.mappings) do - local keys = type(b.key) == "table" and b.key or { b.key } - for _, key in pairs(keys) do - vim.keymap.del(b.mode or "n", key, { buffer = bufnr }) - end - end -end - -local function filter_mappings(mappings, keys) - if type(keys) == "boolean" and keys then - return {} - elseif type(keys) == "table" then - return vim.tbl_filter(function(m) - if type(m.key) == "table" then - m.key = vim.tbl_filter(function(k) - return not vim.tbl_contains(keys, k) - end, m.key) - return #m.key > 0 - else - return not vim.tbl_contains(keys, m.key) - end - end, vim.deepcopy(mappings)) - else - return vim.deepcopy(mappings) - end -end - -local DEFAULT_MAPPING_CONFIG = { - custom_only = false, - list = {}, -} +local M = {} function M.setup(opts) require("nvim-tree.actions.fs.trash").setup(opts) @@ -399,20 +14,7 @@ function M.setup(opts) require("nvim-tree.actions.fs.copy-paste").setup(opts) require("nvim-tree.actions.tree-modifiers.expand-all").setup(opts) - cleanup_existing_mappings() - - M.mappings = filter_mappings(DEFAULT_MAPPINGS, opts.remove_keymaps) - - local user_map_config = (opts.view or {}).mappings or {} - local options = vim.tbl_deep_extend("force", DEFAULT_MAPPING_CONFIG, user_map_config) - if options.custom_only then - M.mappings = copy_mappings(options.list) - else - M.mappings = merge_mappings(options.list) - end - - require("nvim-tree.actions.dispatch").setup(M.custom_keypress_funcs) - + -- TODO log.line("config", "active mappings") log.raw("config", "%s\n", vim.inspect(M.mappings)) end diff --git a/lua/nvim-tree/view.lua b/lua/nvim-tree/view.lua index 17ec841c1ef..4d0821618b7 100644 --- a/lua/nvim-tree/view.lua +++ b/lua/nvim-tree/view.lua @@ -95,8 +95,6 @@ local function create_buffer(bufnr) if type(M.on_attach) == "function" then require("nvim-tree.keymap").set_keymaps(M.get_bufnr()) M.on_attach(M.get_bufnr()) - else - require("nvim-tree.actions").apply_mappings(M.get_bufnr()) end end diff --git a/scripts/update-help.sh b/scripts/update-help.sh index 8b284049192..9b73897c5be 100755 --- a/scripts/update-help.sh +++ b/scripts/update-help.sh @@ -19,18 +19,18 @@ sed -i -e "/${begin}/,/${end}/{ /${begin}/{p; r /tmp/DEFAULT_OPTS.6.lua }; /${end}/p; d; }" doc/nvim-tree-lua.txt -begin="BEGIN_DEFAULT_MAPPINGS" -end="END_DEFAULT_MAPPINGS" +# begin="BEGIN_DEFAULT_MAPPINGS" +# end="END_DEFAULT_MAPPINGS" -# generate various DEFAULT_MAPPINGS -sed -n -e "/${begin}/,/${end}/{ /${begin}/d; /${end}/d; p; }" lua/nvim-tree/actions/init.lua > /tmp/DEFAULT_MAPPINGS.M.lua -cat /tmp/DEFAULT_MAPPINGS.M.lua scripts/generate_default_mappings.lua | lua +# # generate various DEFAULT_MAPPINGS +# sed -n -e "/${begin}/,/${end}/{ /${begin}/d; /${end}/d; p; }" lua/nvim-tree/actions/init.lua > /tmp/DEFAULT_MAPPINGS.M.lua +# cat /tmp/DEFAULT_MAPPINGS.M.lua scripts/generate_default_mappings.lua | lua -# help -sed -i -e "/${begin}/,/${end}/{ /${begin}/{p; r /tmp/DEFAULT_MAPPINGS.lua - }; /${end}/p; d }" doc/nvim-tree-lua.txt -sed -i -e "/^DEFAULT MAPPINGS/,/^>$/{ /^DEFAULT MAPPINGS/{p; r /tmp/DEFAULT_MAPPINGS.help - }; /^>$/p; d }" doc/nvim-tree-lua.txt +# # help +# sed -i -e "/${begin}/,/${end}/{ /${begin}/{p; r /tmp/DEFAULT_MAPPINGS.lua +# }; /${end}/p; d }" doc/nvim-tree-lua.txt +# sed -i -e "/^DEFAULT MAPPINGS/,/^>$/{ /^DEFAULT MAPPINGS/{p; r /tmp/DEFAULT_MAPPINGS.help +# }; /^>$/p; d }" doc/nvim-tree-lua.txt # generate various DEFAULT_KEYMAPS begin="BEGIN_DEFAULT_KEYMAPS" @@ -38,3 +38,9 @@ end="END_DEFAULT_KEYMAPS" sed -n -e "/${begin}/,/${end}/{ /${begin}/d; /${end}/d; s/callback = \(.*\),/callback = '\1',/g; p; }" lua/nvim-tree/keymap.lua > /tmp/DEFAULT_KEYMAPS.M.lua cat /tmp/DEFAULT_KEYMAPS.M.lua scripts/generate_default_keymaps.lua | lua +# help +sed -i -e "/${begin}/,/${end}/{ /${begin}/{p; r /tmp/DEFAULT_KEYMAPS.on_attach.lua + }; /${end}/p; d }" doc/nvim-tree-lua.txt +sed -i -e "/^DEFAULT KEYMAPS/,/^>$/{ /^DEFAULT KEYMAPS/{p; r /tmp/DEFAULT_KEYMAPS.help + }; /^>$/p; d }" doc/nvim-tree-lua.txt + From adb117ac54a9ab6509274aa031f035c5992696cf Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Sun, 4 Sep 2022 16:43:06 +1000 Subject: [PATCH 10/42] Revert "chore(mappings): migrate legacy mappings under the hood: remove dispatch" This reverts commit f6f439ba59b051e16f17d56bf1271af67fb5b662. --- lua/nvim-tree.lua | 3 + lua/nvim-tree/actions/dispatch.lua | 128 +++++++++ lua/nvim-tree/actions/init.lua | 402 ++++++++++++++++++++++++++++- lua/nvim-tree/view.lua | 2 + scripts/update-help.sh | 26 +- 5 files changed, 543 insertions(+), 18 deletions(-) create mode 100644 lua/nvim-tree/actions/dispatch.lua diff --git a/lua/nvim-tree.lua b/lua/nvim-tree.lua index e4e011771a7..54bbfe9e554 100644 --- a/lua/nvim-tree.lua +++ b/lua/nvim-tree.lua @@ -68,6 +68,9 @@ function M.change_root(filepath, bufnr) change_dir.fn(vim.fn.fnamemodify(filepath, ":p:h")) end +---@deprecated +M.on_keypress = require("nvim-tree.actions.dispatch").dispatch + function M.toggle(find_file, no_focus, cwd) if view.is_visible() then view.close() diff --git a/lua/nvim-tree/actions/dispatch.lua b/lua/nvim-tree/actions/dispatch.lua new file mode 100644 index 00000000000..44eff9834b0 --- /dev/null +++ b/lua/nvim-tree/actions/dispatch.lua @@ -0,0 +1,128 @@ +local view = require "nvim-tree.view" +local lib = require "nvim-tree.lib" + +local M = {} + +local Actions = { + close = view.close, + + -- Tree modifiers + collapse_all = require("nvim-tree.actions.tree-modifiers.collapse-all").fn, + expand_all = require("nvim-tree.actions.tree-modifiers.expand-all").fn, + toggle_dotfiles = require("nvim-tree.actions.tree-modifiers.toggles").dotfiles, + toggle_custom = require("nvim-tree.actions.tree-modifiers.toggles").custom, + toggle_git_ignored = require("nvim-tree.actions.tree-modifiers.toggles").git_ignored, + + -- Filesystem operations + copy_absolute_path = require("nvim-tree.actions.fs.copy-paste").copy_absolute_path, + copy_name = require("nvim-tree.actions.fs.copy-paste").copy_filename, + copy_path = require("nvim-tree.actions.fs.copy-paste").copy_path, + copy = require("nvim-tree.actions.fs.copy-paste").copy, + create = require("nvim-tree.actions.fs.create-file").fn, + cut = require("nvim-tree.actions.fs.copy-paste").cut, + full_rename = require("nvim-tree.actions.fs.rename-file").fn(true), + paste = require("nvim-tree.actions.fs.copy-paste").paste, + trash = require("nvim-tree.actions.fs.trash").fn, + remove = require("nvim-tree.actions.fs.remove-file").fn, + rename = require("nvim-tree.actions.fs.rename-file").fn(false), + + -- Movements in tree + close_node = require("nvim-tree.actions.moves.parent").fn(true), + first_sibling = require("nvim-tree.actions.moves.sibling").fn "first", + last_sibling = require("nvim-tree.actions.moves.sibling").fn "last", + next_diag_item = require("nvim-tree.actions.moves.item").fn("next", "diag"), + next_git_item = require("nvim-tree.actions.moves.item").fn("next", "git"), + next_sibling = require("nvim-tree.actions.moves.sibling").fn "next", + parent_node = require("nvim-tree.actions.moves.parent").fn(false), + prev_diag_item = require("nvim-tree.actions.moves.item").fn("prev", "diag"), + prev_git_item = require("nvim-tree.actions.moves.item").fn("prev", "git"), + prev_sibling = require("nvim-tree.actions.moves.sibling").fn "prev", + + -- Other types + refresh = require("nvim-tree.actions.reloaders.reloaders").reload_explorer, + dir_up = require("nvim-tree.actions.root.dir-up").fn, + search_node = require("nvim-tree.actions.finders.search-node").fn, + run_file_command = require("nvim-tree.actions.node.run-command").run_file_command, + toggle_file_info = require("nvim-tree.actions.node.file-popup").toggle_file_info, + system_open = require("nvim-tree.actions.node.system-open").fn, + toggle_mark = require("nvim-tree.marks").toggle_mark, + bulk_move = require("nvim-tree.marks.bulk-move").bulk_move, +} + +local function handle_action_on_help_ui(action) + if action == "close" or action == "toggle_help" then + require("nvim-tree.actions.tree-modifiers.toggles").help() + end +end + +local function handle_filter_actions(action) + if action == "live_filter" then + require("nvim-tree.live-filter").start_filtering() + elseif action == "clear_live_filter" then + require("nvim-tree.live-filter").clear_filter() + end +end + +local function change_dir_action(node) + if node.name == ".." then + require("nvim-tree.actions.root.change-dir").fn ".." + elseif node.nodes ~= nil then + require("nvim-tree.actions.root.change-dir").fn(lib.get_last_group_node(node).absolute_path) + end +end + +local function open_file(action, node) + local path = node.absolute_path + if node.link_to and not node.nodes then + path = node.link_to + end + require("nvim-tree.actions.node.open-file").fn(action, path) +end + +local function handle_tree_actions(action) + local node = lib.get_node_at_cursor() + if not node then + return + end + + local custom_function = M.custom_keypress_funcs[action] + local defined_action = Actions[action] + + if type(custom_function) == "function" then + return custom_function(node) + elseif defined_action then + return defined_action(node) + end + + local is_parent = node.name == ".." + + if action == "preview" and is_parent then + return + end + + if action == "cd" or is_parent then + return change_dir_action(node) + end + + if node.nodes then + lib.expand_or_collapse(node) + else + open_file(action, node) + end +end + +function M.dispatch(action) + if view.is_help_ui() or action == "toggle_help" then + handle_action_on_help_ui(action) + elseif action == "live_filter" or action == "clear_live_filter" then + handle_filter_actions(action) + else + handle_tree_actions(action) + end +end + +function M.setup(custom_keypress_funcs) + M.custom_keypress_funcs = custom_keypress_funcs +end + +return M diff --git a/lua/nvim-tree/actions/init.lua b/lua/nvim-tree/actions/init.lua index edbd976377e..e69775a2601 100644 --- a/lua/nvim-tree/actions/init.lua +++ b/lua/nvim-tree/actions/init.lua @@ -1,6 +1,391 @@ +-- @deprecated: new implementation in nvim-tree.keymap. Please do not edit this file. + +local a = vim.api + local log = require "nvim-tree.log" +local view = require "nvim-tree.view" +local util = require "nvim-tree.utils" + +-- BEGIN_DEFAULT_MAPPINGS +local DEFAULT_MAPPINGS = { + { + key = { "", "o", "<2-LeftMouse>" }, + action = "edit", + desc = "open a file or folder; root will cd to the above directory", + }, + { + key = "", + action = "edit_in_place", + desc = "edit the file in place, effectively replacing the tree explorer", + }, + { + key = "O", + action = "edit_no_picker", + desc = "same as (edit) with no window picker", + }, + { + key = { "", "<2-RightMouse>" }, + action = "cd", + desc = "cd in the directory under the cursor", + }, + { + key = "", + action = "vsplit", + desc = "open the file in a vertical split", + }, + { + key = "", + action = "split", + desc = "open the file in a horizontal split", + }, + { + key = "", + action = "tabnew", + desc = "open the file in a new tab", + }, + { + key = "<", + action = "prev_sibling", + desc = "navigate to the previous sibling of current file/directory", + }, + { + key = ">", + action = "next_sibling", + desc = "navigate to the next sibling of current file/directory", + }, + { + key = "P", + action = "parent_node", + desc = "move cursor to the parent directory", + }, + { + key = "", + action = "close_node", + desc = "close current opened directory or parent", + }, + { + key = "", + action = "preview", + desc = "open the file as a preview (keeps the cursor in the tree)", + }, + { + key = "K", + action = "first_sibling", + desc = "navigate to the first sibling of current file/directory", + }, + { + key = "J", + action = "last_sibling", + desc = "navigate to the last sibling of current file/directory", + }, + { + key = "I", + action = "toggle_git_ignored", + desc = "toggle visibility of files/folders hidden via |git.ignore| option", + }, + { + key = "H", + action = "toggle_dotfiles", + desc = "toggle visibility of dotfiles via |filters.dotfiles| option", + }, + { + key = "U", + action = "toggle_custom", + desc = "toggle visibility of files/folders hidden via |filters.custom| option", + }, + { + key = "R", + action = "refresh", + desc = "refresh the tree", + }, + { + key = "a", + action = "create", + desc = "add a file; leaving a trailing `/` will add a directory", + }, + { + key = "d", + action = "remove", + desc = "delete a file (will prompt for confirmation)", + }, + { + key = "D", + action = "trash", + desc = "trash a file via |trash| option", + }, + { + key = "r", + action = "rename", + desc = "rename a file", + }, + { + key = "", + action = "full_rename", + desc = "rename a file and omit the filename on input", + }, + { + key = "x", + action = "cut", + desc = "add/remove file/directory to cut clipboard", + }, + { + key = "c", + action = "copy", + desc = "add/remove file/directory to copy clipboard", + }, + { + key = "p", + action = "paste", + desc = "paste from clipboard; cut clipboard has precedence over copy; will prompt for confirmation", + }, + { + key = "y", + action = "copy_name", + desc = "copy name to system clipboard", + }, + { + key = "Y", + action = "copy_path", + desc = "copy relative path to system clipboard", + }, + { + key = "gy", + action = "copy_absolute_path", + desc = "copy absolute path to system clipboard", + }, + { + key = "[e", + action = "prev_diag_item", + desc = "go to next diagnostic item", + }, + { + key = "[c", + action = "prev_git_item", + desc = "go to next git item", + }, + { + key = "]e", + action = "next_diag_item", + desc = "go to prev diagnostic item", + }, + { + key = "]c", + action = "next_git_item", + desc = "go to prev git item", + }, + { + key = "-", + action = "dir_up", + desc = "navigate up to the parent directory of the current file/directory", + }, + { + key = "s", + action = "system_open", + desc = "open a file with default system application or a folder with default file manager, using |system_open| option", + }, + { + key = "f", + action = "live_filter", + desc = "live filter nodes dynamically based on regex matching.", + }, + { + key = "F", + action = "clear_live_filter", + desc = "clear live filter", + }, + { + key = "q", + action = "close", + desc = "close tree window", + }, + { + key = "W", + action = "collapse_all", + desc = "collapse the whole tree", + }, + { + key = "E", + action = "expand_all", + desc = "expand the whole tree, stopping after expanding |actions.expand_all.max_folder_discovery| folders; this might hang neovim for a while if running on a big folder", + }, + { + key = "S", + action = "search_node", + desc = "prompt the user to enter a path and then expands the tree to match the path", + }, + { + key = ".", + action = "run_file_command", + desc = "enter vim command mode with the file the cursor is on", + }, + { + key = "", + action = "toggle_file_info", + desc = "toggle a popup with file infos about the file under the cursor", + }, + { + key = "g?", + action = "toggle_help", + desc = "toggle help", + }, + { + key = "m", + action = "toggle_mark", + desc = "Toggle node in bookmarks", + }, + { + key = "bmv", + action = "bulk_move", + desc = "Move all bookmarked nodes into specified location", + }, +} +-- END_DEFAULT_MAPPINGS + +local M = { + mappings = {}, + custom_keypress_funcs = {}, +} + +local function set_map_for(bufnr) + local opts = { noremap = true, silent = true, nowait = true, buffer = bufnr } + return function(mode, rhs, desc) + return function(lhs) + opts.desc = desc + vim.keymap.set(mode or "n", lhs, rhs, opts) + end + end +end + +local function run_dispatch(action) + return function() + require("nvim-tree.actions.dispatch").dispatch(action) + end +end + +function M.apply_mappings(bufnr) + local setter_for = set_map_for(bufnr) + for _, b in pairs(M.mappings) do + local rhs = b.cb or run_dispatch(b.action) + if rhs then + local setter = setter_for(b.mode, rhs, b.action) + + local keys = type(b.key) == "table" and b.key or { b.key } + for _, key in pairs(keys) do + setter(key) + end + end + end +end + +local function merge_mappings(user_mappings) + if #user_mappings == 0 then + return M.mappings + end + + local function is_empty(s) + return s == "" + end + + local user_keys = {} + local removed_keys = {} + -- remove default mappings if action is a empty string + for _, map in pairs(user_mappings) do + if type(map.key) == "table" then + for _, key in pairs(map.key) do + table.insert(user_keys, key) + if is_empty(map.action) then + table.insert(removed_keys, key) + end + end + else + table.insert(user_keys, map.key) + if is_empty(map.action) then + table.insert(removed_keys, map.key) + end + end + + if map.action and type(map.action_cb) == "function" then + if not is_empty(map.action) then + M.custom_keypress_funcs[map.action] = map.action_cb + else + util.notify.warn "action can't be empty if action_cb provided" + end + end + end + + local default_map = vim.tbl_filter(function(map) + if type(map.key) == "table" then + local filtered_keys = {} + for _, key in pairs(map.key) do + if not vim.tbl_contains(user_keys, key) and not vim.tbl_contains(removed_keys, key) then + table.insert(filtered_keys, key) + end + end + map.key = filtered_keys + return not vim.tbl_isempty(map.key) + else + return not vim.tbl_contains(user_keys, map.key) and not vim.tbl_contains(removed_keys, map.key) + end + end, M.mappings) -local M = {} + local user_map = vim.tbl_filter(function(map) + return not is_empty(map.action) + end, user_mappings) + + return vim.fn.extend(default_map, user_map) +end + +local function copy_mappings(user_mappings) + if #user_mappings == 0 then + return M.mappings + end + + for _, map in pairs(user_mappings) do + if map.action and type(map.action_cb) == "function" then + M.custom_keypress_funcs[map.action] = map.action_cb + end + end + + return user_mappings +end + +local function cleanup_existing_mappings() + local bufnr = view.get_bufnr() + if bufnr == nil or not a.nvim_buf_is_valid(bufnr) then + return + end + + for _, b in pairs(M.mappings) do + local keys = type(b.key) == "table" and b.key or { b.key } + for _, key in pairs(keys) do + vim.keymap.del(b.mode or "n", key, { buffer = bufnr }) + end + end +end + +local function filter_mappings(mappings, keys) + if type(keys) == "boolean" and keys then + return {} + elseif type(keys) == "table" then + return vim.tbl_filter(function(m) + if type(m.key) == "table" then + m.key = vim.tbl_filter(function(k) + return not vim.tbl_contains(keys, k) + end, m.key) + return #m.key > 0 + else + return not vim.tbl_contains(keys, m.key) + end + end, vim.deepcopy(mappings)) + else + return vim.deepcopy(mappings) + end +end + +local DEFAULT_MAPPING_CONFIG = { + custom_only = false, + list = {}, +} function M.setup(opts) require("nvim-tree.actions.fs.trash").setup(opts) @@ -14,7 +399,20 @@ function M.setup(opts) require("nvim-tree.actions.fs.copy-paste").setup(opts) require("nvim-tree.actions.tree-modifiers.expand-all").setup(opts) - -- TODO + cleanup_existing_mappings() + + M.mappings = filter_mappings(DEFAULT_MAPPINGS, opts.remove_keymaps) + + local user_map_config = (opts.view or {}).mappings or {} + local options = vim.tbl_deep_extend("force", DEFAULT_MAPPING_CONFIG, user_map_config) + if options.custom_only then + M.mappings = copy_mappings(options.list) + else + M.mappings = merge_mappings(options.list) + end + + require("nvim-tree.actions.dispatch").setup(M.custom_keypress_funcs) + log.line("config", "active mappings") log.raw("config", "%s\n", vim.inspect(M.mappings)) end diff --git a/lua/nvim-tree/view.lua b/lua/nvim-tree/view.lua index 4d0821618b7..17ec841c1ef 100644 --- a/lua/nvim-tree/view.lua +++ b/lua/nvim-tree/view.lua @@ -95,6 +95,8 @@ local function create_buffer(bufnr) if type(M.on_attach) == "function" then require("nvim-tree.keymap").set_keymaps(M.get_bufnr()) M.on_attach(M.get_bufnr()) + else + require("nvim-tree.actions").apply_mappings(M.get_bufnr()) end end diff --git a/scripts/update-help.sh b/scripts/update-help.sh index 9b73897c5be..8b284049192 100755 --- a/scripts/update-help.sh +++ b/scripts/update-help.sh @@ -19,18 +19,18 @@ sed -i -e "/${begin}/,/${end}/{ /${begin}/{p; r /tmp/DEFAULT_OPTS.6.lua }; /${end}/p; d; }" doc/nvim-tree-lua.txt -# begin="BEGIN_DEFAULT_MAPPINGS" -# end="END_DEFAULT_MAPPINGS" +begin="BEGIN_DEFAULT_MAPPINGS" +end="END_DEFAULT_MAPPINGS" -# # generate various DEFAULT_MAPPINGS -# sed -n -e "/${begin}/,/${end}/{ /${begin}/d; /${end}/d; p; }" lua/nvim-tree/actions/init.lua > /tmp/DEFAULT_MAPPINGS.M.lua -# cat /tmp/DEFAULT_MAPPINGS.M.lua scripts/generate_default_mappings.lua | lua +# generate various DEFAULT_MAPPINGS +sed -n -e "/${begin}/,/${end}/{ /${begin}/d; /${end}/d; p; }" lua/nvim-tree/actions/init.lua > /tmp/DEFAULT_MAPPINGS.M.lua +cat /tmp/DEFAULT_MAPPINGS.M.lua scripts/generate_default_mappings.lua | lua -# # help -# sed -i -e "/${begin}/,/${end}/{ /${begin}/{p; r /tmp/DEFAULT_MAPPINGS.lua -# }; /${end}/p; d }" doc/nvim-tree-lua.txt -# sed -i -e "/^DEFAULT MAPPINGS/,/^>$/{ /^DEFAULT MAPPINGS/{p; r /tmp/DEFAULT_MAPPINGS.help -# }; /^>$/p; d }" doc/nvim-tree-lua.txt +# help +sed -i -e "/${begin}/,/${end}/{ /${begin}/{p; r /tmp/DEFAULT_MAPPINGS.lua + }; /${end}/p; d }" doc/nvim-tree-lua.txt +sed -i -e "/^DEFAULT MAPPINGS/,/^>$/{ /^DEFAULT MAPPINGS/{p; r /tmp/DEFAULT_MAPPINGS.help + }; /^>$/p; d }" doc/nvim-tree-lua.txt # generate various DEFAULT_KEYMAPS begin="BEGIN_DEFAULT_KEYMAPS" @@ -38,9 +38,3 @@ end="END_DEFAULT_KEYMAPS" sed -n -e "/${begin}/,/${end}/{ /${begin}/d; /${end}/d; s/callback = \(.*\),/callback = '\1',/g; p; }" lua/nvim-tree/keymap.lua > /tmp/DEFAULT_KEYMAPS.M.lua cat /tmp/DEFAULT_KEYMAPS.M.lua scripts/generate_default_keymaps.lua | lua -# help -sed -i -e "/${begin}/,/${end}/{ /${begin}/{p; r /tmp/DEFAULT_KEYMAPS.on_attach.lua - }; /${end}/p; d }" doc/nvim-tree-lua.txt -sed -i -e "/^DEFAULT KEYMAPS/,/^>$/{ /^DEFAULT KEYMAPS/{p; r /tmp/DEFAULT_KEYMAPS.help - }; /^>$/p; d }" doc/nvim-tree-lua.txt - From c5883a116054e04487c5cb987d9c529ac901e4e0 Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Sun, 4 Sep 2022 17:18:33 +1000 Subject: [PATCH 11/42] chore(mappings): migrate legacy mappings under the hood: pass node to action_cb --- lua/nvim-tree/legacy.lua | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lua/nvim-tree/legacy.lua b/lua/nvim-tree/legacy.lua index 03fb2f39e36..66d155e9798 100644 --- a/lua/nvim-tree/legacy.lua +++ b/lua/nvim-tree/legacy.lua @@ -314,8 +314,10 @@ function M.move_mappings_to_keymap(opts) local call_list = {} opts.on_attach = function(bufnr) for _, el in pairs(call_list) do - if el.callback then - vim.keymap.set(el.mode or "n", el.key, el.callback, { buffer = bufnr, remap = false, silent = true }) + if el.action_cb then + vim.keymap.set(el.mode or "n", el.key, function() + el.action_cb(require("nvim-tree.lib").get_node_at_cursor()) + end, { buffer = bufnr, remap = false, silent = true }) elseif el.keymap then vim.keymap.set( el.mode or "n", @@ -329,11 +331,11 @@ function M.move_mappings_to_keymap(opts) for _, map in pairs(list) do local keys = type(map.key) == "table" and map.key or { map.key } local mode = map.mode or "n" - local callback + local action_cb local keymap if map.action ~= "" then if map.action_cb then - callback = map.action_cb + action_cb = map.action_cb elseif keymap_by_action[map.action] then keymap = keymap_by_action[map.action] end @@ -344,8 +346,8 @@ function M.move_mappings_to_keymap(opts) table.insert(opts.remove_keymaps, k) end - if callback then - table.insert(call_list, { mode = mode, key = k, callback = callback }) + if action_cb then + table.insert(call_list, { mode = mode, key = k, action_cb = action_cb }) elseif keymap then table.insert(call_list, { mode = mode, key = k, keymap = keymap }) end From a4564805114b4274a9577e34a3210100cfe7fa00 Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Sun, 4 Sep 2022 17:26:05 +1000 Subject: [PATCH 12/42] chore(mappings): migrate legacy mappings under the hood: remove dispatch --- lua/nvim-tree.lua | 3 - lua/nvim-tree/actions/dispatch.lua | 128 --------- lua/nvim-tree/actions/init.lua | 406 +---------------------------- lua/nvim-tree/config.lua | 10 - lua/nvim-tree/view.lua | 2 - 5 files changed, 1 insertion(+), 548 deletions(-) delete mode 100644 lua/nvim-tree/actions/dispatch.lua delete mode 100644 lua/nvim-tree/config.lua diff --git a/lua/nvim-tree.lua b/lua/nvim-tree.lua index 54bbfe9e554..e4e011771a7 100644 --- a/lua/nvim-tree.lua +++ b/lua/nvim-tree.lua @@ -68,9 +68,6 @@ function M.change_root(filepath, bufnr) change_dir.fn(vim.fn.fnamemodify(filepath, ":p:h")) end ----@deprecated -M.on_keypress = require("nvim-tree.actions.dispatch").dispatch - function M.toggle(find_file, no_focus, cwd) if view.is_visible() then view.close() diff --git a/lua/nvim-tree/actions/dispatch.lua b/lua/nvim-tree/actions/dispatch.lua deleted file mode 100644 index 44eff9834b0..00000000000 --- a/lua/nvim-tree/actions/dispatch.lua +++ /dev/null @@ -1,128 +0,0 @@ -local view = require "nvim-tree.view" -local lib = require "nvim-tree.lib" - -local M = {} - -local Actions = { - close = view.close, - - -- Tree modifiers - collapse_all = require("nvim-tree.actions.tree-modifiers.collapse-all").fn, - expand_all = require("nvim-tree.actions.tree-modifiers.expand-all").fn, - toggle_dotfiles = require("nvim-tree.actions.tree-modifiers.toggles").dotfiles, - toggle_custom = require("nvim-tree.actions.tree-modifiers.toggles").custom, - toggle_git_ignored = require("nvim-tree.actions.tree-modifiers.toggles").git_ignored, - - -- Filesystem operations - copy_absolute_path = require("nvim-tree.actions.fs.copy-paste").copy_absolute_path, - copy_name = require("nvim-tree.actions.fs.copy-paste").copy_filename, - copy_path = require("nvim-tree.actions.fs.copy-paste").copy_path, - copy = require("nvim-tree.actions.fs.copy-paste").copy, - create = require("nvim-tree.actions.fs.create-file").fn, - cut = require("nvim-tree.actions.fs.copy-paste").cut, - full_rename = require("nvim-tree.actions.fs.rename-file").fn(true), - paste = require("nvim-tree.actions.fs.copy-paste").paste, - trash = require("nvim-tree.actions.fs.trash").fn, - remove = require("nvim-tree.actions.fs.remove-file").fn, - rename = require("nvim-tree.actions.fs.rename-file").fn(false), - - -- Movements in tree - close_node = require("nvim-tree.actions.moves.parent").fn(true), - first_sibling = require("nvim-tree.actions.moves.sibling").fn "first", - last_sibling = require("nvim-tree.actions.moves.sibling").fn "last", - next_diag_item = require("nvim-tree.actions.moves.item").fn("next", "diag"), - next_git_item = require("nvim-tree.actions.moves.item").fn("next", "git"), - next_sibling = require("nvim-tree.actions.moves.sibling").fn "next", - parent_node = require("nvim-tree.actions.moves.parent").fn(false), - prev_diag_item = require("nvim-tree.actions.moves.item").fn("prev", "diag"), - prev_git_item = require("nvim-tree.actions.moves.item").fn("prev", "git"), - prev_sibling = require("nvim-tree.actions.moves.sibling").fn "prev", - - -- Other types - refresh = require("nvim-tree.actions.reloaders.reloaders").reload_explorer, - dir_up = require("nvim-tree.actions.root.dir-up").fn, - search_node = require("nvim-tree.actions.finders.search-node").fn, - run_file_command = require("nvim-tree.actions.node.run-command").run_file_command, - toggle_file_info = require("nvim-tree.actions.node.file-popup").toggle_file_info, - system_open = require("nvim-tree.actions.node.system-open").fn, - toggle_mark = require("nvim-tree.marks").toggle_mark, - bulk_move = require("nvim-tree.marks.bulk-move").bulk_move, -} - -local function handle_action_on_help_ui(action) - if action == "close" or action == "toggle_help" then - require("nvim-tree.actions.tree-modifiers.toggles").help() - end -end - -local function handle_filter_actions(action) - if action == "live_filter" then - require("nvim-tree.live-filter").start_filtering() - elseif action == "clear_live_filter" then - require("nvim-tree.live-filter").clear_filter() - end -end - -local function change_dir_action(node) - if node.name == ".." then - require("nvim-tree.actions.root.change-dir").fn ".." - elseif node.nodes ~= nil then - require("nvim-tree.actions.root.change-dir").fn(lib.get_last_group_node(node).absolute_path) - end -end - -local function open_file(action, node) - local path = node.absolute_path - if node.link_to and not node.nodes then - path = node.link_to - end - require("nvim-tree.actions.node.open-file").fn(action, path) -end - -local function handle_tree_actions(action) - local node = lib.get_node_at_cursor() - if not node then - return - end - - local custom_function = M.custom_keypress_funcs[action] - local defined_action = Actions[action] - - if type(custom_function) == "function" then - return custom_function(node) - elseif defined_action then - return defined_action(node) - end - - local is_parent = node.name == ".." - - if action == "preview" and is_parent then - return - end - - if action == "cd" or is_parent then - return change_dir_action(node) - end - - if node.nodes then - lib.expand_or_collapse(node) - else - open_file(action, node) - end -end - -function M.dispatch(action) - if view.is_help_ui() or action == "toggle_help" then - handle_action_on_help_ui(action) - elseif action == "live_filter" or action == "clear_live_filter" then - handle_filter_actions(action) - else - handle_tree_actions(action) - end -end - -function M.setup(custom_keypress_funcs) - M.custom_keypress_funcs = custom_keypress_funcs -end - -return M diff --git a/lua/nvim-tree/actions/init.lua b/lua/nvim-tree/actions/init.lua index e69775a2601..5dab40b1fb7 100644 --- a/lua/nvim-tree/actions/init.lua +++ b/lua/nvim-tree/actions/init.lua @@ -1,391 +1,4 @@ --- @deprecated: new implementation in nvim-tree.keymap. Please do not edit this file. - -local a = vim.api - -local log = require "nvim-tree.log" -local view = require "nvim-tree.view" -local util = require "nvim-tree.utils" - --- BEGIN_DEFAULT_MAPPINGS -local DEFAULT_MAPPINGS = { - { - key = { "", "o", "<2-LeftMouse>" }, - action = "edit", - desc = "open a file or folder; root will cd to the above directory", - }, - { - key = "", - action = "edit_in_place", - desc = "edit the file in place, effectively replacing the tree explorer", - }, - { - key = "O", - action = "edit_no_picker", - desc = "same as (edit) with no window picker", - }, - { - key = { "", "<2-RightMouse>" }, - action = "cd", - desc = "cd in the directory under the cursor", - }, - { - key = "", - action = "vsplit", - desc = "open the file in a vertical split", - }, - { - key = "", - action = "split", - desc = "open the file in a horizontal split", - }, - { - key = "", - action = "tabnew", - desc = "open the file in a new tab", - }, - { - key = "<", - action = "prev_sibling", - desc = "navigate to the previous sibling of current file/directory", - }, - { - key = ">", - action = "next_sibling", - desc = "navigate to the next sibling of current file/directory", - }, - { - key = "P", - action = "parent_node", - desc = "move cursor to the parent directory", - }, - { - key = "", - action = "close_node", - desc = "close current opened directory or parent", - }, - { - key = "", - action = "preview", - desc = "open the file as a preview (keeps the cursor in the tree)", - }, - { - key = "K", - action = "first_sibling", - desc = "navigate to the first sibling of current file/directory", - }, - { - key = "J", - action = "last_sibling", - desc = "navigate to the last sibling of current file/directory", - }, - { - key = "I", - action = "toggle_git_ignored", - desc = "toggle visibility of files/folders hidden via |git.ignore| option", - }, - { - key = "H", - action = "toggle_dotfiles", - desc = "toggle visibility of dotfiles via |filters.dotfiles| option", - }, - { - key = "U", - action = "toggle_custom", - desc = "toggle visibility of files/folders hidden via |filters.custom| option", - }, - { - key = "R", - action = "refresh", - desc = "refresh the tree", - }, - { - key = "a", - action = "create", - desc = "add a file; leaving a trailing `/` will add a directory", - }, - { - key = "d", - action = "remove", - desc = "delete a file (will prompt for confirmation)", - }, - { - key = "D", - action = "trash", - desc = "trash a file via |trash| option", - }, - { - key = "r", - action = "rename", - desc = "rename a file", - }, - { - key = "", - action = "full_rename", - desc = "rename a file and omit the filename on input", - }, - { - key = "x", - action = "cut", - desc = "add/remove file/directory to cut clipboard", - }, - { - key = "c", - action = "copy", - desc = "add/remove file/directory to copy clipboard", - }, - { - key = "p", - action = "paste", - desc = "paste from clipboard; cut clipboard has precedence over copy; will prompt for confirmation", - }, - { - key = "y", - action = "copy_name", - desc = "copy name to system clipboard", - }, - { - key = "Y", - action = "copy_path", - desc = "copy relative path to system clipboard", - }, - { - key = "gy", - action = "copy_absolute_path", - desc = "copy absolute path to system clipboard", - }, - { - key = "[e", - action = "prev_diag_item", - desc = "go to next diagnostic item", - }, - { - key = "[c", - action = "prev_git_item", - desc = "go to next git item", - }, - { - key = "]e", - action = "next_diag_item", - desc = "go to prev diagnostic item", - }, - { - key = "]c", - action = "next_git_item", - desc = "go to prev git item", - }, - { - key = "-", - action = "dir_up", - desc = "navigate up to the parent directory of the current file/directory", - }, - { - key = "s", - action = "system_open", - desc = "open a file with default system application or a folder with default file manager, using |system_open| option", - }, - { - key = "f", - action = "live_filter", - desc = "live filter nodes dynamically based on regex matching.", - }, - { - key = "F", - action = "clear_live_filter", - desc = "clear live filter", - }, - { - key = "q", - action = "close", - desc = "close tree window", - }, - { - key = "W", - action = "collapse_all", - desc = "collapse the whole tree", - }, - { - key = "E", - action = "expand_all", - desc = "expand the whole tree, stopping after expanding |actions.expand_all.max_folder_discovery| folders; this might hang neovim for a while if running on a big folder", - }, - { - key = "S", - action = "search_node", - desc = "prompt the user to enter a path and then expands the tree to match the path", - }, - { - key = ".", - action = "run_file_command", - desc = "enter vim command mode with the file the cursor is on", - }, - { - key = "", - action = "toggle_file_info", - desc = "toggle a popup with file infos about the file under the cursor", - }, - { - key = "g?", - action = "toggle_help", - desc = "toggle help", - }, - { - key = "m", - action = "toggle_mark", - desc = "Toggle node in bookmarks", - }, - { - key = "bmv", - action = "bulk_move", - desc = "Move all bookmarked nodes into specified location", - }, -} --- END_DEFAULT_MAPPINGS - -local M = { - mappings = {}, - custom_keypress_funcs = {}, -} - -local function set_map_for(bufnr) - local opts = { noremap = true, silent = true, nowait = true, buffer = bufnr } - return function(mode, rhs, desc) - return function(lhs) - opts.desc = desc - vim.keymap.set(mode or "n", lhs, rhs, opts) - end - end -end - -local function run_dispatch(action) - return function() - require("nvim-tree.actions.dispatch").dispatch(action) - end -end - -function M.apply_mappings(bufnr) - local setter_for = set_map_for(bufnr) - for _, b in pairs(M.mappings) do - local rhs = b.cb or run_dispatch(b.action) - if rhs then - local setter = setter_for(b.mode, rhs, b.action) - - local keys = type(b.key) == "table" and b.key or { b.key } - for _, key in pairs(keys) do - setter(key) - end - end - end -end - -local function merge_mappings(user_mappings) - if #user_mappings == 0 then - return M.mappings - end - - local function is_empty(s) - return s == "" - end - - local user_keys = {} - local removed_keys = {} - -- remove default mappings if action is a empty string - for _, map in pairs(user_mappings) do - if type(map.key) == "table" then - for _, key in pairs(map.key) do - table.insert(user_keys, key) - if is_empty(map.action) then - table.insert(removed_keys, key) - end - end - else - table.insert(user_keys, map.key) - if is_empty(map.action) then - table.insert(removed_keys, map.key) - end - end - - if map.action and type(map.action_cb) == "function" then - if not is_empty(map.action) then - M.custom_keypress_funcs[map.action] = map.action_cb - else - util.notify.warn "action can't be empty if action_cb provided" - end - end - end - - local default_map = vim.tbl_filter(function(map) - if type(map.key) == "table" then - local filtered_keys = {} - for _, key in pairs(map.key) do - if not vim.tbl_contains(user_keys, key) and not vim.tbl_contains(removed_keys, key) then - table.insert(filtered_keys, key) - end - end - map.key = filtered_keys - return not vim.tbl_isempty(map.key) - else - return not vim.tbl_contains(user_keys, map.key) and not vim.tbl_contains(removed_keys, map.key) - end - end, M.mappings) - - local user_map = vim.tbl_filter(function(map) - return not is_empty(map.action) - end, user_mappings) - - return vim.fn.extend(default_map, user_map) -end - -local function copy_mappings(user_mappings) - if #user_mappings == 0 then - return M.mappings - end - - for _, map in pairs(user_mappings) do - if map.action and type(map.action_cb) == "function" then - M.custom_keypress_funcs[map.action] = map.action_cb - end - end - - return user_mappings -end - -local function cleanup_existing_mappings() - local bufnr = view.get_bufnr() - if bufnr == nil or not a.nvim_buf_is_valid(bufnr) then - return - end - - for _, b in pairs(M.mappings) do - local keys = type(b.key) == "table" and b.key or { b.key } - for _, key in pairs(keys) do - vim.keymap.del(b.mode or "n", key, { buffer = bufnr }) - end - end -end - -local function filter_mappings(mappings, keys) - if type(keys) == "boolean" and keys then - return {} - elseif type(keys) == "table" then - return vim.tbl_filter(function(m) - if type(m.key) == "table" then - m.key = vim.tbl_filter(function(k) - return not vim.tbl_contains(keys, k) - end, m.key) - return #m.key > 0 - else - return not vim.tbl_contains(keys, m.key) - end - end, vim.deepcopy(mappings)) - else - return vim.deepcopy(mappings) - end -end - -local DEFAULT_MAPPING_CONFIG = { - custom_only = false, - list = {}, -} +local M = {} function M.setup(opts) require("nvim-tree.actions.fs.trash").setup(opts) @@ -398,23 +11,6 @@ function M.setup(opts) require("nvim-tree.actions.fs.remove-file").setup(opts) require("nvim-tree.actions.fs.copy-paste").setup(opts) require("nvim-tree.actions.tree-modifiers.expand-all").setup(opts) - - cleanup_existing_mappings() - - M.mappings = filter_mappings(DEFAULT_MAPPINGS, opts.remove_keymaps) - - local user_map_config = (opts.view or {}).mappings or {} - local options = vim.tbl_deep_extend("force", DEFAULT_MAPPING_CONFIG, user_map_config) - if options.custom_only then - M.mappings = copy_mappings(options.list) - else - M.mappings = merge_mappings(options.list) - end - - require("nvim-tree.actions.dispatch").setup(M.custom_keypress_funcs) - - log.line("config", "active mappings") - log.raw("config", "%s\n", vim.inspect(M.mappings)) end return M diff --git a/lua/nvim-tree/config.lua b/lua/nvim-tree/config.lua deleted file mode 100644 index df87c41d2d6..00000000000 --- a/lua/nvim-tree/config.lua +++ /dev/null @@ -1,10 +0,0 @@ --- INFO: DEPRECATED FILE, DO NOT ADD ANYTHING IN THERE --- keeping to avoid breaking user configs. Will remove during a weekend. -local M = {} - --- TODO: remove this once the cb property is not supported in mappings -function M.nvim_tree_callback(callback_name) - return string.format("lua require'nvim-tree.actions.dispatch'.dispatch('%s')", callback_name) -end - -return M diff --git a/lua/nvim-tree/view.lua b/lua/nvim-tree/view.lua index 17ec841c1ef..4d0821618b7 100644 --- a/lua/nvim-tree/view.lua +++ b/lua/nvim-tree/view.lua @@ -95,8 +95,6 @@ local function create_buffer(bufnr) if type(M.on_attach) == "function" then require("nvim-tree.keymap").set_keymaps(M.get_bufnr()) M.on_attach(M.get_bufnr()) - else - require("nvim-tree.actions").apply_mappings(M.get_bufnr()) end end From 3ff5408e41f0e6c260a8ccfb7740ad4b93be6565 Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Sun, 4 Sep 2022 17:44:24 +1000 Subject: [PATCH 13/42] chore(mappings): migrate legacy mappings under the hood: replace mappigns with keymaps in help --- doc/nvim-tree-lua.txt | 194 +++++++++++++------------- scripts/generate_default_keymaps.lua | 6 +- scripts/generate_default_mappings.lua | 84 ----------- scripts/update-help.sh | 33 +++-- 4 files changed, 121 insertions(+), 196 deletions(-) delete mode 100644 scripts/generate_default_mappings.lua diff --git a/doc/nvim-tree-lua.txt b/doc/nvim-tree-lua.txt index 0c1b714fddf..7562e9a3447 100644 --- a/doc/nvim-tree-lua.txt +++ b/doc/nvim-tree-lua.txt @@ -187,7 +187,6 @@ Subsequent calls to setup will replace the previous configuration. number = false, relativenumber = false, signcolumn = "yes", - -- @deprecated mappings = { custom_only = false, list = { @@ -1169,105 +1168,110 @@ Mouse support defined in |KeyBindings| DEFAULT MAPPINGS *nvim-tree-default-mappings* -`` edit open a file or folder; root will cd to the above directory +`` Open Open a file or directory; root will cd to the above directory. `o` `<2-LeftMouse>` -`` edit_in_place edit the file in place, effectively replacing the tree explorer -`O` edit_no_picker same as (edit) with no window picker -`` cd cd in the directory under the cursor +`` Open: In Place Open file in place, effectively replacing the tree explorer. +`O` Open: No Window Picker Open file with no window picker. +`` CD cd in the directory under the cursor. `<2-RightMouse>` -`` vsplit open the file in a vertical split -`` split open the file in a horizontal split -`` tabnew open the file in a new tab -`<` prev_sibling navigate to the previous sibling of current file/directory -`>` next_sibling navigate to the next sibling of current file/directory -`P` parent_node move cursor to the parent directory -`` close_node close current opened directory or parent -`` preview open the file as a preview (keeps the cursor in the tree) -`K` first_sibling navigate to the first sibling of current file/directory -`J` last_sibling navigate to the last sibling of current file/directory -`I` toggle_git_ignored toggle visibility of files/folders hidden via |git.ignore| option -`H` toggle_dotfiles toggle visibility of dotfiles via |filters.dotfiles| option -`U` toggle_custom toggle visibility of files/folders hidden via |filters.custom| option -`R` refresh refresh the tree -`a` create add a file; leaving a trailing `/` will add a directory -`d` remove delete a file (will prompt for confirmation) -`D` trash trash a file via |trash| option -`r` rename rename a file -`` full_rename rename a file and omit the filename on input -`x` cut add/remove file/directory to cut clipboard -`c` copy add/remove file/directory to copy clipboard -`p` paste paste from clipboard; cut clipboard has precedence over copy; will prompt for confirmation -`y` copy_name copy name to system clipboard -`Y` copy_path copy relative path to system clipboard -`gy` copy_absolute_path copy absolute path to system clipboard -`[e` prev_diag_item go to next diagnostic item -`[c` prev_git_item go to next git item -`]e` next_diag_item go to prev diagnostic item -`]c` next_git_item go to prev git item -`-` dir_up navigate up to the parent directory of the current file/directory -`s` system_open open a file with default system application or a folder with default file manager, using |system_open| option -`f` live_filter live filter nodes dynamically based on regex matching. -`F` clear_live_filter clear live filter -`q` close close tree window -`W` collapse_all collapse the whole tree -`E` expand_all expand the whole tree, stopping after expanding |actions.expand_all.max_folder_discovery| folders; this might hang neovim for a while if running on a big folder -`S` search_node prompt the user to enter a path and then expands the tree to match the path -`.` run_file_command enter vim command mode with the file the cursor is on -`` toggle_file_info toggle a popup with file infos about the file under the cursor -`g?` toggle_help toggle help -`m` toggle_mark Toggle node in bookmarks -`bmv` bulk_move Move all bookmarked nodes into specified location +`` Open: Vertical Split Open file in a vertical split. +`` Open: Horizontal Split Open file in a horizontal split. +`` Open: New Tab Open file in a new tab. +`<` Previous Sibling Navigate to the previous sibling. +`>` Next Sibling Navigate to the next sibling +`P` Parent Directory Move cursor to the parent directory. +`` Close Directory Close current opened directory or parent. +`` Open Preview Open file as a preview (keeps the cursor in the tree). +`K` First Sibling Navigate to the first sibling. +`J` Last Sibling Navigate to the last sibling. +`I` Toggle Git Ignore Toggle visibility of files/directories hidden via |git.ignore| option. +`H` Toggle Dotfiles Toggle visibility of dotfiles via |filters.dotfiles| option. +`U` Toggle Hidden Toggle visibility of files/directories hidden via |filters.custom| option. +`R` Refresh Refresh the tree. +`a` Create Create a file; leaving a trailing `/` will add a directory. +`d` Delete Delete a file, prompting for confirmation. +`D` Trash Trash a file via |trash| option. +`r` Rename Rename a file or directory. +`` Rename: Omit Filename Rename a file or directory and omit the filename on input. +`x` Cut Cut file or directory to cut clipboard. +`c` Copy Copy file or directory to copy clipboard. +`p` Paste Paste from clipboard; cut clipboard has precedence over copy; will prompt for confirmation. +`y` Copy Name Copy name to system clipboard. +`Y` Copy Relative Path Copy relative path to system clipboard. +`gy` Copy Absolute Path Copy absolute path to system clipboard. +`]e` Next Diagnostic Go to next diagnostic item. +`]c` Next Git Go to next git item. +`[e` Prev Diagnostic Go to prev diagnostic item. +`[c` Prev Git Go to prev git item. +`-` Up Navigate up to the parent directory of the current file/directory. +`s` Run System Open a file with default system application or a directory with default file manager, using |system_open| option. +`f` Filter Live filter nodes dynamically based on regex matching. +`F` Clean Filter Clear live filter. +`q` Close Close tree window. +`W` Collapse Collapse the whole tree. +`E` Expand All Expand the whole tree, stopping after expanding |callbacks.expand_all.max_folder_discovery| directories; this might hang neovim for a while if running on a big directory. +`S` Search Prompt the user to enter a path and then expands the tree to match the path. +`.` Run Command Enter vim command mode with the file the cursor is on. +`` Info Toggle a popup with file info about the file under the cursor. +`g?` Help Toggle help. +`m` Toggle Bookmark Toggle node in bookmarks. +`bmv` Move Bookmarked Move all bookmarked nodes into specified location. > - view.mappings.list = { -- BEGIN_DEFAULT_MAPPINGS - { key = { "", "o", "<2-LeftMouse>" }, action = "edit" }, - { key = "", action = "edit_in_place" }, - { key = "O", action = "edit_no_picker" }, - { key = { "", "<2-RightMouse>" }, action = "cd" }, - { key = "", action = "vsplit" }, - { key = "", action = "split" }, - { key = "", action = "tabnew" }, - { key = "<", action = "prev_sibling" }, - { key = ">", action = "next_sibling" }, - { key = "P", action = "parent_node" }, - { key = "", action = "close_node" }, - { key = "", action = "preview" }, - { key = "K", action = "first_sibling" }, - { key = "J", action = "last_sibling" }, - { key = "I", action = "toggle_git_ignored" }, - { key = "H", action = "toggle_dotfiles" }, - { key = "U", action = "toggle_custom" }, - { key = "R", action = "refresh" }, - { key = "a", action = "create" }, - { key = "d", action = "remove" }, - { key = "D", action = "trash" }, - { key = "r", action = "rename" }, - { key = "", 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 = "[e", action = "prev_diag_item" }, - { key = "[c", action = "prev_git_item" }, - { key = "]e", action = "next_diag_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 = "W", action = "collapse_all" }, - { key = "E", action = "expand_all" }, - { key = "S", action = "search_node" }, - { key = ".", action = "run_file_command" }, - { key = "", action = "toggle_file_info" }, - { key = "g?", action = "toggle_help" }, - { key = "m", action = "toggle_mark" }, - { key = "bmv", action = "bulk_move" }, - } -- END_DEFAULT_MAPPINGS + local on_attach = function(bufnr) -- BEGIN_ON_ATTACH + local Api = require('nvim-tree.api') + + vim.keymap.set('n', '', Api.node.open.edit, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Open', }) + vim.keymap.set('n', 'o', Api.node.open.edit, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Open', }) + vim.keymap.set('n', '<2-LeftMouse>', Api.node.open.edit, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Open', }) + vim.keymap.set('n', '', Api.node.open.replace_tree_buffer, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Open: In Place', }) + vim.keymap.set('n', 'O', Api.node.open.no_window_picker, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Open: No Window Picker', }) + vim.keymap.set('n', '', Api.tree.change_root_to_node, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'CD', }) + vim.keymap.set('n', '<2-RightMouse>', Api.tree.change_root_to_node, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'CD', }) + vim.keymap.set('n', '', Api.node.open.vertical, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Open: Vertical Split', }) + vim.keymap.set('n', '', Api.node.open.horizontal, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Open: Horizontal Split', }) + vim.keymap.set('n', '', Api.node.open.tab, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Open: New Tab', }) + vim.keymap.set('n', '<', Api.node.navigate.sibling.prev, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Previous Sibling', }) + vim.keymap.set('n', '>', Api.node.navigate.sibling.next, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Next Sibling', }) + vim.keymap.set('n', 'P', Api.node.navigate.parent, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Parent Directory', }) + vim.keymap.set('n', '', Api.node.navigate.parent_close, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Close Directory', }) + vim.keymap.set('n', '', Api.node.open.preview, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Open Preview', }) + vim.keymap.set('n', 'K', Api.node.navigate.sibling.first, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'First Sibling', }) + vim.keymap.set('n', 'J', Api.node.navigate.sibling.last, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Last Sibling', }) + vim.keymap.set('n', 'I', Api.tree.toggle_gitignore_filter, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Toggle Git Ignore', }) + vim.keymap.set('n', 'H', Api.tree.toggle_hidden_filter, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Toggle Dotfiles', }) + vim.keymap.set('n', 'U', Api.tree.toggle_custom_filter, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Toggle Hidden', }) + vim.keymap.set('n', 'R', Api.tree.reload, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Refresh', }) + vim.keymap.set('n', 'a', Api.fs.create, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Create', }) + vim.keymap.set('n', 'd', Api.fs.remove, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Delete', }) + vim.keymap.set('n', 'D', Api.fs.trash, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Trash', }) + vim.keymap.set('n', 'r', Api.fs.rename, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Rename', }) + vim.keymap.set('n', '', Api.fs.rename_sub, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Rename: Omit Filename', }) + vim.keymap.set('n', 'x', Api.fs.cut, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Cut', }) + vim.keymap.set('n', 'c', Api.fs.copy.node, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Copy', }) + vim.keymap.set('n', 'p', Api.fs.paste, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Paste', }) + vim.keymap.set('n', 'y', Api.fs.copy.filename, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Copy Name', }) + vim.keymap.set('n', 'Y', Api.fs.copy.relative_path, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Copy Relative Path', }) + vim.keymap.set('n', 'gy', Api.fs.copy.absolute_path, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Copy Absolute Path', }) + vim.keymap.set('n', ']e', Api.node.navigate.diagnostics.next, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Next Diagnostic', }) + vim.keymap.set('n', ']c', Api.node.navigate.git.next, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Next Git', }) + vim.keymap.set('n', '[e', Api.node.navigate.diagnostics.prev, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Prev Diagnostic', }) + vim.keymap.set('n', '[c', Api.node.navigate.git.prev, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Prev Git', }) + vim.keymap.set('n', '-', Api.tree.change_root_to_parent, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Up', }) + vim.keymap.set('n', 's', Api.node.run.system, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Run System', }) + vim.keymap.set('n', 'f', Api.live_filter.start, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Filter', }) + vim.keymap.set('n', 'F', Api.live_filter.clear, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Clean Filter', }) + vim.keymap.set('n', 'q', Api.tree.close, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Close', }) + vim.keymap.set('n', 'W', Api.tree.collapse_all, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Collapse', }) + vim.keymap.set('n', 'E', Api.tree.expand_all, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Expand All', }) + vim.keymap.set('n', 'S', Api.tree.search_node, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Search', }) + vim.keymap.set('n', '.', Api.node.run.cmd, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Run Command', }) + vim.keymap.set('n', '', Api.node.show_info_popup, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Info', }) + vim.keymap.set('n', 'g?', Api.tree.toggle_help, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Help', }) + vim.keymap.set('n', 'm', Api.marks.toggle, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Toggle Bookmark', }) + vim.keymap.set('n', 'bmv', Api.marks.bulk.move, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Move Bookmarked', }) + end -- END_ON_ATTACH < ============================================================================== diff --git a/scripts/generate_default_keymaps.lua b/scripts/generate_default_keymaps.lua index 23ed0398374..81230316e4f 100644 --- a/scripts/generate_default_keymaps.lua +++ b/scripts/generate_default_keymaps.lua @@ -44,10 +44,9 @@ io.close(file) -- lua on_attach file = io.open("/tmp/DEFAULT_KEYMAPS.on_attach.lua", "w") io.output(file) -io.write "local Api = require('nvim-tree.api')\n\n" -io.write "local function on_attach(bufnr)\n" +io.write " local Api = require('nvim-tree.api')\n\n" fmt = string.format( - " vim.keymap.set('n', %%-%d.%ds %%-%d.%ds { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = '%%s', })\n", + " vim.keymap.set('n', %%-%d.%ds %%-%d.%ds { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = '%%s', })\n", max_key + 3, max_key + 3, max_callback + 1, @@ -59,5 +58,4 @@ for _, m in pairs(DEFAULT_KEYMAPS) do io.write(string.format(fmt, "'" .. key .. "',", m.callback .. ",", m.desc.short)) end end -io.write "end\n" io.close(file) diff --git a/scripts/generate_default_mappings.lua b/scripts/generate_default_mappings.lua deleted file mode 100644 index 70b3d54bccb..00000000000 --- a/scripts/generate_default_mappings.lua +++ /dev/null @@ -1,84 +0,0 @@ --- luacheck:ignore 113 ----@diagnostic disable: undefined-global - --- write DEFAULT_MAPPINGS in various formats - -local max_key_help = 0 -local max_key_lua = 0 -local max_action_help = 0 -local outs_help = {} -local outs_lua = {} - -for _, m in pairs(DEFAULT_MAPPINGS) do - local out - if type(m.key) == "table" then - local first = true - local keys_lua = "key = {" - for _, sub_key in pairs(m.key) do - -- lua - keys_lua = string.format('%s%s "%s"', keys_lua, first and "" or ",", sub_key) - - -- help - out = {} - if first then - out.action = m.action - out.desc = m.desc - first = false - else - out.action = "" - out.desc = "" - end - out.key = string.format("`%s`", sub_key) - max_action_help = math.max(#out.action, max_action_help) - max_key_help = math.max(#out.key, max_key_help) - table.insert(outs_help, out) - end - - -- lua - out = {} - out.key = string.format("%s },", keys_lua) - table.insert(outs_lua, out) - else - -- help - out = {} - out.action = m.action - out.desc = m.desc - out.key = string.format("`%s`", m.key) - table.insert(outs_help, out) - max_action_help = math.max(#out.action, max_action_help) - max_key_help = math.max(#out.key, max_key_help) - - -- lua - out = {} - out.key = string.format('key = "%s",', m.key) - table.insert(outs_lua, out) - end - - --lua - out.action = string.format('action = "%s"', m.action) - max_key_lua = math.max(#out.key, max_key_lua) -end - --- help -local file = io.open("/tmp/DEFAULT_MAPPINGS.help", "w") -io.output(file) -io.write "\n" -local fmt = string.format("%%-%d.%ds %%-%d.%ds %%s\n", max_key_help, max_key_help, max_action_help, max_action_help) -for _, m in pairs(outs_help) do - if m.action == "" then - io.write(string.format("%s\n", m.key)) - else - io.write(string.format(fmt, m.key, m.action, m.desc)) - end -end -io.write "\n" -io.close(file) - --- lua -file = io.open("/tmp/DEFAULT_MAPPINGS.lua", "w") -io.output(file) -fmt = string.format(" { %%-%d.%ds %%s },\n", max_key_lua, max_key_lua) -for _, m in pairs(outs_lua) do - io.write(string.format(fmt, m.key, m.action)) -end -io.close(file) diff --git a/scripts/update-help.sh b/scripts/update-help.sh index 8b284049192..3b59321c1e2 100755 --- a/scripts/update-help.sh +++ b/scripts/update-help.sh @@ -5,6 +5,9 @@ # run from repository root: scripts/update-default-opts.sh +# +# DEFAULT_OPTS +# begin="BEGIN_DEFAULT_OPTS" end="END_DEFAULT_OPTS" @@ -19,22 +22,26 @@ sed -i -e "/${begin}/,/${end}/{ /${begin}/{p; r /tmp/DEFAULT_OPTS.6.lua }; /${end}/p; d; }" doc/nvim-tree-lua.txt -begin="BEGIN_DEFAULT_MAPPINGS" -end="END_DEFAULT_MAPPINGS" +# +# DEFAULT_KEYMAPS +# -# generate various DEFAULT_MAPPINGS -sed -n -e "/${begin}/,/${end}/{ /${begin}/d; /${end}/d; p; }" lua/nvim-tree/actions/init.lua > /tmp/DEFAULT_MAPPINGS.M.lua -cat /tmp/DEFAULT_MAPPINGS.M.lua scripts/generate_default_mappings.lua | lua - -# help -sed -i -e "/${begin}/,/${end}/{ /${begin}/{p; r /tmp/DEFAULT_MAPPINGS.lua - }; /${end}/p; d }" doc/nvim-tree-lua.txt -sed -i -e "/^DEFAULT MAPPINGS/,/^>$/{ /^DEFAULT MAPPINGS/{p; r /tmp/DEFAULT_MAPPINGS.help - }; /^>$/p; d }" doc/nvim-tree-lua.txt - -# generate various DEFAULT_KEYMAPS begin="BEGIN_DEFAULT_KEYMAPS" end="END_DEFAULT_KEYMAPS" + +# scrape DEFAULT_KEYMAPS sed -n -e "/${begin}/,/${end}/{ /${begin}/d; /${end}/d; s/callback = \(.*\),/callback = '\1',/g; p; }" lua/nvim-tree/keymap.lua > /tmp/DEFAULT_KEYMAPS.M.lua + +# generate /tmp/DEFAULT_KEYMAPS.on_attach.lua and /tmp/DEFAULT_KEYMAPS.help cat /tmp/DEFAULT_KEYMAPS.M.lua scripts/generate_default_keymaps.lua | lua +# help on_attach +begin="BEGIN_ON_ATTACH" +end="END_ON_ATTACH" +sed -i -e "/${begin}/,/${end}/{ /${begin}/{p; r /tmp/DEFAULT_KEYMAPS.on_attach.lua + }; /${end}/p; d }" doc/nvim-tree-lua.txt + +# help human +sed -i -e "/^DEFAULT MAPPINGS/,/^>$/{ /^DEFAULT MAPPINGS/{p; r /tmp/DEFAULT_KEYMAPS.help + }; /^>$/p; d }" doc/nvim-tree-lua.txt + From c97c97b640bacc7d7a5ba70085585fc447d67af0 Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Mon, 5 Sep 2022 12:00:39 +1000 Subject: [PATCH 14/42] chore(mappings): generate on_attach from user's legacy mappings --- lua/nvim-tree/keymap.lua | 1 + lua/nvim-tree/legacy.lua | 113 +++++++++++++++++++++++---- scripts/generate_default_keymaps.lua | 10 +++ scripts/update-help.sh | 8 +- 4 files changed, 114 insertions(+), 18 deletions(-) diff --git a/lua/nvim-tree/keymap.lua b/lua/nvim-tree/keymap.lua index e72aaf0dc3a..fa1ca95be3e 100644 --- a/lua/nvim-tree/keymap.lua +++ b/lua/nvim-tree/keymap.lua @@ -422,6 +422,7 @@ local DEFAULT_KEYMAPS = { } -- END_DEFAULT_KEYMAPS +-- TODO fuzzy filtering of keys e.g. "" <-> "" to prevent two mappings being created function M.set_keymaps(bufnr) local opts = { noremap = true, silent = true, nowait = true, buffer = bufnr } for _, km in ipairs(M.keymaps) do diff --git a/lua/nvim-tree/legacy.lua b/lua/nvim-tree/legacy.lua index 66d155e9798..bc1110b952c 100644 --- a/lua/nvim-tree/legacy.lua +++ b/lua/nvim-tree/legacy.lua @@ -1,8 +1,62 @@ local utils = require "nvim-tree.utils" +local log = require "nvim-tree.log" local DEFAULT_KEYMAPS = require("nvim-tree.keymap").DEFAULT_KEYMAPS -local M = {} +local M = { + on_attach_lua = "", +} + +-- BEGIN_LEGACY_CALLBACKS +local LEGACY_CALLBACKS = { + edit = "Api.node.open.edit", + edit_in_place = "Api.node.open.replace_tree_buffer", + edit_no_picker = "Api.node.open.no_window_picker", + cd = "Api.tree.change_root_to_node", + vsplit = "Api.node.open.vertical", + split = "Api.node.open.horizontal", + tabnew = "Api.node.open.tab", + prev_sibling = "Api.node.navigate.sibling.prev", + next_sibling = "Api.node.navigate.sibling.next", + parent_node = "Api.node.navigate.parent", + close_node = "Api.node.navigate.parent_close", + preview = "Api.node.open.preview", + first_sibling = "Api.node.navigate.sibling.first", + last_sibling = "Api.node.navigate.sibling.last", + toggle_git_ignored = "Api.tree.toggle_gitignore_filter", + toggle_dotfiles = "Api.tree.toggle_hidden_filter", + toggle_custom = "Api.tree.toggle_custom_filter", + refresh = "Api.tree.reload", + create = "Api.fs.create", + remove = "Api.fs.remove", + trash = "Api.fs.trash", + rename = "Api.fs.rename", + full_rename = "Api.fs.rename_sub", + cut = "Api.fs.cut", + copy = "Api.fs.copy.node", + paste = "Api.fs.paste", + copy_name = "Api.fs.copy.filename", + copy_path = "Api.fs.copy.relative_path", + copy_absolute_path = "Api.fs.copy.absolute_path", + next_diag_item = "Api.node.navigate.diagnostics.next", + next_git_item = "Api.node.navigate.git.next", + prev_diag_item = "Api.node.navigate.diagnostics.prev", + prev_git_item = "Api.node.navigate.git.prev", + dir_up = "Api.tree.change_root_to_parent", + system_open = "Api.node.run.system", + live_filter = "Api.live_filter.start", + clear_live_filter = "Api.live_filter.clear", + close = "Api.tree.close", + collapse_all = "Api.tree.collapse_all", + expand_all = "Api.tree.expand_all", + search_node = "Api.tree.search_node", + run_file_command = "Api.node.run.cmd", + toggle_file_info = "Api.node.show_info_popup", + toggle_help = "Api.tree.toggle_help", + toggle_mark = "Api.marks.toggle", + bulk_move = "Api.marks.bulk.move", +} +-- END_LEGACY_CALLBACKS -- TODO update bit.ly/3vIpEOJ when adding a migration @@ -299,6 +353,46 @@ local function removed(opts) end end +local function build_on_attach(call_list) + if #call_list == 0 then + return nil + end + + M.on_attach_lua = "local Api = require('nvim-tree.api')\n\nlocal on_attach = function(bufnr)\n" + for _, el in pairs(call_list) do + if el.action_cb then + M.on_attach_lua = string.format("%s -- TODO action_cb\n", M.on_attach_lua) + elseif el.keymap then + M.on_attach_lua = string.format( + "%s vim.keymap.set('n', '%s', %s, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = '%s', })\n", + M.on_attach_lua, + el.key, + LEGACY_CALLBACKS[el.keymap.legacy_action], + el.keymap.desc.short + ) + end + end + M.on_attach_lua = string.format("%send\n", M.on_attach_lua) + log.raw("dev", "%s", M.on_attach_lua) + + return function(bufnr) + for _, el in pairs(call_list) do + if el.action_cb then + vim.keymap.set(el.mode or "n", el.key, function() + el.action_cb(require("nvim-tree.lib").get_node_at_cursor()) + end, { buffer = bufnr, remap = false, silent = true }) + elseif el.keymap then + vim.keymap.set( + el.mode or "n", + el.key, + el.keymap.callback, + { buffer = bufnr, remap = false, silent = true, desc = el.keymap.desc.short } + ) + end + end + end +end + function M.move_mappings_to_keymap(opts) if opts.on_attach == "disable" and opts.view and opts.view.mappings then local custom_only, list = opts.view.mappings.custom_only, opts.view.mappings.list @@ -312,22 +406,6 @@ function M.move_mappings_to_keymap(opts) opts.remove_keymaps = {} end local call_list = {} - opts.on_attach = function(bufnr) - for _, el in pairs(call_list) do - if el.action_cb then - vim.keymap.set(el.mode or "n", el.key, function() - el.action_cb(require("nvim-tree.lib").get_node_at_cursor()) - end, { buffer = bufnr, remap = false, silent = true }) - elseif el.keymap then - vim.keymap.set( - el.mode or "n", - el.key, - el.keymap.callback, - { buffer = bufnr, remap = false, silent = true, desc = el.keymap.desc.short } - ) - end - end - end for _, map in pairs(list) do local keys = type(map.key) == "table" and map.key or { map.key } local mode = map.mode or "n" @@ -353,6 +431,7 @@ function M.move_mappings_to_keymap(opts) end end end + opts.on_attach = build_on_attach(call_list) opts.view.mappings.list = nil end end diff --git a/scripts/generate_default_keymaps.lua b/scripts/generate_default_keymaps.lua index 81230316e4f..2e0befad27c 100644 --- a/scripts/generate_default_keymaps.lua +++ b/scripts/generate_default_keymaps.lua @@ -59,3 +59,13 @@ for _, m in pairs(DEFAULT_KEYMAPS) do end end io.close(file) + +-- legacy callback mappings +file = io.open("/tmp/LEGACY_CALLBACKS.lua", "w") +io.output(file) +io.write "local LEGACY_CALLBACKS = {\n" +for _, m in pairs(DEFAULT_KEYMAPS) do + io.write(string.format(' %s = "%s",\n', m.legacy_action, m.callback)) +end +io.write("}\n") +io.close(file) diff --git a/scripts/update-help.sh b/scripts/update-help.sh index 3b59321c1e2..6385f3d6931 100755 --- a/scripts/update-help.sh +++ b/scripts/update-help.sh @@ -32,9 +32,15 @@ end="END_DEFAULT_KEYMAPS" # scrape DEFAULT_KEYMAPS sed -n -e "/${begin}/,/${end}/{ /${begin}/d; /${end}/d; s/callback = \(.*\),/callback = '\1',/g; p; }" lua/nvim-tree/keymap.lua > /tmp/DEFAULT_KEYMAPS.M.lua -# generate /tmp/DEFAULT_KEYMAPS.on_attach.lua and /tmp/DEFAULT_KEYMAPS.help +# generate /tmp/DEFAULT_KEYMAPS.on_attach.lua, /tmp/DEFAULT_KEYMAPS.help and /tmp/LEGACY_CALLBACKS.lua cat /tmp/DEFAULT_KEYMAPS.M.lua scripts/generate_default_keymaps.lua | lua +# legacy.lua LEGACY_CALLBACKS +begin="BEGIN_LEGACY_CALLBACKS" +end="END_LEGACY_CALLBACKS" +sed -i -e "/${begin}/,/${end}/{ /${begin}/{p; r /tmp/LEGACY_CALLBACKS.lua + }; /${end}/p; d }" lua/nvim-tree/legacy.lua + # help on_attach begin="BEGIN_ON_ATTACH" end="END_ON_ATTACH" From b2cdee533e41fe94925185c96c7c094f7fe3389d Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Mon, 5 Sep 2022 13:44:44 +1000 Subject: [PATCH 15/42] chore(mappings): generate on_attach from user's legacy mappings --- lua/nvim-tree.lua | 1 + lua/nvim-tree/legacy.lua | 38 ++++++++++++++++++++++------ scripts/generate_default_keymaps.lua | 2 +- 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/lua/nvim-tree.lua b/lua/nvim-tree.lua index e4e011771a7..e70a2f3c30c 100644 --- a/lua/nvim-tree.lua +++ b/lua/nvim-tree.lua @@ -316,6 +316,7 @@ local function setup_vim_commands() api.nvim_create_user_command("NvimTreeCollapseKeepBuffers", function() collapse_all.fn(true) end, { bar = true }) + api.nvim_create_user_command("NvimTreeGenerateOnAttach", legacy.generate_on_attach, {}) end function M.change_dir(name) diff --git a/lua/nvim-tree/legacy.lua b/lua/nvim-tree/legacy.lua index bc1110b952c..fb5fd1c55dc 100644 --- a/lua/nvim-tree/legacy.lua +++ b/lua/nvim-tree/legacy.lua @@ -1,5 +1,5 @@ local utils = require "nvim-tree.utils" -local log = require "nvim-tree.log" +local open_file = require "nvim-tree.actions.node.open-file" local DEFAULT_KEYMAPS = require("nvim-tree.keymap").DEFAULT_KEYMAPS @@ -358,13 +358,23 @@ local function build_on_attach(call_list) return nil end - M.on_attach_lua = "local Api = require('nvim-tree.api')\n\nlocal on_attach = function(bufnr)\n" + M.on_attach_lua = [[ +local Api = require('nvim-tree.api') +local Lib = require('nvim-tree.lib') + +local on_attach = function(bufnr) +]] + for _, el in pairs(call_list) do if el.action_cb then - M.on_attach_lua = string.format("%s -- TODO action_cb\n", M.on_attach_lua) + M.on_attach_lua = string.format( + '%s vim.keymap.set("n", "%s", function()\n local node = Lib.get_node_at_cursor()\n -- my code\n end, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = "my description" })\n', + M.on_attach_lua, + el.key + ) elseif el.keymap then M.on_attach_lua = string.format( - "%s vim.keymap.set('n', '%s', %s, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = '%s', })\n", + "%s vim.keymap.set('n', '%s', %s, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = '%s' })\n", M.on_attach_lua, el.key, LEGACY_CALLBACKS[el.keymap.legacy_action], @@ -373,7 +383,6 @@ local function build_on_attach(call_list) end end M.on_attach_lua = string.format("%send\n", M.on_attach_lua) - log.raw("dev", "%s", M.on_attach_lua) return function(bufnr) for _, el in pairs(call_list) do @@ -401,7 +410,7 @@ function M.move_mappings_to_keymap(opts) opts.view.mappings.custom_only = nil end if list then - local keymap_by_action = utils.key_by(DEFAULT_KEYMAPS, "legacy_action") + local keymap_by_legacy_action = utils.key_by(DEFAULT_KEYMAPS, "legacy_action") if not custom_only then opts.remove_keymaps = {} end @@ -414,8 +423,8 @@ function M.move_mappings_to_keymap(opts) if map.action ~= "" then if map.action_cb then action_cb = map.action_cb - elseif keymap_by_action[map.action] then - keymap = keymap_by_action[map.action] + elseif keymap_by_legacy_action[map.action] then + keymap = keymap_by_legacy_action[map.action] end end @@ -437,6 +446,19 @@ function M.move_mappings_to_keymap(opts) end end +function M.generate_on_attach() + if #M.on_attach_lua > 0 then + local name = "/tmp/my_on_attach.lua" + local file = io.open(name, "w") + io.output(file) + io.write(M.on_attach_lua) + io.close(file) + open_file.fn("edit", name) + else + utils.notify.info "no custom mappings" + end +end + function M.migrate_legacy_options(opts) -- g: options local msg diff --git a/scripts/generate_default_keymaps.lua b/scripts/generate_default_keymaps.lua index 2e0befad27c..2d12fcfbfa5 100644 --- a/scripts/generate_default_keymaps.lua +++ b/scripts/generate_default_keymaps.lua @@ -67,5 +67,5 @@ io.write "local LEGACY_CALLBACKS = {\n" for _, m in pairs(DEFAULT_KEYMAPS) do io.write(string.format(' %s = "%s",\n', m.legacy_action, m.callback)) end -io.write("}\n") +io.write "}\n" io.close(file) From b36b7b4125f3f5c808db09975905e8dc6cfd446f Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Sun, 6 Nov 2022 16:11:02 +1100 Subject: [PATCH 16/42] chore(mappings): merge cleanup --- lua/nvim-tree.lua | 3 --- 1 file changed, 3 deletions(-) diff --git a/lua/nvim-tree.lua b/lua/nvim-tree.lua index f2597494f83..04ad405cbc2 100644 --- a/lua/nvim-tree.lua +++ b/lua/nvim-tree.lua @@ -65,9 +65,6 @@ function M.change_root(filepath, bufnr) change_dir.fn(vim.fn.fnamemodify(filepath, ":p:h")) end ----@deprecated -M.on_keypress = require("nvim-tree.actions.dispatch").dispatch - function M.toggle(find_file, no_focus, cwd, bang) if view.is_visible() then view.close() From 1978dc10786d7eeda5fa5e474415d901dfda80ef Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Sun, 27 Nov 2022 14:22:46 +1100 Subject: [PATCH 17/42] chore(mappings): use default mappings when on_attach not present, log legacy migration --- doc/nvim-tree-lua.txt | 27 +++++++++++++-------------- lua/nvim-tree.lua | 3 ++- lua/nvim-tree/legacy.lua | 22 ++++++++++++++-------- lua/nvim-tree/view.lua | 2 +- 4 files changed, 30 insertions(+), 24 deletions(-) diff --git a/doc/nvim-tree-lua.txt b/doc/nvim-tree-lua.txt index fe7406049e8..db6dc8d750a 100644 --- a/doc/nvim-tree-lua.txt +++ b/doc/nvim-tree-lua.txt @@ -625,23 +625,22 @@ performance. *nvim-tree.on_attach* Function ran when creating the nvim-tree buffer. This can be used to attach keybindings to the tree buffer. -When on_attach is "disabled", it will use the older mapping strategy, otherwise it -will use the newer one. -> - on_attach = function(bufnr) - local inject_node = require("nvim-tree.utils").inject_node - - vim.keymap.set("n", "n", inject_node(function(node) - if node then - print(node.absolute_path) - end - end), { buffer = bufnr, noremap = true }) +When on_attach is not a function, |nvim-tree.view.mappings| will be used. + Type: `function(bufnr)`, Default: `"disable"` - vim.bo[bufnr].path = "/tmp" + Example: > + local Api = require('nvim-tree.api') + local Lib = require('nvim-tree.lib') + + local my_on_attach = function(bufnr) + vim.keymap.set('n', '?', Api.tree.toggle_help, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Help' }) + vim.keymap.set('n', 'h', Api.tree.toggle_help, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Help' }) + vim.keymap.set("n", "", function() + local node = Lib.get_node_at_cursor() + print(node.absolute_path) + end, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = "my description" }) end < - Type: `function(bufnr)`, Default: `"disable"` - *nvim-tree.remove_keymaps* This can be used to remove the default mappings in the tree. - Remove specific keys by passing a `string` table of keys diff --git a/lua/nvim-tree.lua b/lua/nvim-tree.lua index 2dd3f67815e..348d47bf4a4 100644 --- a/lua/nvim-tree.lua +++ b/lua/nvim-tree.lua @@ -736,7 +736,6 @@ function M.setup(conf) validate_options(conf) local opts = merge_options(conf) - legacy.move_mappings_to_keymap(opts) local netrw_disabled = opts.disable_netrw or opts.hijack_netrw _config.root_dirs = opts.root_dirs @@ -758,6 +757,8 @@ function M.setup(conf) log.line("config", "default config + user") log.raw("config", "%s\n", vim.inspect(opts)) + legacy.move_mappings_to_keymap(opts) + require("nvim-tree.actions").setup(opts) require("nvim-tree.keymap").setup(opts) require("nvim-tree.colors").setup() diff --git a/lua/nvim-tree/legacy.lua b/lua/nvim-tree/legacy.lua index d2bbe759d95..4fdef7364ed 100644 --- a/lua/nvim-tree/legacy.lua +++ b/lua/nvim-tree/legacy.lua @@ -1,6 +1,7 @@ local utils = require "nvim-tree.utils" local notify = require "nvim-tree.notify" local open_file = require "nvim-tree.actions.node.open-file" +local log = require "nvim-tree.log" local DEFAULT_KEYMAPS = require("nvim-tree.keymap").DEFAULT_KEYMAPS @@ -380,21 +381,25 @@ local on_attach = function(bufnr) ]] for _, el in pairs(call_list) do + local vim_keymap_set if el.action_cb then - M.on_attach_lua = string.format( - '%s vim.keymap.set("n", "%s", function()\n local node = Lib.get_node_at_cursor()\n -- my code\n end, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = "my description" })\n', - M.on_attach_lua, + vim_keymap_set = string.format( + 'vim.keymap.set("n", "%s", function()\n local node = Lib.get_node_at_cursor()\n -- my code\n end, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = "my description" })', el.key ) elseif el.keymap then - M.on_attach_lua = string.format( - "%s vim.keymap.set('n', '%s', %s, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = '%s' })\n", - M.on_attach_lua, + vim_keymap_set = string.format( + "vim.keymap.set('n', '%s', %s, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = '%s' })", el.key, LEGACY_CALLBACKS[el.keymap.legacy_action], el.keymap.desc.short ) end + + if vim_keymap_set then + log.line("config", "generated %s", vim_keymap_set) + M.on_attach_lua = string.format("%s %s\n", M.on_attach_lua, vim_keymap_set) + end end M.on_attach_lua = string.format("%send\n", M.on_attach_lua) @@ -417,8 +422,9 @@ local on_attach = function(bufnr) end function M.move_mappings_to_keymap(opts) - if opts.on_attach == "disable" and opts.view and opts.view.mappings then + if type(opts.on_attach) ~= "function" and opts.view and opts.view.mappings then local custom_only, list = opts.view.mappings.custom_only, opts.view.mappings.list + log.line("config", "generating on_attach for %d legacy view.mappings.list:", #list) if custom_only then opts.remove_keymaps = true opts.view.mappings.custom_only = nil @@ -469,7 +475,7 @@ function M.generate_on_attach() io.close(file) open_file.fn("edit", name) else - utils.notify.info "no custom mappings" + notify.info "no custom mappings" end end diff --git a/lua/nvim-tree/view.lua b/lua/nvim-tree/view.lua index 72fb08550de..97d78e1c1a2 100644 --- a/lua/nvim-tree/view.lua +++ b/lua/nvim-tree/view.lua @@ -93,8 +93,8 @@ local function create_buffer(bufnr) vim.bo[M.get_bufnr()][option] = value end + require("nvim-tree.keymap").set_keymaps(M.get_bufnr()) if type(M.on_attach) == "function" then - require("nvim-tree.keymap").set_keymaps(M.get_bufnr()) M.on_attach(M.get_bufnr()) end end From da6fcd241f680f8f5ed853715484ce6c217be5b7 Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Sun, 11 Dec 2022 17:24:40 +1100 Subject: [PATCH 18/42] on_attach is default or user only, legacy and generation includes defaults (#1777) * chore(mappings): remove mappings via vim.keymap.del instead of filtering mappings, to allow for multiple ways of specifying a key * doc: specify that the terminal emulator must be configured to use the patched font * feat(renderer): add NvimTreeOpenedFolderIcon NvimTreeClosedFolderIcon (#1768) * feat: Add highlight group for opened folder closes #1674 * docs: Add NvimTreeOpenedFolderIcon default * feat: Add NvimTreeClosedFolderIcon highlight group Defaults to NvimTreeFolderIcon * feat: add diagnostics.show_on_open_dirs git.show_on_open_dirs (#1778) * feat(diagnostics): only show diagnostic on closed folder * feat(git): only show git icon on closed folder * docs: Update feature_request.md (#1788) * Update feature_request.md Closes #1654 * Update feature_request.md Co-authored-by: Alexander Courtis * 1786 git next prev land on dirs (#1787) * Filtered dir with git status that are open when show_on_open_dir is false * refactored for single source of truth of existence of git status on a node Putting `has_git_status()` in `explorer.common` because that's where node.status is constructed Or at least I think that's where it's constructed * 1786 semantic nit Co-authored-by: Alexander Courtis * fix(git): git rename not showing up for the renamed file (#1783) * fixed git rename not showing up for the renamed file * considered " -> " being a part of the filename Fixed -> pattern to escape - Fixed "\"" and "\\" in filename * using string.find(, , true) to match plain -> * Using -z and removed unnecessary logic * feat(view): always enable cursorline, users may change this behaviour via Event.TreeOpen (#1814) * Update view.lua * set cursorline to true * feat(event): dispatch Event.NodeRenamed on cut-paste (#1817) * feat(view): add filters.git_clean, filters.no_buffer (#1784) * feat(view): add filters.git_clean * feat(view): add filters.git_clean * feat(view): add filters.no_buffer * feat(view): filters.no_buffer misses unloaded, handles buffer in/out * feat(view): filters.no_buffer matches directories specifically * feat(view): filters.no_buffer clarify targets * feat: add placeholder filters.diagnostics_ok, refactor filters * feat(view): remove placeholder filters.diagnostics_ok * doc: consolidate and clarify :help examples * doc: format help * feat: paste and create always target closed folder, remove create_in_closed_folder (#1802) * Fix default for file creation in closed directories * Make paste in closed directories consistent with create * doc: clarify create_in_closed_folder * Remove create_in_closed_folder option * doc: clarify create_in_closed_folder removal message (whoops) Co-authored-by: Alexander Courtis * on_attach is user's or default, nothing else; legacy generated on_attach includes defaults Co-authored-by: baahrens Co-authored-by: Richard Li <38484873+chomosuke@users.noreply.github.com> Co-authored-by: gegoune <69750637+gegoune@users.noreply.github.com> Co-authored-by: rishabhjain9191 Co-authored-by: Anton <14187674+antosha417@users.noreply.github.com> Co-authored-by: Eric Haynes --- .github/ISSUE_TEMPLATE/feature_request.md | 4 + README.md | 2 +- doc/nvim-tree-lua.txt | 86 ++++++---- lua/nvim-tree.lua | 24 ++- lua/nvim-tree/actions/finders/search-node.lua | 4 +- lua/nvim-tree/actions/fs/copy-paste.lua | 5 +- lua/nvim-tree/actions/fs/create-file.lua | 4 +- lua/nvim-tree/actions/moves/item.lua | 3 +- lua/nvim-tree/actions/reloaders/reloaders.lua | 12 +- .../actions/tree-modifiers/toggles.lua | 10 ++ lua/nvim-tree/api.lua | 2 + lua/nvim-tree/colors.lua | 2 + lua/nvim-tree/diagnostics.lua | 3 +- lua/nvim-tree/explorer/common.lua | 20 ++- lua/nvim-tree/explorer/explore.lua | 11 +- lua/nvim-tree/explorer/filters.lua | 92 +++++++++-- lua/nvim-tree/explorer/reload.lua | 10 +- lua/nvim-tree/git/runner.lua | 26 ++- lua/nvim-tree/keymap.lua | 53 ++----- lua/nvim-tree/legacy.lua | 150 ++++++++++-------- lua/nvim-tree/renderer/builder.lua | 6 +- lua/nvim-tree/renderer/components/git.lua | 9 +- lua/nvim-tree/renderer/components/icons.lua | 2 +- lua/nvim-tree/view.lua | 7 +- 24 files changed, 342 insertions(+), 205 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 34caa89e72c..35429c937c7 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -9,6 +9,10 @@ assignees: '' **Is this a question?** Please start a new [Q&A discussion](https://github.com/nvim-tree/nvim-tree.lua/discussions/new) instead of raising a feature request. +**Can this functionality be implemented utilising API?** +nvim-tree exposes extensive API (see `:h nvim-tree-api`). Can it be used to achieve your goal? Is there a missing API that would make it possible? +Given stable status of nvim-tree it's preferred to add new API than new functionality. + **Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] diff --git a/README.md b/README.md index e1ff7a74c7d..cf778b4a584 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ Take a look at the [wiki](https://github.com/nvim-tree/nvim-tree.lua/wiki) for S [neovim >=0.7.0](https://github.com/neovim/neovim/wiki/Installing-Neovim) -[nvim-web-devicons](https://github.com/nvim-tree/nvim-web-devicons) is optional and used to display file icons. It requires a [patched font](https://www.nerdfonts.com/). +[nvim-web-devicons](https://github.com/nvim-tree/nvim-web-devicons) is optional and used to display file icons. It requires a [patched font](https://www.nerdfonts.com/). Your terminal emulator must be configured to use that font, usually "Hack Nerd Font" ## Install diff --git a/doc/nvim-tree-lua.txt b/doc/nvim-tree-lua.txt index db6dc8d750a..32ed5a6a02d 100644 --- a/doc/nvim-tree-lua.txt +++ b/doc/nvim-tree-lua.txt @@ -31,7 +31,9 @@ Features File Icons - https://github.com/nvim-tree/nvim-web-devicons is optional and used to display file icons. It requires a patched font: https://www.nerdfonts.com + https://github.com/nvim-tree/nvim-web-devicons is optional and used to display file icons. + It requires a patched font: https://www.nerdfonts.com + Your terminal emulator must be configured to use that font, usually "Hack Nerd Font"  should look like an open folder. @@ -169,7 +171,6 @@ Subsequent calls to setup will replace the previous configuration. > 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, @@ -290,10 +291,11 @@ Subsequent calls to setup will replace the previous configuration. diagnostics = { enable = false, show_on_dirs = false, + show_on_open_dirs = true, debounce_delay = 50, severity = { min = vim.diagnostic.severity.HINT, - max = vim.diagnostic.severity.ERROR + max = vim.diagnostic.severity.ERROR, }, icons = { hint = "", @@ -304,6 +306,8 @@ Subsequent calls to setup will replace the previous configuration. }, filters = { dotfiles = false, + git_clean = false, + no_buffer = false, custom = {}, exclude = {}, }, @@ -316,6 +320,7 @@ Subsequent calls to setup will replace the previous configuration. enable = true, ignore = true, show_on_dirs = true, + show_on_open_dirs = true, timeout = 400, }, actions = { @@ -430,11 +435,6 @@ in some scenarios (eg using vim startify). Reloads the explorer every time a buffer is written to. Type: `boolean`, Default: `true` -*nvim-tree.create_in_closed_folder* -Creating a file when the cursor is on a closed folder will set the -path to be inside the closed folder, otherwise the parent folder. - Type: `boolean`, Default: `false` - *nvim-tree.sort_by* Changes how files within the same directory are sorted. Can be one of `name`, `case_sensitive`, `modification_time`, `extension` or a @@ -555,6 +555,11 @@ Show LSP and COC diagnostics in the signcolumn Show diagnostic icons on parent directories. Type: `boolean`, Default: `false` + *nvim-tree.diagnostics.show_on_open_dirs* + Show diagnostics icons on directories that are open. + Only relevant when `diagnostics.show_on_dirs` is `true`. + Type: `boolean`, Default: `true` + *nvim-tree.diagnostics.icons* Icons for diagnostic severity. Type: `table`, Default: `{ hint = "", info = "", warning = "", error = "" }` @@ -586,6 +591,11 @@ Git integration with icons and colors. Show status icons of children when directory itself has no status icon. Type: `boolean`, Default: `true` + *nvim-tree.git.show_on_open_dirs* + Show status icons on directories that are open. + Only relevant when `git.show_on_dirs` is `true`. + Type: `boolean`, Default: `true` + *nvim-tree.git.timeout* Kills the git process after some time if it takes too long. Type: `number`, Default: `400` (ms) @@ -627,16 +637,14 @@ Function ran when creating the nvim-tree buffer. This can be used to attach keybindings to the tree buffer. When on_attach is not a function, |nvim-tree.view.mappings| will be used. Type: `function(bufnr)`, Default: `"disable"` + e.g. > + local api = require('nvim-tree.api') - Example: > - local Api = require('nvim-tree.api') - local Lib = require('nvim-tree.lib') - - local my_on_attach = function(bufnr) - vim.keymap.set('n', '?', Api.tree.toggle_help, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Help' }) - vim.keymap.set('n', 'h', Api.tree.toggle_help, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Help' }) + local function on_attach(bufnr) + vim.keymap.set('n', '?', api.tree.toggle_help, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Help' }) + vim.keymap.set('n', 'h', api.tree.toggle_help, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Help' }) vim.keymap.set("n", "", function() - local node = Lib.get_node_at_cursor() + local node = api.tree.get_node_under_cursor() print(node.absolute_path) end, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = "my description" }) end @@ -704,6 +712,7 @@ Window / buffer setup. *nvim-tree.view.mappings.custom_only* Will use only the provided user mappings and not the default otherwise, extends the default mappings with the provided user mappings. + Overrides |nvim-tree.remove_keymaps| Type: `boolean`, Default: `false` *nvim-tree.view.mappings.list* @@ -888,6 +897,19 @@ Filtering options. Toggle via the `toggle_dotfiles` action, default mapping `H`. Type: `boolean`, Default: `false` + *nvim-tree.filters.git_clean* + Do not show files with no git status. This will show ignored files when + |nvim-tree.git.ignore| is set, as they are effectively dirty. + Toggle via the `toggle_git_clean` action, default mapping `C`. + Type: `boolean`, Default: `false` + + *nvim-tree.filters.no_buffer* + Do not show files that have no listed buffer. + Toggle via the `toggle_no_buffer` action, default mapping `B`. + For performance reasons this may not immediately update on buffer + delete/wipe. A reload or filesystem event will result in an update. + Type: `boolean`, Default: `false` + *nvim-tree.filters.custom* Custom list of vim regex for file/directory names that will not be shown. Backslashes must be escaped e.g. "^\\.git". See |string-match|. @@ -1142,15 +1164,15 @@ A good functionality to enable is |nvim-tree.hijack_directories|. Nvim-tree's public API can be used to access features. > - local nt_api = require("nvim-tree.api") - - nt_api.tree.toggle() +e.g. > + local api = require("nvim-tree.api") + api.tree.toggle() < This module exposes stable functionalities, it is advised to use this in order to avoid breaking configurations due to internal breaking changes. The api is separated in multiple modules, which can be accessed with -`require("nvim-tree.api").moduleName.functionality`. +`api..` Functions that needs a tree node parameter are exposed with an abstraction that injects the node from the cursor position in the tree when calling @@ -1173,6 +1195,8 @@ exists. - collapse_all `(keep_buffers?: bool)` - expand_all - toggle_gitignore_filter + - toggle_git_clean_filter + - toggle_no_buffer_filter - toggle_custom_filter - toggle_hidden_filter - toggle_help @@ -1294,7 +1318,7 @@ DEFAULT MAPPINGS *nvim-tree-default-mappings `O` Open: No Window Picker Open file with no window picker. `` CD cd in the directory under the cursor. `<2-RightMouse>` -`` Open: Vertical Split Open file in a vertical split. +`` Open: Vertical Split Open file in a vertical split. `` Open: Horizontal Split Open file in a horizontal split. `` Open: New Tab Open file in a new tab. `<` Previous Sibling Navigate to the previous sibling. @@ -1348,7 +1372,7 @@ DEFAULT MAPPINGS *nvim-tree-default-mappings vim.keymap.set('n', 'O', Api.node.open.no_window_picker, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Open: No Window Picker', }) vim.keymap.set('n', '', Api.tree.change_root_to_node, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'CD', }) vim.keymap.set('n', '<2-RightMouse>', Api.tree.change_root_to_node, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'CD', }) - vim.keymap.set('n', '', Api.node.open.vertical, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Open: Vertical Split', }) + vim.keymap.set('n', '', Api.node.open.vertical, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Open: Vertical Split', }) vim.keymap.set('n', '', Api.node.open.horizontal, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Open: Horizontal Split', }) vim.keymap.set('n', '', Api.node.open.tab, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Open: New Tab', }) vim.keymap.set('n', '<', Api.node.navigate.sibling.prev, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Previous Sibling', }) @@ -1416,6 +1440,8 @@ NvimTreeSymlink NvimTreeFolderName (Directory) NvimTreeRootFolder NvimTreeFolderIcon +NvimTreeOpenedFolderIcon (NvimTreeFolderIcon) +NvimTreeClosedFolderIcon (NvimTreeFolderIcon) NvimTreeFileIcon NvimTreeEmptyFolderName (Directory) NvimTreeOpenedFolderName (Directory) @@ -1487,27 +1513,19 @@ to |nvim_tree_registering_handlers| for more information. |nvim_tree_registering_handlers| -Handlers are registered by calling the `events.subscribe` function available in the -`require("nvim-tree.api")` module. +Handlers are registered by calling |nvim-tree-api| `events.subscribe` +function with an `events.Event` kind. -For example, registering a handler for when a node is renamed is done like this: -> - local api = require('nvim-tree.api') +e.g. handler for node renamed: > + local api = require("nvim-tree.api") local Event = api.events.Event api.events.subscribe(Event.NodeRenamed, function(data) print("Node renamed from " .. data.old_name .. " to " .. data.new_name) end) < - |nvim_tree_events_kind| -You can access the event enum with: -> - local Event = require('nvim-tree.api').events.Event -< -Here is the list of available variant of this enum: - - Event.Ready When NvimTree has been initialized • Note: Handler takes no parameter. diff --git a/lua/nvim-tree.lua b/lua/nvim-tree.lua index 348d47bf4a4..63448afb87c 100644 --- a/lua/nvim-tree.lua +++ b/lua/nvim-tree.lua @@ -11,6 +11,7 @@ local reloaders = require "nvim-tree.actions.reloaders.reloaders" local copy_paste = require "nvim-tree.actions.fs.copy-paste" local collapse_all = require "nvim-tree.actions.tree-modifiers.collapse-all" local git = require "nvim-tree.git" +local filters = require "nvim-tree.explorer.filters" local _config = {} @@ -351,6 +352,22 @@ local function setup_autocommands(opts) create_nvim_tree_autocmd("BufWritePost", { callback = reloaders.reload_explorer }) end + create_nvim_tree_autocmd("BufReadPost", { + callback = function() + if filters.config.filter_no_buffer then + reloaders.reload_explorer() + end + end, + }) + + create_nvim_tree_autocmd("BufUnload", { + callback = function(data) + if filters.config.filter_no_buffer then + reloaders.reload_explorer(nil, data.buf) + end + end, + }) + if not has_watchers and opts.git.enable then create_nvim_tree_autocmd("User", { pattern = { "FugitiveChanged", "NeogitStatusRefreshed" }, @@ -445,7 +462,6 @@ end local DEFAULT_OPTS = { -- BEGIN_DEFAULT_OPTS auto_reload_on_write = true, - create_in_closed_folder = false, disable_netrw = false, hijack_cursor = false, hijack_netrw = true, @@ -566,6 +582,7 @@ local DEFAULT_OPTS = { -- BEGIN_DEFAULT_OPTS diagnostics = { enable = false, show_on_dirs = false, + show_on_open_dirs = true, debounce_delay = 50, severity = { min = vim.diagnostic.severity.HINT, @@ -580,6 +597,8 @@ local DEFAULT_OPTS = { -- BEGIN_DEFAULT_OPTS }, filters = { dotfiles = false, + git_clean = false, + no_buffer = false, custom = {}, exclude = {}, }, @@ -592,6 +611,7 @@ local DEFAULT_OPTS = { -- BEGIN_DEFAULT_OPTS enable = true, ignore = true, show_on_dirs = true, + show_on_open_dirs = true, timeout = 400, }, actions = { @@ -757,7 +777,7 @@ function M.setup(conf) log.line("config", "default config + user") log.raw("config", "%s\n", vim.inspect(opts)) - legacy.move_mappings_to_keymap(opts) + legacy.generate_legacy_on_attach(opts) require("nvim-tree.actions").setup(opts) require("nvim-tree.keymap").setup(opts) diff --git a/lua/nvim-tree/actions/finders/search-node.lua b/lua/nvim-tree/actions/finders/search-node.lua index 66fb5a3cfa5..23cb1c68543 100644 --- a/lua/nvim-tree/actions/finders/search-node.lua +++ b/lua/nvim-tree/actions/finders/search-node.lua @@ -14,6 +14,8 @@ local function search(search_dir, input_path) local function iter(dir) local realpath, path, name, stat, handle, _ + local filter_status = filters.prepare() + handle, _ = vim.loop.fs_scandir(dir) if not handle then return @@ -34,7 +36,7 @@ local function search(search_dir, input_path) break end - if not filters.should_ignore(path) then + if not filters.should_filter(path, filter_status) then if string.find(path, "/" .. input_path .. "$") then return path end diff --git a/lua/nvim-tree/actions/fs/copy-paste.lua b/lua/nvim-tree/actions/fs/copy-paste.lua index c5cd5e2acd3..ffcbd4133f9 100644 --- a/lua/nvim-tree/actions/fs/copy-paste.lua +++ b/lua/nvim-tree/actions/fs/copy-paste.lua @@ -2,6 +2,7 @@ local lib = require "nvim-tree.lib" local log = require "nvim-tree.log" local utils = require "nvim-tree.utils" local core = require "nvim-tree.core" +local events = require "nvim-tree.events" local notify = require "nvim-tree.notify" local M = {} @@ -160,11 +161,8 @@ local function do_paste(node, action_type, action_fn) return end local is_dir = stats and stats.type == "directory" - if not is_dir then destination = vim.fn.fnamemodify(destination, ":p:h") - elseif not node.open then - destination = vim.fn.fnamemodify(destination, ":p:h:h") end for _, _node in ipairs(clip) do @@ -192,6 +190,7 @@ local function do_cut(source, destination) return false, errmsg end utils.rename_loaded_buffers(source, destination) + events._dispatch_node_renamed(source, destination) return true end diff --git a/lua/nvim-tree/actions/fs/create-file.lua b/lua/nvim-tree/actions/fs/create-file.lua index 35ec267d77d..c970eeddab5 100644 --- a/lua/nvim-tree/actions/fs/create-file.lua +++ b/lua/nvim-tree/actions/fs/create-file.lua @@ -42,8 +42,7 @@ local function get_num_nodes(iter) end local function get_containing_folder(node) - local is_open = M.create_in_closed_folder or node.open - if node.nodes ~= nil and is_open then + if node.nodes ~= nil then return utils.path_add_trailing(node.absolute_path) end local node_name_size = #(node.name or "") @@ -113,7 +112,6 @@ function M.fn(node) end function M.setup(opts) - M.create_in_closed_folder = opts.create_in_closed_folder M.enable_reload = not opts.filesystem_watchers.enable end diff --git a/lua/nvim-tree/actions/moves/item.lua b/lua/nvim-tree/actions/moves/item.lua index 3eb74b807a2..b5646193346 100644 --- a/lua/nvim-tree/actions/moves/item.lua +++ b/lua/nvim-tree/actions/moves/item.lua @@ -2,6 +2,7 @@ local utils = require "nvim-tree.utils" local view = require "nvim-tree.view" local core = require "nvim-tree.core" local lib = require "nvim-tree.lib" +local explorer_common = require "nvim-tree.explorer.common" local M = {} @@ -14,7 +15,7 @@ function M.fn(where, what) for line, node in pairs(nodes_by_line) do local valid = false if what == "git" then - valid = node.git_status ~= nil + valid = explorer_common.shows_git_status(node) elseif what == "diag" then valid = node.diag_status ~= nil end diff --git a/lua/nvim-tree/actions/reloaders/reloaders.lua b/lua/nvim-tree/actions/reloaders/reloaders.lua index c2b403a6954..7fca29068d1 100644 --- a/lua/nvim-tree/actions/reloaders/reloaders.lua +++ b/lua/nvim-tree/actions/reloaders/reloaders.lua @@ -6,13 +6,13 @@ local core = require "nvim-tree.core" local M = {} -local function refresh_nodes(node, projects) +local function refresh_nodes(node, projects, unloaded_bufnr) local cwd = node.cwd or node.link_to or node.absolute_path local project_root = git.get_project_root(cwd) - explorer_module.reload(node, projects[project_root] or {}) + explorer_module.reload(node, projects[project_root] or {}, unloaded_bufnr) for _, _node in ipairs(node.nodes) do if _node.nodes and _node.open then - refresh_nodes(_node, projects) + refresh_nodes(_node, projects, unloaded_bufnr) end end end @@ -33,14 +33,16 @@ function M.reload_node_status(parent_node, projects) end local event_running = false -function M.reload_explorer() +---@param _ table unused node passed by action +---@param unloaded_bufnr number optional bufnr recently unloaded via BufUnload event +function M.reload_explorer(_, unloaded_bufnr) if event_running or not core.get_explorer() or vim.v.exiting ~= vim.NIL then return end event_running = true local projects = git.reload() - refresh_nodes(core.get_explorer(), projects) + refresh_nodes(core.get_explorer(), projects, unloaded_bufnr) if view.is_visible() then renderer.draw() end diff --git a/lua/nvim-tree/actions/tree-modifiers/toggles.lua b/lua/nvim-tree/actions/tree-modifiers/toggles.lua index 63c9e07c66c..e56d1b37409 100644 --- a/lua/nvim-tree/actions/tree-modifiers/toggles.lua +++ b/lua/nvim-tree/actions/tree-modifiers/toggles.lua @@ -15,6 +15,16 @@ function M.git_ignored() return reloaders.reload_explorer() end +function M.git_clean() + filters.config.filter_git_clean = not filters.config.filter_git_clean + return reloaders.reload_explorer() +end + +function M.no_buffer() + filters.config.filter_no_buffer = not filters.config.filter_no_buffer + return reloaders.reload_explorer() +end + function M.dotfiles() filters.config.filter_dotfiles = not filters.config.filter_dotfiles return reloaders.reload_explorer() diff --git a/lua/nvim-tree/api.lua b/lua/nvim-tree/api.lua index 91dbc3e03ed..13ef4b3e743 100644 --- a/lua/nvim-tree/api.lua +++ b/lua/nvim-tree/api.lua @@ -46,6 +46,8 @@ Api.tree.search_node = require("nvim-tree.actions.finders.search-node").fn Api.tree.collapse_all = require("nvim-tree.actions.tree-modifiers.collapse-all").fn Api.tree.expand_all = inject_node(require("nvim-tree.actions.tree-modifiers.expand-all").fn) Api.tree.toggle_gitignore_filter = require("nvim-tree.actions.tree-modifiers.toggles").git_ignored +Api.tree.toggle_git_clean_filter = require("nvim-tree.actions.tree-modifiers.toggles").git_clean +Api.tree.toggle_no_buffer_filter = require("nvim-tree.actions.tree-modifiers.toggles").no_buffer Api.tree.toggle_custom_filter = require("nvim-tree.actions.tree-modifiers.toggles").custom Api.tree.toggle_hidden_filter = require("nvim-tree.actions.tree-modifiers.toggles").dotfiles Api.tree.toggle_help = require("nvim-tree.actions.tree-modifiers.toggles").help diff --git a/lua/nvim-tree/colors.lua b/lua/nvim-tree/colors.lua index 6e6a98d1807..33af05c0e5e 100644 --- a/lua/nvim-tree/colors.lua +++ b/lua/nvim-tree/colors.lua @@ -61,6 +61,8 @@ local function get_links() FolderName = "Directory", EmptyFolderName = "Directory", OpenedFolderName = "Directory", + OpenedFolderIcon = "NvimTreeFolderIcon", + ClosedFolderIcon = "NvimTreeFolderIcon", Normal = "Normal", NormalNC = "NvimTreeNormal", EndOfBuffer = "EndOfBuffer", diff --git a/lua/nvim-tree/diagnostics.lua b/lua/nvim-tree/diagnostics.lua index 5337c2c1ffa..3771779def3 100644 --- a/lua/nvim-tree/diagnostics.lua +++ b/lua/nvim-tree/diagnostics.lua @@ -114,7 +114,7 @@ function M.update() for line, node in pairs(nodes_by_line) do local nodepath = utils.canonical_path(node.absolute_path) log.line("diagnostics", " %d checking nodepath '%s'", line, nodepath) - if M.show_on_dirs and vim.startswith(bufpath, nodepath) then + if M.show_on_dirs and vim.startswith(bufpath, nodepath) and (not node.open or M.show_on_open_dirs) then log.line("diagnostics", " matched fold node '%s'", node.absolute_path) node.diag_status = severity add_sign(line, severity) @@ -147,6 +147,7 @@ function M.setup(opts) end M.show_on_dirs = opts.diagnostics.show_on_dirs + M.show_on_open_dirs = opts.diagnostics.show_on_open_dirs vim.fn.sign_define(sign_names[1][1], { text = opts.diagnostics.icons.error, texthl = sign_names[1][2] }) vim.fn.sign_define(sign_names[2][1], { text = opts.diagnostics.icons.warning, texthl = sign_names[2][2] }) vim.fn.sign_define(sign_names[3][1], { text = opts.diagnostics.icons.info, texthl = sign_names[3][2] }) diff --git a/lua/nvim-tree/explorer/common.lua b/lua/nvim-tree/explorer/common.lua index c3bed863e1a..71eae8af608 100644 --- a/lua/nvim-tree/explorer/common.lua +++ b/lua/nvim-tree/explorer/common.lua @@ -10,9 +10,7 @@ local function get_dir_git_status(parent_ignored, status, absolute_path) return file_status end - if M.config.git.show_on_dirs then - return status.dirs and status.dirs[absolute_path] - end + return status.dirs and status.dirs[absolute_path] end local function get_git_status(parent_ignored, status, absolute_path) @@ -41,6 +39,22 @@ function M.update_git_status(node, parent_ignored, status) end end +function M.shows_git_status(node) + if not node.git_status then + -- status doesn't exist + return false + elseif not node.nodes then + -- status exist and is a file + return true + elseif not node.open then + -- status exist, is a closed dir + return M.config.git.show_on_dirs + else + -- status exist, is a open dir + return M.config.git.show_on_dirs and M.config.git.show_on_open_dirs + end +end + function M.node_destroy(node) if not node then return diff --git a/lua/nvim-tree/explorer/explore.lua b/lua/nvim-tree/explorer/explore.lua index 16c6fac81e4..da0803c8419 100644 --- a/lua/nvim-tree/explorer/explore.lua +++ b/lua/nvim-tree/explorer/explore.lua @@ -12,9 +12,10 @@ local function get_type_from(type_, cwd) return type_ or (vim.loop.fs_stat(cwd) or {}).type end -local function populate_children(handle, cwd, node, status) +local function populate_children(handle, cwd, node, git_status) local node_ignored = node.git_status == "!!" local nodes_by_path = utils.bool_record(node.nodes, "absolute_path") + local filter_status = filters.prepare(git_status) while true do local name, t = vim.loop.fs_scandir_next(handle) if not name then @@ -23,11 +24,7 @@ local function populate_children(handle, cwd, node, status) local abs = utils.path_join { cwd, name } t = get_type_from(t, abs) - if - not filters.should_ignore(abs) - and not filters.should_ignore_git(abs, status.files) - and not nodes_by_path[abs] - then + if not filters.should_filter(abs, filter_status) and not nodes_by_path[abs] then local child = nil if t == "directory" and vim.loop.fs_access(abs, "R") then child = builders.folder(node, abs, name) @@ -42,7 +39,7 @@ local function populate_children(handle, cwd, node, status) if child then table.insert(node.nodes, child) nodes_by_path[child.absolute_path] = true - common.update_git_status(child, node_ignored, status) + common.update_git_status(child, node_ignored, git_status) end end end diff --git a/lua/nvim-tree/explorer/filters.lua b/lua/nvim-tree/explorer/filters.lua index e26095f2ec3..c5701deaacd 100644 --- a/lua/nvim-tree/explorer/filters.lua +++ b/lua/nvim-tree/explorer/filters.lua @@ -14,26 +14,63 @@ local function is_excluded(path) return false end ----Check if the given path should be ignored. +---Check if the given path is git clean/ignored ---@param path string Absolute path +---@param git_status table from prepare ---@return boolean -function M.should_ignore(path) - local basename = utils.path_basename(path) +local function git(path, git_status) + if type(git_status) ~= "table" or type(git_status.files) ~= "table" or type(git_status.dirs) ~= "table" then + return false + end - if is_excluded(path) then + -- default status to clean + local status = git_status.files[path] or git_status.dirs[path] or " " + + -- filter ignored; overrides clean as they are effectively dirty + if M.config.filter_git_ignored and status == "!!" then + return true + end + + -- filter clean + if M.config.filter_git_clean and status == " " then + return true + end + + return false +end + +---Check if the given path has no listed buffer +---@param path string Absolute path +---@param bufinfo table vim.fn.getbufinfo { buflisted = 1 } +---@param unloaded_bufnr number optional bufnr recently unloaded via BufUnload event +---@return boolean +local function buf(path, bufinfo, unloaded_bufnr) + if not M.config.filter_no_buffer or type(bufinfo) ~= "table" then return false end - if M.config.filter_dotfiles then - if basename:sub(1, 1) == "." then - return true + -- filter files with no open buffer and directories containing no open buffers + for _, b in ipairs(bufinfo) do + if b.name == path or b.name:find(path .. "/", 1, true) and b.bufnr ~= unloaded_bufnr then + return false end end + return true +end + +local function dotfile(path) + return M.config.filter_dotfiles and utils.path_basename(path):sub(1, 1) == "." +end + +local function custom(path) if not M.config.filter_custom then return false end + local basename = utils.path_basename(path) + + -- filter custom regexes local relpath = utils.path_relative(path, vim.loop.cwd()) for pat, _ in pairs(M.ignore_list) do if vim.fn.match(relpath, pat) ~= -1 or vim.fn.match(basename, pat) ~= -1 then @@ -51,10 +88,41 @@ function M.should_ignore(path) return false end -function M.should_ignore_git(path, status) - return M.config.filter_git_ignored - and (M.config.filter_git_ignored and status and status[path] == "!!") - and not is_excluded(path) +---Prepare arguments for should_filter. This is done prior to should_filter for efficiency reasons. +---@param git_status table results of git.load_project_status(...) +---@param unloaded_bufnr number optional bufnr recently unloaded via BufUnload event +---@return table +--- git_status: reference +--- unloaded_bufnr: copy +--- bufinfo: empty unless no_buffer set: vim.fn.getbufinfo { buflisted = 1 } +function M.prepare(git_status, unloaded_bufnr) + local status = { + git_status = git_status or {}, + unloaded_bufnr = unloaded_bufnr, + bufinfo = {}, + } + + if M.config.filter_no_buffer then + status.bufinfo = vim.fn.getbufinfo { buflisted = 1 } + end + + return status +end + +---Check if the given path should be filtered. +---@param path string Absolute path +---@param status table from prepare +---@return boolean +function M.should_filter(path, status) + -- exclusions override all filters + if is_excluded(path) then + return false + end + + return git(path, status.git_status) + or buf(path, status.bufinfo, status.unloaded_bufnr) + or dotfile(path) + or custom(path) end function M.setup(opts) @@ -62,6 +130,8 @@ function M.setup(opts) filter_custom = true, filter_dotfiles = opts.filters.dotfiles, filter_git_ignored = opts.git.ignore, + filter_git_clean = opts.filters.git_clean, + filter_no_buffer = opts.filters.no_buffer, } M.ignore_list = {} diff --git a/lua/nvim-tree/explorer/reload.lua b/lua/nvim-tree/explorer/reload.lua index 315bf34b61c..8f1a3384153 100644 --- a/lua/nvim-tree/explorer/reload.lua +++ b/lua/nvim-tree/explorer/reload.lua @@ -34,7 +34,7 @@ local function update_parent_statuses(node, project, root) end end -function M.reload(node, status) +function M.reload(node, git_status, unloaded_bufnr) local cwd = node.link_to or node.absolute_path local handle = vim.loop.fs_scandir(cwd) if type(handle) == "string" then @@ -44,6 +44,8 @@ function M.reload(node, status) local ps = log.profile_start("reload %s", node.absolute_path) + local filter_status = filters.prepare(git_status, unloaded_bufnr) + if node.group_next then node.nodes = { node.group_next } node.group_next = nil @@ -71,7 +73,7 @@ function M.reload(node, status) local abs = utils.path_join { cwd, name } t = t or (fs_stat_cached(abs) or {}).type - if not filters.should_ignore(abs) and not filters.should_ignore_git(abs, status.files) then + if not filters.should_filter(abs, filter_status) then child_names[abs] = true -- Recreate node if type changes. @@ -112,7 +114,7 @@ function M.reload(node, status) end node.nodes = vim.tbl_map( - update_status(nodes_by_path, node_ignored, status), + update_status(nodes_by_path, node_ignored, git_status), vim.tbl_filter(function(n) if child_names[n.absolute_path] then return child_names[n.absolute_path] @@ -127,7 +129,7 @@ function M.reload(node, status) local child_folder_only = common.has_one_child_folder(node) and node.nodes[1] if M.config.group_empty and not is_root and child_folder_only then node.group_next = child_folder_only - local ns = M.reload(child_folder_only, status) + local ns = M.reload(child_folder_only, git_status) node.nodes = ns or {} log.profile_end(ps, "reload %s", node.absolute_path) return ns diff --git a/lua/nvim-tree/git/runner.lua b/lua/nvim-tree/git/runner.lua index 686b5f80bd5..a03c72e4bca 100644 --- a/lua/nvim-tree/git/runner.lua +++ b/lua/nvim-tree/git/runner.lua @@ -4,10 +4,7 @@ local utils = require "nvim-tree.utils" local Runner = {} Runner.__index = Runner -function Runner:_parse_status_output(line) - local status = line:sub(1, 2) - -- removing `"` when git is returning special file status containing spaces - local path = line:sub(4, -2):gsub('^"', ""):gsub('"$', "") +function Runner:_parse_status_output(status, path) -- replacing slashes if on windows if vim.fn.has "win32" == 1 then path = path:gsub("/", "\\") @@ -15,15 +12,26 @@ function Runner:_parse_status_output(line) if #status > 0 and #path > 0 then self.output[utils.path_remove_trailing(utils.path_join { self.project_root, path })] = status end - return #line end function Runner:_handle_incoming_data(prev_output, incoming) if incoming and utils.str_find(incoming, "\n") then local prev = prev_output .. incoming local i = 1 + local skip_next_line = false for line in prev:gmatch "[^\n]*\n" do - i = i + self:_parse_status_output(line) + if skip_next_line then + skip_next_line = false + else + local status = line:sub(1, 2) + local path = line:sub(4, -2) + if utils.str_find(status, "R") then + -- skip next line if it is a rename entry + skip_next_line = true + end + self:_parse_status_output(status, path) + end + i = i + #line end return prev:sub(i, -1) @@ -44,7 +52,7 @@ function Runner:_getopts(stdout_handle, stderr_handle) local untracked = self.list_untracked and "-u" or nil local ignored = (self.list_untracked and self.list_ignored) and "--ignored=matching" or "--ignored=no" return { - args = { "--no-optional-locks", "status", "--porcelain=v1", ignored, untracked, self.path }, + args = { "--no-optional-locks", "status", "--porcelain=v1", "-z", ignored, untracked, self.path }, cwd = self.project_root, stdio = { nil, stdout_handle, stderr_handle }, } @@ -106,6 +114,9 @@ function Runner:_run_git_job() if err then return end + if data then + data = data:gsub("%z", "\n") + end self:_log_raw_output(data) output_leftover = self:_handle_incoming_data(output_leftover, data) end @@ -122,6 +133,7 @@ function Runner:_wait() local function is_done() return self.rc ~= nil end + while not vim.wait(30, is_done) do end end diff --git a/lua/nvim-tree/keymap.lua b/lua/nvim-tree/keymap.lua index fa1ca95be3e..642e97ef72b 100644 --- a/lua/nvim-tree/keymap.lua +++ b/lua/nvim-tree/keymap.lua @@ -41,8 +41,7 @@ local DEFAULT_KEYMAPS = { legacy_action = "cd", }, { - -- key = "", - key = "", + key = "", callback = Api.node.open.vertical, desc = { long = "Open file in a vertical split.", @@ -422,10 +421,10 @@ local DEFAULT_KEYMAPS = { } -- END_DEFAULT_KEYMAPS --- TODO fuzzy filtering of keys e.g. "" <-> "" to prevent two mappings being created -function M.set_keymaps(bufnr) +function M.on_attach_default(bufnr) local opts = { noremap = true, silent = true, nowait = true, buffer = bufnr } - for _, km in ipairs(M.keymaps) do + + for _, km in ipairs(M.DEFAULT_KEYMAPS) do local keys = type(km.key) == "table" and km.key or { km.key } for _, key in ipairs(keys) do opts.desc = km.desc.short @@ -434,46 +433,16 @@ function M.set_keymaps(bufnr) end end -local function filter_default_mappings(keys_to_disable) - local new_map = {} - for _, m in pairs(DEFAULT_KEYMAPS) do - local keys = type(m.key) == "table" and m.key or { m.key } - local reminding_keys = {} - for _, key in pairs(keys) do - local found = false - for _, key_to_disable in pairs(keys_to_disable) do - if key_to_disable == key then - found = true - break - end - end - if not found then - table.insert(reminding_keys, key) - end - end - if #reminding_keys > 0 then - local map = vim.deepcopy(m) - map.key = reminding_keys - table.insert(new_map, map) - end - end - return new_map -end - -local function get_keymaps(keys_to_disable) - if keys_to_disable == true then - return {} +function M.setup(opts) + if type(opts.on_attach) == "function" then + M.on_attach = opts.on_attach + else + M.on_attach = M.on_attach_default end - if type(keys_to_disable) == "table" and #keys_to_disable > 0 then - return filter_default_mappings(keys_to_disable) + if type(opts.remove_keymaps) == "table" then + M.remove_keys = opts.remove_keymaps end - - return DEFAULT_KEYMAPS -end - -function M.setup(opts) - M.keymaps = get_keymaps(opts.remove_keymaps) end M.DEFAULT_KEYMAPS = DEFAULT_KEYMAPS diff --git a/lua/nvim-tree/legacy.lua b/lua/nvim-tree/legacy.lua index 4fdef7364ed..e23a8cb58fc 100644 --- a/lua/nvim-tree/legacy.lua +++ b/lua/nvim-tree/legacy.lua @@ -1,62 +1,62 @@ local utils = require "nvim-tree.utils" local notify = require "nvim-tree.notify" local open_file = require "nvim-tree.actions.node.open-file" +local keymap = require "nvim-tree.keymap" local log = require "nvim-tree.log" -local DEFAULT_KEYMAPS = require("nvim-tree.keymap").DEFAULT_KEYMAPS - local M = { on_attach_lua = "", } -- BEGIN_LEGACY_CALLBACKS local LEGACY_CALLBACKS = { - edit = "Api.node.open.edit", - edit_in_place = "Api.node.open.replace_tree_buffer", - edit_no_picker = "Api.node.open.no_window_picker", - cd = "Api.tree.change_root_to_node", - vsplit = "Api.node.open.vertical", - split = "Api.node.open.horizontal", - tabnew = "Api.node.open.tab", - prev_sibling = "Api.node.navigate.sibling.prev", - next_sibling = "Api.node.navigate.sibling.next", - parent_node = "Api.node.navigate.parent", - close_node = "Api.node.navigate.parent_close", - preview = "Api.node.open.preview", - first_sibling = "Api.node.navigate.sibling.first", - last_sibling = "Api.node.navigate.sibling.last", - toggle_git_ignored = "Api.tree.toggle_gitignore_filter", - toggle_dotfiles = "Api.tree.toggle_hidden_filter", - toggle_custom = "Api.tree.toggle_custom_filter", - refresh = "Api.tree.reload", - create = "Api.fs.create", - remove = "Api.fs.remove", - trash = "Api.fs.trash", - rename = "Api.fs.rename", - full_rename = "Api.fs.rename_sub", - cut = "Api.fs.cut", - copy = "Api.fs.copy.node", - paste = "Api.fs.paste", - copy_name = "Api.fs.copy.filename", - copy_path = "Api.fs.copy.relative_path", - copy_absolute_path = "Api.fs.copy.absolute_path", - next_diag_item = "Api.node.navigate.diagnostics.next", - next_git_item = "Api.node.navigate.git.next", - prev_diag_item = "Api.node.navigate.diagnostics.prev", - prev_git_item = "Api.node.navigate.git.prev", - dir_up = "Api.tree.change_root_to_parent", - system_open = "Api.node.run.system", - live_filter = "Api.live_filter.start", - clear_live_filter = "Api.live_filter.clear", - close = "Api.tree.close", - collapse_all = "Api.tree.collapse_all", - expand_all = "Api.tree.expand_all", - search_node = "Api.tree.search_node", - run_file_command = "Api.node.run.cmd", - toggle_file_info = "Api.node.show_info_popup", - toggle_help = "Api.tree.toggle_help", - toggle_mark = "Api.marks.toggle", - bulk_move = "Api.marks.bulk.move", + -- TODO sync + edit = "api.node.open.edit", + edit_in_place = "api.node.open.replace_tree_buffer", + edit_no_picker = "api.node.open.no_window_picker", + cd = "api.tree.change_root_to_node", + vsplit = "api.node.open.vertical", + split = "api.node.open.horizontal", + tabnew = "api.node.open.tab", + prev_sibling = "api.node.navigate.sibling.prev", + next_sibling = "api.node.navigate.sibling.next", + parent_node = "api.node.navigate.parent", + close_node = "api.node.navigate.parent_close", + preview = "api.node.open.preview", + first_sibling = "api.node.navigate.sibling.first", + last_sibling = "api.node.navigate.sibling.last", + toggle_git_ignored = "api.tree.toggle_gitignore_filter", + toggle_dotfiles = "api.tree.toggle_hidden_filter", + toggle_custom = "api.tree.toggle_custom_filter", + refresh = "api.tree.reload", + create = "api.fs.create", + remove = "api.fs.remove", + trash = "api.fs.trash", + rename = "api.fs.rename", + full_rename = "api.fs.rename_sub", + cut = "api.fs.cut", + copy = "api.fs.copy.node", + paste = "api.fs.paste", + copy_name = "api.fs.copy.filename", + copy_path = "api.fs.copy.relative_path", + copy_absolute_path = "api.fs.copy.absolute_path", + next_diag_item = "api.node.navigate.diagnostics.next", + next_git_item = "api.node.navigate.git.next", + prev_diag_item = "api.node.navigate.diagnostics.prev", + prev_git_item = "api.node.navigate.git.prev", + dir_up = "api.tree.change_root_to_parent", + system_open = "api.node.run.system", + live_filter = "api.live_filter.start", + clear_live_filter = "api.live_filter.clear", + close = "api.tree.close", + collapse_all = "api.tree.collapse_all", + expand_all = "api.tree.expand_all", + search_node = "api.tree.search_node", + run_file_command = "api.node.run.cmd", + toggle_file_info = "api.node.show_info_popup", + toggle_help = "api.tree.toggle_help", + toggle_mark = "api.marks.toggle", + bulk_move = "api.marks.bulk.move", } -- END_LEGACY_CALLBACKS @@ -325,12 +325,6 @@ local g_migrations = { o.respect_buf_cwd = vim.g.nvim_tree_respect_buf_cwd == 1 end end, - - nvim_tree_create_in_closed_folder = function(o) - if o.create_in_closed_folder == nil then - o.create_in_closed_folder = vim.g.nvim_tree_create_in_closed_folder == 1 - end - end, } local function refactored(opts) @@ -366,16 +360,21 @@ local function removed(opts) notify.warn "focus_empty_on_setup has been removed and will be replaced by a new startup configuration. Please remove this option. See https://bit.ly/3yJch2T" opts.focus_empty_on_setup = nil end + + if opts.create_in_closed_folder then + notify.warn "create_in_closed_folder has been removed and is now the default behaviour. You may use api.fs.create to add a file under your desired node." + end + opts.create_in_closed_folder = nil end +-- TODO pcall vim.keymap.del("n", key, opts) for action = "" and remove_keymaps local function build_on_attach(call_list) if #call_list == 0 then return nil end M.on_attach_lua = [[ -local Api = require('nvim-tree.api') -local Lib = require('nvim-tree.lib') +local api = require('nvim-tree.api') local on_attach = function(bufnr) ]] @@ -384,7 +383,7 @@ local on_attach = function(bufnr) local vim_keymap_set if el.action_cb then vim_keymap_set = string.format( - 'vim.keymap.set("n", "%s", function()\n local node = Lib.get_node_at_cursor()\n -- my code\n end, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = "my description" })', + 'vim.keymap.set("n", "%s", function()\n local node = api.tree.get_node_under_cursor()\n -- my code\n end, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = "my description" })', el.key ) elseif el.keymap then @@ -404,10 +403,11 @@ local on_attach = function(bufnr) M.on_attach_lua = string.format("%send\n", M.on_attach_lua) return function(bufnr) + keymap.on_attach_default(bufnr) for _, el in pairs(call_list) do if el.action_cb then vim.keymap.set(el.mode or "n", el.key, function() - el.action_cb(require("nvim-tree.lib").get_node_at_cursor()) + el.action_cb(require("nvim-tree.api").tree.get_node_under_cursor()) end, { buffer = bufnr, remap = false, silent = true }) elseif el.keymap then vim.keymap.set( @@ -421,42 +421,52 @@ local on_attach = function(bufnr) end end -function M.move_mappings_to_keymap(opts) +function M.generate_legacy_on_attach(opts) if type(opts.on_attach) ~= "function" and opts.view and opts.view.mappings then - local custom_only, list = opts.view.mappings.custom_only, opts.view.mappings.list + local list = opts.view.mappings.list log.line("config", "generating on_attach for %d legacy view.mappings.list:", #list) - if custom_only then + + if opts.view.mappings.custom_only then opts.remove_keymaps = true opts.view.mappings.custom_only = nil end + if list then - local keymap_by_legacy_action = utils.key_by(DEFAULT_KEYMAPS, "legacy_action") - if not custom_only then - opts.remove_keymaps = {} - end + local keymap_by_legacy_action = utils.key_by(keymap.DEFAULT_KEYMAPS, "legacy_action") local call_list = {} + + for _, km in ipairs(keymap.DEFAULT_KEYMAPS) do + local keys = type(km.key) == "table" and km.key or { km.key } + for _, k in ipairs(keys) do + table.insert(call_list, { mode = "n", key = k, keymap = km }) + end + end + for _, map in pairs(list) do local keys = type(map.key) == "table" and map.key or { map.key } local mode = map.mode or "n" local action_cb - local keymap + local km if map.action ~= "" then if map.action_cb then action_cb = map.action_cb elseif keymap_by_legacy_action[map.action] then - keymap = keymap_by_legacy_action[map.action] + km = keymap_by_legacy_action[map.action] end end for _, k in pairs(keys) do - if not custom_only and not vim.tbl_contains(opts.remove_keymaps, k) then + if map.action == "" and opts.remove_keymaps ~= true then + if type(opts.remove_keymaps) ~= "table" then + opts.remove_keymaps = {} + end table.insert(opts.remove_keymaps, k) end if action_cb then table.insert(call_list, { mode = mode, key = k, action_cb = action_cb }) - elseif keymap then - table.insert(call_list, { mode = mode, key = k, keymap = keymap }) + elseif km then + table.insert(call_list, { mode = mode, key = k, keymap = km }) end end end diff --git a/lua/nvim-tree/renderer/builder.lua b/lua/nvim-tree/renderer/builder.lua index bccb93a370a..1a63900e989 100644 --- a/lua/nvim-tree/renderer/builder.lua +++ b/lua/nvim-tree/renderer/builder.lua @@ -127,7 +127,11 @@ function Builder:_build_folder(node, padding, git_hl, git_icons_tbl) self:_insert_line(line) if #icon > 0 then - self:_insert_highlight("NvimTreeFolderIcon", offset, offset + #icon) + if node.open then + self:_insert_highlight("NvimTreeOpenedFolderIcon", offset, offset + #icon) + else + self:_insert_highlight("NvimTreeClosedFolderIcon", offset, offset + #icon) + end end local foldername_hl = "NvimTreeFolderName" diff --git a/lua/nvim-tree/renderer/components/git.lua b/lua/nvim-tree/renderer/components/git.lua index 644e06c353b..fae22803f30 100644 --- a/lua/nvim-tree/renderer/components/git.lua +++ b/lua/nvim-tree/renderer/components/git.lua @@ -1,4 +1,5 @@ local notify = require "nvim-tree.notify" +local explorer_common = require "nvim-tree.explorer.common" local M = { SIGN_GROUP = "NvimTreeGitSigns", @@ -76,11 +77,11 @@ local function warn_status(git_status) end local function get_icons_(node) - local git_status = node.git_status - if not git_status then + if not explorer_common.shows_git_status(node) then return nil end + local git_status = node.git_status local icons = M.git_icons[git_status] if not icons then if not M.config.highlight_git then @@ -137,7 +138,7 @@ end local function get_highlight_(node) local git_status = node.git_status - if not git_status then + if not explorer_common.shows_git_status(node) then return end @@ -162,6 +163,8 @@ function M.setup(opts) else M.get_highlight = nil_ end + + M.git_show_on_open_dirs = opts.git.show_on_open_dirs end return M diff --git a/lua/nvim-tree/renderer/components/icons.lua b/lua/nvim-tree/renderer/components/icons.lua index 393d5ea29ec..3c5d27b82e1 100644 --- a/lua/nvim-tree/renderer/components/icons.lua +++ b/lua/nvim-tree/renderer/components/icons.lua @@ -85,7 +85,7 @@ end function M.setup(opts) M.config = opts.renderer.icons - M.devicons = pcall(require, "nvim-web-devicons") and require "nvim-web-devicons" + M.devicons = pcall(require, "nvim-web-devicons") and require "nvim-web-devicons" or nil end return M diff --git a/lua/nvim-tree/view.lua b/lua/nvim-tree/view.lua index 97d78e1c1a2..3e7dca9a008 100644 --- a/lua/nvim-tree/view.lua +++ b/lua/nvim-tree/view.lua @@ -27,6 +27,7 @@ M.View = { foldmethod = "manual", foldcolumn = "0", cursorcolumn = false, + cursorline = true, cursorlineopt = "both", colorcolumn = "0", wrap = false, @@ -93,10 +94,7 @@ local function create_buffer(bufnr) vim.bo[M.get_bufnr()][option] = value end - require("nvim-tree.keymap").set_keymaps(M.get_bufnr()) - if type(M.on_attach) == "function" then - M.on_attach(M.get_bufnr()) - end + require("nvim-tree.keymap").on_attach(M.get_bufnr()) end local function get_size() @@ -491,7 +489,6 @@ function M.setup(opts) M.View.winopts.relativenumber = options.relativenumber M.View.winopts.signcolumn = options.signcolumn M.View.float = options.float - M.on_attach = opts.on_attach end return M From 94634c037c7c00885d82f4c2e5a986b21bff4193 Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Thu, 26 Jan 2023 13:14:02 +1100 Subject: [PATCH 19/42] on_attach_default hardcoded --- doc/nvim-tree-lua.txt | 100 ++++++++++++++------------- lua/nvim-tree/keymap.lua | 78 ++++++++++++++++----- lua/nvim-tree/legacy.lua | 100 +++++++++++++-------------- scripts/generate_default_keymaps.lua | 2 +- 4 files changed, 164 insertions(+), 116 deletions(-) diff --git a/doc/nvim-tree-lua.txt b/doc/nvim-tree-lua.txt index 5202007cc51..d1a4d733d33 100644 --- a/doc/nvim-tree-lua.txt +++ b/doc/nvim-tree-lua.txt @@ -1504,6 +1504,7 @@ DEFAULT MAPPINGS *nvim-tree-default-mappings `D` Trash Trash a file via |trash| option. `r` Rename Rename a file or directory. `` Rename: Omit Filename Rename a file or directory and omit the filename on input. +`e` Rename: Basename no description `x` Cut Cut file or directory to cut clipboard. `c` Copy Copy file or directory to copy clipboard. `p` Paste Paste from clipboard; cut clipboard has precedence over copy; will prompt for confirmation. @@ -1532,55 +1533,56 @@ DEFAULT MAPPINGS *nvim-tree-default-mappings local on_attach = function(bufnr) -- BEGIN_ON_ATTACH local Api = require('nvim-tree.api') - vim.keymap.set('n', '', Api.node.open.edit, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Open', }) - vim.keymap.set('n', 'o', Api.node.open.edit, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Open', }) - vim.keymap.set('n', '<2-LeftMouse>', Api.node.open.edit, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Open', }) - vim.keymap.set('n', '', Api.node.open.replace_tree_buffer, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Open: In Place', }) - vim.keymap.set('n', 'O', Api.node.open.no_window_picker, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Open: No Window Picker', }) - vim.keymap.set('n', '', Api.tree.change_root_to_node, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'CD', }) - vim.keymap.set('n', '<2-RightMouse>', Api.tree.change_root_to_node, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'CD', }) - vim.keymap.set('n', '', Api.node.open.vertical, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Open: Vertical Split', }) - vim.keymap.set('n', '', Api.node.open.horizontal, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Open: Horizontal Split', }) - vim.keymap.set('n', '', Api.node.open.tab, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Open: New Tab', }) - vim.keymap.set('n', '<', Api.node.navigate.sibling.prev, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Previous Sibling', }) - vim.keymap.set('n', '>', Api.node.navigate.sibling.next, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Next Sibling', }) - vim.keymap.set('n', 'P', Api.node.navigate.parent, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Parent Directory', }) - vim.keymap.set('n', '', Api.node.navigate.parent_close, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Close Directory', }) - vim.keymap.set('n', '', Api.node.open.preview, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Open Preview', }) - vim.keymap.set('n', 'K', Api.node.navigate.sibling.first, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'First Sibling', }) - vim.keymap.set('n', 'J', Api.node.navigate.sibling.last, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Last Sibling', }) - vim.keymap.set('n', 'I', Api.tree.toggle_gitignore_filter, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Toggle Git Ignore', }) - vim.keymap.set('n', 'H', Api.tree.toggle_hidden_filter, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Toggle Dotfiles', }) - vim.keymap.set('n', 'U', Api.tree.toggle_custom_filter, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Toggle Hidden', }) - vim.keymap.set('n', 'R', Api.tree.reload, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Refresh', }) - vim.keymap.set('n', 'a', Api.fs.create, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Create', }) - vim.keymap.set('n', 'd', Api.fs.remove, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Delete', }) - vim.keymap.set('n', 'D', Api.fs.trash, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Trash', }) - vim.keymap.set('n', 'r', Api.fs.rename, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Rename', }) - vim.keymap.set('n', '', Api.fs.rename_sub, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Rename: Omit Filename', }) - vim.keymap.set('n', 'x', Api.fs.cut, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Cut', }) - vim.keymap.set('n', 'c', Api.fs.copy.node, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Copy', }) - vim.keymap.set('n', 'p', Api.fs.paste, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Paste', }) - vim.keymap.set('n', 'y', Api.fs.copy.filename, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Copy Name', }) - vim.keymap.set('n', 'Y', Api.fs.copy.relative_path, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Copy Relative Path', }) - vim.keymap.set('n', 'gy', Api.fs.copy.absolute_path, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Copy Absolute Path', }) - vim.keymap.set('n', ']e', Api.node.navigate.diagnostics.next, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Next Diagnostic', }) - vim.keymap.set('n', ']c', Api.node.navigate.git.next, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Next Git', }) - vim.keymap.set('n', '[e', Api.node.navigate.diagnostics.prev, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Prev Diagnostic', }) - vim.keymap.set('n', '[c', Api.node.navigate.git.prev, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Prev Git', }) - vim.keymap.set('n', '-', Api.tree.change_root_to_parent, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Up', }) - vim.keymap.set('n', 's', Api.node.run.system, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Run System', }) - vim.keymap.set('n', 'f', Api.live_filter.start, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Filter', }) - vim.keymap.set('n', 'F', Api.live_filter.clear, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Clean Filter', }) - vim.keymap.set('n', 'q', Api.tree.close, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Close', }) - vim.keymap.set('n', 'W', Api.tree.collapse_all, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Collapse', }) - vim.keymap.set('n', 'E', Api.tree.expand_all, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Expand All', }) - vim.keymap.set('n', 'S', Api.tree.search_node, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Search', }) - vim.keymap.set('n', '.', Api.node.run.cmd, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Run Command', }) - vim.keymap.set('n', '', Api.node.show_info_popup, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Info', }) - vim.keymap.set('n', 'g?', Api.tree.toggle_help, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Help', }) - vim.keymap.set('n', 'm', Api.marks.toggle, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Toggle Bookmark', }) - vim.keymap.set('n', 'bmv', Api.marks.bulk.move, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Move Bookmarked', }) + vim.keymap.set('n', '', Api.node.open.edit, { desc = 'Open', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', 'o', Api.node.open.edit, { desc = 'Open', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', '<2-LeftMouse>', Api.node.open.edit, { desc = 'Open', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', '', Api.node.open.replace_tree_buffer, { desc = 'Open: In Place', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', 'O', Api.node.open.no_window_picker, { desc = 'Open: No Window Picker', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', '', Api.tree.change_root_to_node, { desc = 'CD', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', '<2-RightMouse>', Api.tree.change_root_to_node, { desc = 'CD', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', '', Api.node.open.vertical, { desc = 'Open: Vertical Split', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', '', Api.node.open.horizontal, { desc = 'Open: Horizontal Split', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', '', Api.node.open.tab, { desc = 'Open: New Tab', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', '<', Api.node.navigate.sibling.prev, { desc = 'Previous Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', '>', Api.node.navigate.sibling.next, { desc = 'Next Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', 'P', Api.node.navigate.parent, { desc = 'Parent Directory', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', '', Api.node.navigate.parent_close, { desc = 'Close Directory', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', '', Api.node.open.preview, { desc = 'Open Preview', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', 'K', Api.node.navigate.sibling.first, { desc = 'First Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', 'J', Api.node.navigate.sibling.last, { desc = 'Last Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', 'I', Api.tree.toggle_gitignore_filter, { desc = 'Toggle Git Ignore', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', 'H', Api.tree.toggle_hidden_filter, { desc = 'Toggle Dotfiles', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', 'U', Api.tree.toggle_custom_filter, { desc = 'Toggle Hidden', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', 'R', Api.tree.reload, { desc = 'Refresh', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', 'a', Api.fs.create, { desc = 'Create', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', 'd', Api.fs.remove, { desc = 'Delete', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', 'D', Api.fs.trash, { desc = 'Trash', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', 'r', Api.fs.rename, { desc = 'Rename', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', '', Api.fs.rename_sub, { desc = 'Rename: Omit Filename', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', 'e', Api.fs.rename_basename, { desc = 'Rename: Basename', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', 'x', Api.fs.cut, { desc = 'Cut', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', 'c', Api.fs.copy.node, { desc = 'Copy', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', 'p', Api.fs.paste, { desc = 'Paste', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', 'y', Api.fs.copy.filename, { desc = 'Copy Name', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', 'Y', Api.fs.copy.relative_path, { desc = 'Copy Relative Path', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', 'gy', Api.fs.copy.absolute_path, { desc = 'Copy Absolute Path', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', ']e', Api.node.navigate.diagnostics.next, { desc = 'Next Diagnostic', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', ']c', Api.node.navigate.git.next, { desc = 'Next Git', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', '[e', Api.node.navigate.diagnostics.prev, { desc = 'Prev Diagnostic', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', '[c', Api.node.navigate.git.prev, { desc = 'Prev Git', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', '-', Api.tree.change_root_to_parent, { desc = 'Up', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', 's', Api.node.run.system, { desc = 'Run System', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', 'f', Api.live_filter.start, { desc = 'Filter', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', 'F', Api.live_filter.clear, { desc = 'Clean Filter', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', 'q', Api.tree.close, { desc = 'Close', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', 'W', Api.tree.collapse_all, { desc = 'Collapse', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', 'E', Api.tree.expand_all, { desc = 'Expand All', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', 'S', Api.tree.search_node, { desc = 'Search', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', '.', Api.node.run.cmd, { desc = 'Run Command', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', '', Api.node.show_info_popup, { desc = 'Info', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', 'g?', Api.tree.toggle_help, { desc = 'Help', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', 'm', Api.marks.toggle, { desc = 'Toggle Bookmark', buffer = bufnr, noremap = true, silent = true, nowait = true, }) + vim.keymap.set('n', 'bmv', Api.marks.bulk.move, { desc = 'Move Bookmarked', buffer = bufnr, noremap = true, silent = true, nowait = true, }) end -- END_ON_ATTACH < diff --git a/lua/nvim-tree/keymap.lua b/lua/nvim-tree/keymap.lua index 642e97ef72b..eed188f102b 100644 --- a/lua/nvim-tree/keymap.lua +++ b/lua/nvim-tree/keymap.lua @@ -211,6 +211,15 @@ local DEFAULT_KEYMAPS = { }, legacy_action = "full_rename", }, + { + key = "e", + callback = Api.fs.rename_basename, + desc = { + long = "no description", + short = "Rename: Basename", + }, + legacy_action = "rename_basename", + }, { key = "x", callback = Api.fs.cut, @@ -422,26 +431,63 @@ local DEFAULT_KEYMAPS = { -- END_DEFAULT_KEYMAPS function M.on_attach_default(bufnr) - local opts = { noremap = true, silent = true, nowait = true, buffer = bufnr } - - for _, km in ipairs(M.DEFAULT_KEYMAPS) do - local keys = type(km.key) == "table" and km.key or { km.key } - for _, key in ipairs(keys) do - opts.desc = km.desc.short - vim.keymap.set("n", key, km.callback, opts) - end - end + vim.keymap.set('n', '', Api.node.open.edit, { desc = 'Open', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'o', Api.node.open.edit, { desc = 'Open', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '<2-LeftMouse>', Api.node.open.edit, { desc = 'Open', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', Api.node.open.replace_tree_buffer, { desc = 'Open: In Place', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'O', Api.node.open.no_window_picker, { desc = 'Open: No Window Picker', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', Api.tree.change_root_to_node, { desc = 'CD', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '<2-RightMouse>', Api.tree.change_root_to_node, { desc = 'CD', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', Api.node.open.vertical, { desc = 'Open: Vertical Split', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', Api.node.open.horizontal, { desc = 'Open: Horizontal Split', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', Api.node.open.tab, { desc = 'Open: New Tab', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '<', Api.node.navigate.sibling.prev, { desc = 'Previous Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '>', Api.node.navigate.sibling.next, { desc = 'Next Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'P', Api.node.navigate.parent, { desc = 'Parent Directory', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', Api.node.navigate.parent_close, { desc = 'Close Directory', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', Api.node.open.preview, { desc = 'Open Preview', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'K', Api.node.navigate.sibling.first, { desc = 'First Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'J', Api.node.navigate.sibling.last, { desc = 'Last Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'I', Api.tree.toggle_gitignore_filter, { desc = 'Toggle Git Ignore', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'H', Api.tree.toggle_hidden_filter, { desc = 'Toggle Dotfiles', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'U', Api.tree.toggle_custom_filter, { desc = 'Toggle Hidden', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'R', Api.tree.reload, { desc = 'Refresh', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'a', Api.fs.create, { desc = 'Create', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'd', Api.fs.remove, { desc = 'Delete', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'D', Api.fs.trash, { desc = 'Trash', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'r', Api.fs.rename, { desc = 'Rename', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', Api.fs.rename_sub, { desc = 'Rename: Omit Filename', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'e', nil, { desc = 'Rename: Basename', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'x', Api.fs.cut, { desc = 'Cut', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'c', Api.fs.copy.node, { desc = 'Copy', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'p', Api.fs.paste, { desc = 'Paste', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'y', Api.fs.copy.filename, { desc = 'Copy Name', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'Y', Api.fs.copy.relative_path, { desc = 'Copy Relative Path', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'gy', Api.fs.copy.absolute_path, { desc = 'Copy Absolute Path', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', ']e', Api.node.navigate.diagnostics.next, { desc = 'Next Diagnostic', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', ']c', Api.node.navigate.git.next, { desc = 'Next Git', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '[e', Api.node.navigate.diagnostics.prev, { desc = 'Prev Diagnostic', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '[c', Api.node.navigate.git.prev, { desc = 'Prev Git', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '-', Api.tree.change_root_to_parent, { desc = 'Up', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 's', Api.node.run.system, { desc = 'Run System', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'f', Api.live_filter.start, { desc = 'Filter', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'F', Api.live_filter.clear, { desc = 'Clean Filter', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'q', Api.tree.close, { desc = 'Close', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'W', Api.tree.collapse_all, { desc = 'Collapse', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'E', Api.tree.expand_all, { desc = 'Expand All', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'S', Api.tree.search_node, { desc = 'Search', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '.', Api.node.run.cmd, { desc = 'Run Command', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', Api.node.show_info_popup, { desc = 'Info', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'g?', Api.tree.toggle_help, { desc = 'Help', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'm', Api.marks.toggle, { desc = 'Toggle Bookmark', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'bmv', Api.marks.bulk.move, { desc = 'Move Bookmarked', buffer = bufnr, noremap = true, silent = true, nowait = true }) end function M.setup(opts) - if type(opts.on_attach) == "function" then - M.on_attach = opts.on_attach - else + if type(opts.on_attach) ~= "function" then M.on_attach = M.on_attach_default - end - - if type(opts.remove_keymaps) == "table" then - M.remove_keys = opts.remove_keymaps + else + M.on_attach = opts.on_attach end end diff --git a/lua/nvim-tree/legacy.lua b/lua/nvim-tree/legacy.lua index 34d44a7cfb3..cd3dba83f7e 100644 --- a/lua/nvim-tree/legacy.lua +++ b/lua/nvim-tree/legacy.lua @@ -10,53 +10,53 @@ local M = { -- BEGIN_LEGACY_CALLBACKS local LEGACY_CALLBACKS = { - -- TODO sync - edit = "api.node.open.edit", - edit_in_place = "api.node.open.replace_tree_buffer", - edit_no_picker = "api.node.open.no_window_picker", - cd = "api.tree.change_root_to_node", - vsplit = "api.node.open.vertical", - split = "api.node.open.horizontal", - tabnew = "api.node.open.tab", - prev_sibling = "api.node.navigate.sibling.prev", - next_sibling = "api.node.navigate.sibling.next", - parent_node = "api.node.navigate.parent", - close_node = "api.node.navigate.parent_close", - preview = "api.node.open.preview", - first_sibling = "api.node.navigate.sibling.first", - last_sibling = "api.node.navigate.sibling.last", - toggle_git_ignored = "api.tree.toggle_gitignore_filter", - toggle_dotfiles = "api.tree.toggle_hidden_filter", - toggle_custom = "api.tree.toggle_custom_filter", - refresh = "api.tree.reload", - create = "api.fs.create", - remove = "api.fs.remove", - trash = "api.fs.trash", - rename = "api.fs.rename", - full_rename = "api.fs.rename_sub", - cut = "api.fs.cut", - copy = "api.fs.copy.node", - paste = "api.fs.paste", - copy_name = "api.fs.copy.filename", - copy_path = "api.fs.copy.relative_path", - copy_absolute_path = "api.fs.copy.absolute_path", - next_diag_item = "api.node.navigate.diagnostics.next", - next_git_item = "api.node.navigate.git.next", - prev_diag_item = "api.node.navigate.diagnostics.prev", - prev_git_item = "api.node.navigate.git.prev", - dir_up = "api.tree.change_root_to_parent", - system_open = "api.node.run.system", - live_filter = "api.live_filter.start", - clear_live_filter = "api.live_filter.clear", - close = "api.tree.close", - collapse_all = "api.tree.collapse_all", - expand_all = "api.tree.expand_all", - search_node = "api.tree.search_node", - run_file_command = "api.node.run.cmd", - toggle_file_info = "api.node.show_info_popup", - toggle_help = "api.tree.toggle_help", - toggle_mark = "api.marks.toggle", - bulk_move = "api.marks.bulk.move", + edit = "Api.node.open.edit", + edit_in_place = "Api.node.open.replace_tree_buffer", + edit_no_picker = "Api.node.open.no_window_picker", + cd = "Api.tree.change_root_to_node", + vsplit = "Api.node.open.vertical", + split = "Api.node.open.horizontal", + tabnew = "Api.node.open.tab", + prev_sibling = "Api.node.navigate.sibling.prev", + next_sibling = "Api.node.navigate.sibling.next", + parent_node = "Api.node.navigate.parent", + close_node = "Api.node.navigate.parent_close", + preview = "Api.node.open.preview", + first_sibling = "Api.node.navigate.sibling.first", + last_sibling = "Api.node.navigate.sibling.last", + toggle_git_ignored = "Api.tree.toggle_gitignore_filter", + toggle_dotfiles = "Api.tree.toggle_hidden_filter", + toggle_custom = "Api.tree.toggle_custom_filter", + refresh = "Api.tree.reload", + create = "Api.fs.create", + remove = "Api.fs.remove", + trash = "Api.fs.trash", + rename = "Api.fs.rename", + full_rename = "Api.fs.rename_sub", + rename_basename = "Api.fs.rename_basename", + cut = "Api.fs.cut", + copy = "Api.fs.copy.node", + paste = "Api.fs.paste", + copy_name = "Api.fs.copy.filename", + copy_path = "Api.fs.copy.relative_path", + copy_absolute_path = "Api.fs.copy.absolute_path", + next_diag_item = "Api.node.navigate.diagnostics.next", + next_git_item = "Api.node.navigate.git.next", + prev_diag_item = "Api.node.navigate.diagnostics.prev", + prev_git_item = "Api.node.navigate.git.prev", + dir_up = "Api.tree.change_root_to_parent", + system_open = "Api.node.run.system", + live_filter = "Api.live_filter.start", + clear_live_filter = "Api.live_filter.clear", + close = "Api.tree.close", + collapse_all = "Api.tree.collapse_all", + expand_all = "Api.tree.expand_all", + search_node = "Api.tree.search_node", + run_file_command = "Api.node.run.cmd", + toggle_file_info = "Api.node.show_info_popup", + toggle_help = "Api.tree.toggle_help", + toggle_mark = "Api.marks.toggle", + bulk_move = "Api.marks.bulk.move", } -- END_LEGACY_CALLBACKS @@ -133,12 +133,12 @@ local on_attach = function(bufnr) local vim_keymap_set if el.action_cb then vim_keymap_set = string.format( - 'vim.keymap.set("n", "%s", function()\n local node = api.tree.get_node_under_cursor()\n -- my code\n end, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = "my description" })', + 'vim.keymap.set("n", "%s", function()\n local node = api.tree.get_node_under_cursor()\n -- my code\n end, { desc = "my description", buffer = bufnr, noremap = true, silent = true, nowait = true })', el.key ) elseif el.keymap then vim_keymap_set = string.format( - "vim.keymap.set('n', '%s', %s, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = '%s' })", + "vim.keymap.set('n', '%s', %s, { desc = '%s', buffer = bufnr, noremap = true, silent = true, nowait = true })", el.key, LEGACY_CALLBACKS[el.keymap.legacy_action], el.keymap.desc.short @@ -172,7 +172,7 @@ local on_attach = function(bufnr) end function M.generate_legacy_on_attach(opts) - if type(opts.on_attach) ~= "function" and opts.view and opts.view.mappings then + if type(opts.on_attach) ~= "function" and opts.view and opts.view.mappings and opts.view.mappings.list and #opts.view.mappings.list > 0 then local list = opts.view.mappings.list log.line("config", "generating on_attach for %d legacy view.mappings.list:", #list) diff --git a/scripts/generate_default_keymaps.lua b/scripts/generate_default_keymaps.lua index 2d12fcfbfa5..a5da3d2e652 100644 --- a/scripts/generate_default_keymaps.lua +++ b/scripts/generate_default_keymaps.lua @@ -46,7 +46,7 @@ file = io.open("/tmp/DEFAULT_KEYMAPS.on_attach.lua", "w") io.output(file) io.write " local Api = require('nvim-tree.api')\n\n" fmt = string.format( - " vim.keymap.set('n', %%-%d.%ds %%-%d.%ds { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = '%%s', })\n", + " vim.keymap.set('n', %%-%d.%ds %%-%d.%ds { desc = '%%s', buffer = bufnr, noremap = true, silent = true, nowait = true, })\n", max_key + 3, max_key + 3, max_callback + 1, From f495bcae8e328efdd86f6c3c80b6c4b36a1b0334 Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Thu, 26 Jan 2023 14:04:42 +1100 Subject: [PATCH 20/42] format default_on_attach --- lua/nvim-tree/keymap.lua | 198 ++++++++++++++++---------------- lua/nvim-tree/renderer/help.lua | 12 +- 2 files changed, 103 insertions(+), 107 deletions(-) diff --git a/lua/nvim-tree/keymap.lua b/lua/nvim-tree/keymap.lua index eed188f102b..2934b229edb 100644 --- a/lua/nvim-tree/keymap.lua +++ b/lua/nvim-tree/keymap.lua @@ -1,4 +1,4 @@ -local Api = require "nvim-tree.api" +local api = require "nvim-tree.api" local M = {} @@ -6,7 +6,7 @@ local M = {} local DEFAULT_KEYMAPS = { { key = { "", "o", "<2-LeftMouse>" }, - callback = Api.node.open.edit, + callback = api.node.open.edit, desc = { long = "Open a file or directory; root will cd to the above directory.", short = "Open", @@ -15,7 +15,7 @@ local DEFAULT_KEYMAPS = { }, { key = "", - callback = Api.node.open.replace_tree_buffer, + callback = api.node.open.replace_tree_buffer, desc = { long = "Open file in place, effectively replacing the tree explorer.", short = "Open: In Place", @@ -24,7 +24,7 @@ local DEFAULT_KEYMAPS = { }, { key = "O", - callback = Api.node.open.no_window_picker, + callback = api.node.open.no_window_picker, desc = { long = "Open file with no window picker.", short = "Open: No Window Picker", @@ -33,7 +33,7 @@ local DEFAULT_KEYMAPS = { }, { key = { "", "<2-RightMouse>" }, - callback = Api.tree.change_root_to_node, + callback = api.tree.change_root_to_node, desc = { long = "cd in the directory under the cursor.", short = "CD", @@ -42,7 +42,7 @@ local DEFAULT_KEYMAPS = { }, { key = "", - callback = Api.node.open.vertical, + callback = api.node.open.vertical, desc = { long = "Open file in a vertical split.", short = "Open: Vertical Split", @@ -51,7 +51,7 @@ local DEFAULT_KEYMAPS = { }, { key = "", - callback = Api.node.open.horizontal, + callback = api.node.open.horizontal, desc = { long = "Open file in a horizontal split.", short = "Open: Horizontal Split", @@ -60,7 +60,7 @@ local DEFAULT_KEYMAPS = { }, { key = "", - callback = Api.node.open.tab, + callback = api.node.open.tab, desc = { long = "Open file in a new tab.", short = "Open: New Tab", @@ -69,7 +69,7 @@ local DEFAULT_KEYMAPS = { }, { key = "<", - callback = Api.node.navigate.sibling.prev, + callback = api.node.navigate.sibling.prev, desc = { long = "Navigate to the previous sibling.", short = "Previous Sibling", @@ -78,7 +78,7 @@ local DEFAULT_KEYMAPS = { }, { key = ">", - callback = Api.node.navigate.sibling.next, + callback = api.node.navigate.sibling.next, desc = { long = "Navigate to the next sibling", short = "Next Sibling", @@ -87,7 +87,7 @@ local DEFAULT_KEYMAPS = { }, { key = "P", - callback = Api.node.navigate.parent, + callback = api.node.navigate.parent, desc = { long = "Move cursor to the parent directory.", short = "Parent Directory", @@ -96,7 +96,7 @@ local DEFAULT_KEYMAPS = { }, { key = "", - callback = Api.node.navigate.parent_close, + callback = api.node.navigate.parent_close, desc = { long = "Close current opened directory or parent.", short = "Close Directory", @@ -105,7 +105,7 @@ local DEFAULT_KEYMAPS = { }, { key = "", - callback = Api.node.open.preview, + callback = api.node.open.preview, desc = { long = "Open file as a preview (keeps the cursor in the tree).", short = "Open Preview", @@ -114,7 +114,7 @@ local DEFAULT_KEYMAPS = { }, { key = "K", - callback = Api.node.navigate.sibling.first, + callback = api.node.navigate.sibling.first, desc = { long = "Navigate to the first sibling.", short = "First Sibling", @@ -123,7 +123,7 @@ local DEFAULT_KEYMAPS = { }, { key = "J", - callback = Api.node.navigate.sibling.last, + callback = api.node.navigate.sibling.last, desc = { long = "Navigate to the last sibling.", short = "Last Sibling", @@ -132,7 +132,7 @@ local DEFAULT_KEYMAPS = { }, { key = "I", - callback = Api.tree.toggle_gitignore_filter, + callback = api.tree.toggle_gitignore_filter, desc = { long = "Toggle visibility of files/directories hidden via |git.ignore| option.", short = "Toggle Git Ignore", @@ -141,7 +141,7 @@ local DEFAULT_KEYMAPS = { }, { key = "H", - callback = Api.tree.toggle_hidden_filter, + callback = api.tree.toggle_hidden_filter, desc = { long = "Toggle visibility of dotfiles via |filters.dotfiles| option.", short = "Toggle Dotfiles", @@ -150,7 +150,7 @@ local DEFAULT_KEYMAPS = { }, { key = "U", - callback = Api.tree.toggle_custom_filter, + callback = api.tree.toggle_custom_filter, desc = { long = "Toggle visibility of files/directories hidden via |filters.custom| option.", short = "Toggle Hidden", @@ -159,7 +159,7 @@ local DEFAULT_KEYMAPS = { }, { key = "R", - callback = Api.tree.reload, + callback = api.tree.reload, desc = { long = "Refresh the tree.", short = "Refresh", @@ -168,7 +168,7 @@ local DEFAULT_KEYMAPS = { }, { key = "a", - callback = Api.fs.create, + callback = api.fs.create, desc = { long = "Create a file; leaving a trailing `/` will add a directory.", short = "Create", @@ -177,7 +177,7 @@ local DEFAULT_KEYMAPS = { }, { key = "d", - callback = Api.fs.remove, + callback = api.fs.remove, desc = { long = "Delete a file, prompting for confirmation.", short = "Delete", @@ -186,7 +186,7 @@ local DEFAULT_KEYMAPS = { }, { key = "D", - callback = Api.fs.trash, + callback = api.fs.trash, desc = { long = "Trash a file via |trash| option.", short = "Trash", @@ -195,7 +195,7 @@ local DEFAULT_KEYMAPS = { }, { key = "r", - callback = Api.fs.rename, + callback = api.fs.rename, desc = { long = "Rename a file or directory.", short = "Rename", @@ -204,7 +204,7 @@ local DEFAULT_KEYMAPS = { }, { key = "", - callback = Api.fs.rename_sub, + callback = api.fs.rename_sub, desc = { long = "Rename a file or directory and omit the filename on input.", short = "Rename: Omit Filename", @@ -213,7 +213,7 @@ local DEFAULT_KEYMAPS = { }, { key = "e", - callback = Api.fs.rename_basename, + callback = api.fs.rename_basename, desc = { long = "no description", short = "Rename: Basename", @@ -222,7 +222,7 @@ local DEFAULT_KEYMAPS = { }, { key = "x", - callback = Api.fs.cut, + callback = api.fs.cut, desc = { long = "Cut file or directory to cut clipboard.", short = "Cut", @@ -231,7 +231,7 @@ local DEFAULT_KEYMAPS = { }, { key = "c", - callback = Api.fs.copy.node, + callback = api.fs.copy.node, desc = { long = "Copy file or directory to copy clipboard.", short = "Copy", @@ -240,7 +240,7 @@ local DEFAULT_KEYMAPS = { }, { key = "p", - callback = Api.fs.paste, + callback = api.fs.paste, desc = { long = "Paste from clipboard; cut clipboard has precedence over copy; will prompt for confirmation.", short = "Paste", @@ -249,7 +249,7 @@ local DEFAULT_KEYMAPS = { }, { key = "y", - callback = Api.fs.copy.filename, + callback = api.fs.copy.filename, desc = { long = "Copy name to system clipboard.", short = "Copy Name", @@ -258,7 +258,7 @@ local DEFAULT_KEYMAPS = { }, { key = "Y", - callback = Api.fs.copy.relative_path, + callback = api.fs.copy.relative_path, desc = { long = "Copy relative path to system clipboard.", short = "Copy Relative Path", @@ -267,7 +267,7 @@ local DEFAULT_KEYMAPS = { }, { key = "gy", - callback = Api.fs.copy.absolute_path, + callback = api.fs.copy.absolute_path, desc = { long = "Copy absolute path to system clipboard.", short = "Copy Absolute Path", @@ -276,7 +276,7 @@ local DEFAULT_KEYMAPS = { }, { key = "]e", - callback = Api.node.navigate.diagnostics.next, + callback = api.node.navigate.diagnostics.next, desc = { long = "Go to next diagnostic item.", short = "Next Diagnostic", @@ -285,7 +285,7 @@ local DEFAULT_KEYMAPS = { }, { key = "]c", - callback = Api.node.navigate.git.next, + callback = api.node.navigate.git.next, desc = { long = "Go to next git item.", short = "Next Git", @@ -294,7 +294,7 @@ local DEFAULT_KEYMAPS = { }, { key = "[e", - callback = Api.node.navigate.diagnostics.prev, + callback = api.node.navigate.diagnostics.prev, desc = { long = "Go to prev diagnostic item.", short = "Prev Diagnostic", @@ -303,7 +303,7 @@ local DEFAULT_KEYMAPS = { }, { key = "[c", - callback = Api.node.navigate.git.prev, + callback = api.node.navigate.git.prev, desc = { long = "Go to prev git item.", short = "Prev Git", @@ -312,7 +312,7 @@ local DEFAULT_KEYMAPS = { }, { key = "-", - callback = Api.tree.change_root_to_parent, + callback = api.tree.change_root_to_parent, desc = { long = "Navigate up to the parent directory of the current file/directory.", short = "Up", @@ -321,7 +321,7 @@ local DEFAULT_KEYMAPS = { }, { key = "s", - callback = Api.node.run.system, + callback = api.node.run.system, desc = { long = "Open a file with default system application or a directory with default file manager, using |system_open| option.", short = "Run System", @@ -330,7 +330,7 @@ local DEFAULT_KEYMAPS = { }, { key = "f", - callback = Api.live_filter.start, + callback = api.live_filter.start, desc = { long = "Live filter nodes dynamically based on regex matching.", short = "Filter", @@ -339,7 +339,7 @@ local DEFAULT_KEYMAPS = { }, { key = "F", - callback = Api.live_filter.clear, + callback = api.live_filter.clear, desc = { long = "Clear live filter.", short = "Clean Filter", @@ -348,7 +348,7 @@ local DEFAULT_KEYMAPS = { }, { key = "q", - callback = Api.tree.close, + callback = api.tree.close, desc = { long = "Close tree window.", short = "Close", @@ -357,7 +357,7 @@ local DEFAULT_KEYMAPS = { }, { key = "W", - callback = Api.tree.collapse_all, + callback = api.tree.collapse_all, desc = { long = "Collapse the whole tree.", short = "Collapse", @@ -366,7 +366,7 @@ local DEFAULT_KEYMAPS = { }, { key = "E", - callback = Api.tree.expand_all, + callback = api.tree.expand_all, desc = { long = "Expand the whole tree, stopping after expanding |callbacks.expand_all.max_folder_discovery| directories; this might hang neovim for a while if running on a big directory.", short = "Expand All", @@ -375,7 +375,7 @@ local DEFAULT_KEYMAPS = { }, { key = "S", - callback = Api.tree.search_node, + callback = api.tree.search_node, desc = { long = "Prompt the user to enter a path and then expands the tree to match the path.", short = "Search", @@ -384,7 +384,7 @@ local DEFAULT_KEYMAPS = { }, { key = ".", - callback = Api.node.run.cmd, + callback = api.node.run.cmd, desc = { long = "Enter vim command mode with the file the cursor is on.", short = "Run Command", @@ -393,7 +393,7 @@ local DEFAULT_KEYMAPS = { }, { key = "", - callback = Api.node.show_info_popup, + callback = api.node.show_info_popup, desc = { long = "Toggle a popup with file info about the file under the cursor.", short = "Info", @@ -402,7 +402,7 @@ local DEFAULT_KEYMAPS = { }, { key = "g?", - callback = Api.tree.toggle_help, + callback = api.tree.toggle_help, desc = { long = "Toggle help.", short = "Help", @@ -411,7 +411,7 @@ local DEFAULT_KEYMAPS = { }, { key = "m", - callback = Api.marks.toggle, + callback = api.marks.toggle, desc = { long = "Toggle node in bookmarks.", short = "Toggle Bookmark", @@ -420,7 +420,7 @@ local DEFAULT_KEYMAPS = { }, { key = "bmv", - callback = Api.marks.bulk.move, + callback = api.marks.bulk.move, desc = { long = "Move all bookmarked nodes into specified location.", short = "Move Bookmarked", @@ -430,58 +430,60 @@ local DEFAULT_KEYMAPS = { } -- END_DEFAULT_KEYMAPS +-- stylua: ignore start function M.on_attach_default(bufnr) - vim.keymap.set('n', '', Api.node.open.edit, { desc = 'Open', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'o', Api.node.open.edit, { desc = 'Open', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '<2-LeftMouse>', Api.node.open.edit, { desc = 'Open', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', Api.node.open.replace_tree_buffer, { desc = 'Open: In Place', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'O', Api.node.open.no_window_picker, { desc = 'Open: No Window Picker', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', Api.tree.change_root_to_node, { desc = 'CD', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '<2-RightMouse>', Api.tree.change_root_to_node, { desc = 'CD', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', Api.node.open.vertical, { desc = 'Open: Vertical Split', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', Api.node.open.horizontal, { desc = 'Open: Horizontal Split', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', Api.node.open.tab, { desc = 'Open: New Tab', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '<', Api.node.navigate.sibling.prev, { desc = 'Previous Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '>', Api.node.navigate.sibling.next, { desc = 'Next Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'P', Api.node.navigate.parent, { desc = 'Parent Directory', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', Api.node.navigate.parent_close, { desc = 'Close Directory', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', Api.node.open.preview, { desc = 'Open Preview', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'K', Api.node.navigate.sibling.first, { desc = 'First Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'J', Api.node.navigate.sibling.last, { desc = 'Last Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'I', Api.tree.toggle_gitignore_filter, { desc = 'Toggle Git Ignore', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'H', Api.tree.toggle_hidden_filter, { desc = 'Toggle Dotfiles', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'U', Api.tree.toggle_custom_filter, { desc = 'Toggle Hidden', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'R', Api.tree.reload, { desc = 'Refresh', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'a', Api.fs.create, { desc = 'Create', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'd', Api.fs.remove, { desc = 'Delete', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'D', Api.fs.trash, { desc = 'Trash', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'r', Api.fs.rename, { desc = 'Rename', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', Api.fs.rename_sub, { desc = 'Rename: Omit Filename', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'e', nil, { desc = 'Rename: Basename', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'x', Api.fs.cut, { desc = 'Cut', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'c', Api.fs.copy.node, { desc = 'Copy', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'p', Api.fs.paste, { desc = 'Paste', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'y', Api.fs.copy.filename, { desc = 'Copy Name', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'Y', Api.fs.copy.relative_path, { desc = 'Copy Relative Path', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'gy', Api.fs.copy.absolute_path, { desc = 'Copy Absolute Path', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', ']e', Api.node.navigate.diagnostics.next, { desc = 'Next Diagnostic', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', ']c', Api.node.navigate.git.next, { desc = 'Next Git', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '[e', Api.node.navigate.diagnostics.prev, { desc = 'Prev Diagnostic', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '[c', Api.node.navigate.git.prev, { desc = 'Prev Git', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '-', Api.tree.change_root_to_parent, { desc = 'Up', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 's', Api.node.run.system, { desc = 'Run System', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'f', Api.live_filter.start, { desc = 'Filter', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'F', Api.live_filter.clear, { desc = 'Clean Filter', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'q', Api.tree.close, { desc = 'Close', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'W', Api.tree.collapse_all, { desc = 'Collapse', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'E', Api.tree.expand_all, { desc = 'Expand All', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'S', Api.tree.search_node, { desc = 'Search', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '.', Api.node.run.cmd, { desc = 'Run Command', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', Api.node.show_info_popup, { desc = 'Info', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'g?', Api.tree.toggle_help, { desc = 'Help', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'm', Api.marks.toggle, { desc = 'Toggle Bookmark', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'bmv', Api.marks.bulk.move, { desc = 'Move Bookmarked', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', api.tree.change_root_to_node, { desc = 'CD', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', api.node.open.replace_tree_buffer, { desc = 'Open: In Place', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', api.node.show_info_popup, { desc = 'Info', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', api.fs.rename_sub, { desc = 'Rename: Omit Filename', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', api.node.open.tab, { desc = 'Open: New Tab', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', api.node.open.vertical, { desc = 'Open: Vertical Split', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', api.node.open.horizontal, { desc = 'Open: Horizontal Split', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', api.node.navigate.parent_close, { desc = 'Close Directory', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', api.node.open.edit, { desc = 'Open', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', api.node.open.preview, { desc = 'Open Preview', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '>', api.node.navigate.sibling.next, { desc = 'Next Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '<', api.node.navigate.sibling.prev, { desc = 'Previous Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '.', api.node.run.cmd, { desc = 'Run Command', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '-', api.tree.change_root_to_parent, { desc = 'Up', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'a', api.fs.create, { desc = 'Create', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'bmv', api.marks.bulk.move, { desc = 'Move Bookmarked', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'c', api.fs.copy.node, { desc = 'Copy', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '[c', api.node.navigate.git.prev, { desc = 'Prev Git', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', ']c', api.node.navigate.git.next, { desc = 'Next Git', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'd', api.fs.remove, { desc = 'Delete', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'D', api.fs.trash, { desc = 'Trash', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'E', api.tree.expand_all, { desc = 'Expand All', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'e', api.fs.rename_basename, { desc = 'Rename: Basename', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', ']e', api.node.navigate.diagnostics.next, { desc = 'Next Diagnostic', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '[e', api.node.navigate.diagnostics.prev, { desc = 'Prev Diagnostic', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'F', api.live_filter.clear, { desc = 'Clean Filter', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'f', api.live_filter.start, { desc = 'Filter', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'g?', api.tree.toggle_help, { desc = 'Help', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'gy', api.fs.copy.absolute_path, { desc = 'Copy Absolute Path', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'H', api.tree.toggle_hidden_filter, { desc = 'Toggle Dotfiles', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'I', api.tree.toggle_gitignore_filter, { desc = 'Toggle Git Ignore', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'J', api.node.navigate.sibling.last, { desc = 'Last Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'K', api.node.navigate.sibling.first, { desc = 'First Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'm', api.marks.toggle, { desc = 'Toggle Bookmark', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'o', api.node.open.edit, { desc = 'Open', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'O', api.node.open.no_window_picker, { desc = 'Open: No Window Picker', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'p', api.fs.paste, { desc = 'Paste', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'P', api.node.navigate.parent, { desc = 'Parent Directory', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'q', api.tree.close, { desc = 'Close', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'r', api.fs.rename, { desc = 'Rename', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'R', api.tree.reload, { desc = 'Refresh', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 's', api.node.run.system, { desc = 'Run System', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'S', api.tree.search_node, { desc = 'Search', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'U', api.tree.toggle_custom_filter, { desc = 'Toggle Hidden', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'W', api.tree.collapse_all, { desc = 'Collapse', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'x', api.fs.cut, { desc = 'Cut', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'y', api.fs.copy.filename, { desc = 'Copy Name', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'Y', api.fs.copy.relative_path, { desc = 'Copy Relative Path', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '<2-LeftMouse>', api.node.open.edit, { desc = 'Open', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '<2-RightMouse>', api.tree.change_root_to_node, { desc = 'CD', buffer = bufnr, noremap = true, silent = true, nowait = true }) end +-- stylua: ignore end function M.setup(opts) if type(opts.on_attach) ~= "function" then diff --git a/lua/nvim-tree/renderer/help.lua b/lua/nvim-tree/renderer/help.lua index 3dddd468b12..ad50e4c8635 100644 --- a/lua/nvim-tree/renderer/help.lua +++ b/lua/nvim-tree/renderer/help.lua @@ -22,7 +22,7 @@ end -- sort lhs roughly as per :help index local PAT_MOUSE = "^<.*Mouse" -local PAT_CTRL = "^ Date: Thu, 26 Jan 2023 14:18:35 +1100 Subject: [PATCH 21/42] source default on_attach directly --- doc/nvim-tree-lua.txt | 111 ++++++++++++++------------- lua/nvim-tree/keymap.lua | 6 +- lua/nvim-tree/legacy.lua | 96 +++++++++++------------ scripts/generate_default_keymaps.lua | 19 ----- scripts/update-help.sh | 22 ++++-- 5 files changed, 124 insertions(+), 130 deletions(-) diff --git a/doc/nvim-tree-lua.txt b/doc/nvim-tree-lua.txt index d1a4d733d33..1f3da84627d 100644 --- a/doc/nvim-tree-lua.txt +++ b/doc/nvim-tree-lua.txt @@ -1530,61 +1530,62 @@ DEFAULT MAPPINGS *nvim-tree-default-mappings `bmv` Move Bookmarked Move all bookmarked nodes into specified location. > - local on_attach = function(bufnr) -- BEGIN_ON_ATTACH - local Api = require('nvim-tree.api') - - vim.keymap.set('n', '', Api.node.open.edit, { desc = 'Open', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', 'o', Api.node.open.edit, { desc = 'Open', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', '<2-LeftMouse>', Api.node.open.edit, { desc = 'Open', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', '', Api.node.open.replace_tree_buffer, { desc = 'Open: In Place', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', 'O', Api.node.open.no_window_picker, { desc = 'Open: No Window Picker', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', '', Api.tree.change_root_to_node, { desc = 'CD', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', '<2-RightMouse>', Api.tree.change_root_to_node, { desc = 'CD', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', '', Api.node.open.vertical, { desc = 'Open: Vertical Split', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', '', Api.node.open.horizontal, { desc = 'Open: Horizontal Split', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', '', Api.node.open.tab, { desc = 'Open: New Tab', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', '<', Api.node.navigate.sibling.prev, { desc = 'Previous Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', '>', Api.node.navigate.sibling.next, { desc = 'Next Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', 'P', Api.node.navigate.parent, { desc = 'Parent Directory', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', '', Api.node.navigate.parent_close, { desc = 'Close Directory', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', '', Api.node.open.preview, { desc = 'Open Preview', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', 'K', Api.node.navigate.sibling.first, { desc = 'First Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', 'J', Api.node.navigate.sibling.last, { desc = 'Last Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', 'I', Api.tree.toggle_gitignore_filter, { desc = 'Toggle Git Ignore', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', 'H', Api.tree.toggle_hidden_filter, { desc = 'Toggle Dotfiles', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', 'U', Api.tree.toggle_custom_filter, { desc = 'Toggle Hidden', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', 'R', Api.tree.reload, { desc = 'Refresh', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', 'a', Api.fs.create, { desc = 'Create', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', 'd', Api.fs.remove, { desc = 'Delete', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', 'D', Api.fs.trash, { desc = 'Trash', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', 'r', Api.fs.rename, { desc = 'Rename', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', '', Api.fs.rename_sub, { desc = 'Rename: Omit Filename', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', 'e', Api.fs.rename_basename, { desc = 'Rename: Basename', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', 'x', Api.fs.cut, { desc = 'Cut', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', 'c', Api.fs.copy.node, { desc = 'Copy', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', 'p', Api.fs.paste, { desc = 'Paste', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', 'y', Api.fs.copy.filename, { desc = 'Copy Name', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', 'Y', Api.fs.copy.relative_path, { desc = 'Copy Relative Path', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', 'gy', Api.fs.copy.absolute_path, { desc = 'Copy Absolute Path', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', ']e', Api.node.navigate.diagnostics.next, { desc = 'Next Diagnostic', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', ']c', Api.node.navigate.git.next, { desc = 'Next Git', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', '[e', Api.node.navigate.diagnostics.prev, { desc = 'Prev Diagnostic', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', '[c', Api.node.navigate.git.prev, { desc = 'Prev Git', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', '-', Api.tree.change_root_to_parent, { desc = 'Up', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', 's', Api.node.run.system, { desc = 'Run System', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', 'f', Api.live_filter.start, { desc = 'Filter', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', 'F', Api.live_filter.clear, { desc = 'Clean Filter', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', 'q', Api.tree.close, { desc = 'Close', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', 'W', Api.tree.collapse_all, { desc = 'Collapse', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', 'E', Api.tree.expand_all, { desc = 'Expand All', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', 'S', Api.tree.search_node, { desc = 'Search', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', '.', Api.node.run.cmd, { desc = 'Run Command', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', '', Api.node.show_info_popup, { desc = 'Info', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', 'g?', Api.tree.toggle_help, { desc = 'Help', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', 'm', Api.marks.toggle, { desc = 'Toggle Bookmark', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - vim.keymap.set('n', 'bmv', Api.marks.bulk.move, { desc = 'Move Bookmarked', buffer = bufnr, noremap = true, silent = true, nowait = true, }) - end -- END_ON_ATTACH -< + local on_attach = function(bufnr) + local api = require('nvim-tree.api') + + -- BEGIN_DEFAULT_ON_ATTACH + vim.keymap.set('n', '', api.tree.change_root_to_node, { desc = 'CD', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', api.node.open.replace_tree_buffer, { desc = 'Open: In Place', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', api.node.show_info_popup, { desc = 'Info', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', api.fs.rename_sub, { desc = 'Rename: Omit Filename', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', api.node.open.tab, { desc = 'Open: New Tab', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', api.node.open.vertical, { desc = 'Open: Vertical Split', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', api.node.open.horizontal, { desc = 'Open: Horizontal Split', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', api.node.navigate.parent_close, { desc = 'Close Directory', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', api.node.open.edit, { desc = 'Open', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', api.node.open.preview, { desc = 'Open Preview', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '>', api.node.navigate.sibling.next, { desc = 'Next Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '<', api.node.navigate.sibling.prev, { desc = 'Previous Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '.', api.node.run.cmd, { desc = 'Run Command', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '-', api.tree.change_root_to_parent, { desc = 'Up', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'a', api.fs.create, { desc = 'Create', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'bmv', api.marks.bulk.move, { desc = 'Move Bookmarked', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'c', api.fs.copy.node, { desc = 'Copy', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '[c', api.node.navigate.git.prev, { desc = 'Prev Git', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', ']c', api.node.navigate.git.next, { desc = 'Next Git', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'd', api.fs.remove, { desc = 'Delete', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'D', api.fs.trash, { desc = 'Trash', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'E', api.tree.expand_all, { desc = 'Expand All', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'e', api.fs.rename_basename, { desc = 'Rename: Basename', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', ']e', api.node.navigate.diagnostics.next, { desc = 'Next Diagnostic', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '[e', api.node.navigate.diagnostics.prev, { desc = 'Prev Diagnostic', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'F', api.live_filter.clear, { desc = 'Clean Filter', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'f', api.live_filter.start, { desc = 'Filter', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'g?', api.tree.toggle_help, { desc = 'Help', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'gy', api.fs.copy.absolute_path, { desc = 'Copy Absolute Path', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'H', api.tree.toggle_hidden_filter, { desc = 'Toggle Dotfiles', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'I', api.tree.toggle_gitignore_filter, { desc = 'Toggle Git Ignore', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'J', api.node.navigate.sibling.last, { desc = 'Last Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'K', api.node.navigate.sibling.first, { desc = 'First Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'm', api.marks.toggle, { desc = 'Toggle Bookmark', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'o', api.node.open.edit, { desc = 'Open', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'O', api.node.open.no_window_picker, { desc = 'Open: No Window Picker', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'p', api.fs.paste, { desc = 'Paste', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'P', api.node.navigate.parent, { desc = 'Parent Directory', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'q', api.tree.close, { desc = 'Close', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'r', api.fs.rename, { desc = 'Rename', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'R', api.tree.reload, { desc = 'Refresh', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 's', api.node.run.system, { desc = 'Run System', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'S', api.tree.search_node, { desc = 'Search', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'U', api.tree.toggle_custom_filter, { desc = 'Toggle Hidden', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'W', api.tree.collapse_all, { desc = 'Collapse', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'x', api.fs.cut, { desc = 'Cut', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'y', api.fs.copy.filename, { desc = 'Copy Name', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'Y', api.fs.copy.relative_path, { desc = 'Copy Relative Path', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '<2-LeftMouse>', api.node.open.edit, { desc = 'Open', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '<2-RightMouse>', api.tree.change_root_to_node, { desc = 'CD', buffer = bufnr, noremap = true, silent = true, nowait = true }) + -- END_DEFAULT_ON_ATTACH + end ============================================================================== 7. HIGHLIGHT GROUPS *nvim-tree-highlight* diff --git a/lua/nvim-tree/keymap.lua b/lua/nvim-tree/keymap.lua index 2934b229edb..8d8f99ad1e8 100644 --- a/lua/nvim-tree/keymap.lua +++ b/lua/nvim-tree/keymap.lua @@ -431,7 +431,8 @@ local DEFAULT_KEYMAPS = { -- END_DEFAULT_KEYMAPS -- stylua: ignore start -function M.on_attach_default(bufnr) +function M.default_on_attach(bufnr) + -- BEGIN_DEFAULT_ON_ATTACH vim.keymap.set('n', '', api.tree.change_root_to_node, { desc = 'CD', buffer = bufnr, noremap = true, silent = true, nowait = true }) vim.keymap.set('n', '', api.node.open.replace_tree_buffer, { desc = 'Open: In Place', buffer = bufnr, noremap = true, silent = true, nowait = true }) vim.keymap.set('n', '', api.node.show_info_popup, { desc = 'Info', buffer = bufnr, noremap = true, silent = true, nowait = true }) @@ -482,12 +483,13 @@ function M.on_attach_default(bufnr) vim.keymap.set('n', 'Y', api.fs.copy.relative_path, { desc = 'Copy Relative Path', buffer = bufnr, noremap = true, silent = true, nowait = true }) vim.keymap.set('n', '<2-LeftMouse>', api.node.open.edit, { desc = 'Open', buffer = bufnr, noremap = true, silent = true, nowait = true }) vim.keymap.set('n', '<2-RightMouse>', api.tree.change_root_to_node, { desc = 'CD', buffer = bufnr, noremap = true, silent = true, nowait = true }) + -- END_DEFAULT_ON_ATTACH end -- stylua: ignore end function M.setup(opts) if type(opts.on_attach) ~= "function" then - M.on_attach = M.on_attach_default + M.on_attach = M.default_on_attach else M.on_attach = opts.on_attach end diff --git a/lua/nvim-tree/legacy.lua b/lua/nvim-tree/legacy.lua index cd3dba83f7e..5c9a28e8ff2 100644 --- a/lua/nvim-tree/legacy.lua +++ b/lua/nvim-tree/legacy.lua @@ -10,53 +10,53 @@ local M = { -- BEGIN_LEGACY_CALLBACKS local LEGACY_CALLBACKS = { - edit = "Api.node.open.edit", - edit_in_place = "Api.node.open.replace_tree_buffer", - edit_no_picker = "Api.node.open.no_window_picker", - cd = "Api.tree.change_root_to_node", - vsplit = "Api.node.open.vertical", - split = "Api.node.open.horizontal", - tabnew = "Api.node.open.tab", - prev_sibling = "Api.node.navigate.sibling.prev", - next_sibling = "Api.node.navigate.sibling.next", - parent_node = "Api.node.navigate.parent", - close_node = "Api.node.navigate.parent_close", - preview = "Api.node.open.preview", - first_sibling = "Api.node.navigate.sibling.first", - last_sibling = "Api.node.navigate.sibling.last", - toggle_git_ignored = "Api.tree.toggle_gitignore_filter", - toggle_dotfiles = "Api.tree.toggle_hidden_filter", - toggle_custom = "Api.tree.toggle_custom_filter", - refresh = "Api.tree.reload", - create = "Api.fs.create", - remove = "Api.fs.remove", - trash = "Api.fs.trash", - rename = "Api.fs.rename", - full_rename = "Api.fs.rename_sub", - rename_basename = "Api.fs.rename_basename", - cut = "Api.fs.cut", - copy = "Api.fs.copy.node", - paste = "Api.fs.paste", - copy_name = "Api.fs.copy.filename", - copy_path = "Api.fs.copy.relative_path", - copy_absolute_path = "Api.fs.copy.absolute_path", - next_diag_item = "Api.node.navigate.diagnostics.next", - next_git_item = "Api.node.navigate.git.next", - prev_diag_item = "Api.node.navigate.diagnostics.prev", - prev_git_item = "Api.node.navigate.git.prev", - dir_up = "Api.tree.change_root_to_parent", - system_open = "Api.node.run.system", - live_filter = "Api.live_filter.start", - clear_live_filter = "Api.live_filter.clear", - close = "Api.tree.close", - collapse_all = "Api.tree.collapse_all", - expand_all = "Api.tree.expand_all", - search_node = "Api.tree.search_node", - run_file_command = "Api.node.run.cmd", - toggle_file_info = "Api.node.show_info_popup", - toggle_help = "Api.tree.toggle_help", - toggle_mark = "Api.marks.toggle", - bulk_move = "Api.marks.bulk.move", + edit = "api.node.open.edit", + edit_in_place = "api.node.open.replace_tree_buffer", + edit_no_picker = "api.node.open.no_window_picker", + cd = "api.tree.change_root_to_node", + vsplit = "api.node.open.vertical", + split = "api.node.open.horizontal", + tabnew = "api.node.open.tab", + prev_sibling = "api.node.navigate.sibling.prev", + next_sibling = "api.node.navigate.sibling.next", + parent_node = "api.node.navigate.parent", + close_node = "api.node.navigate.parent_close", + preview = "api.node.open.preview", + first_sibling = "api.node.navigate.sibling.first", + last_sibling = "api.node.navigate.sibling.last", + toggle_git_ignored = "api.tree.toggle_gitignore_filter", + toggle_dotfiles = "api.tree.toggle_hidden_filter", + toggle_custom = "api.tree.toggle_custom_filter", + refresh = "api.tree.reload", + create = "api.fs.create", + remove = "api.fs.remove", + trash = "api.fs.trash", + rename = "api.fs.rename", + full_rename = "api.fs.rename_sub", + rename_basename = "api.fs.rename_basename", + cut = "api.fs.cut", + copy = "api.fs.copy.node", + paste = "api.fs.paste", + copy_name = "api.fs.copy.filename", + copy_path = "api.fs.copy.relative_path", + copy_absolute_path = "api.fs.copy.absolute_path", + next_diag_item = "api.node.navigate.diagnostics.next", + next_git_item = "api.node.navigate.git.next", + prev_diag_item = "api.node.navigate.diagnostics.prev", + prev_git_item = "api.node.navigate.git.prev", + dir_up = "api.tree.change_root_to_parent", + system_open = "api.node.run.system", + live_filter = "api.live_filter.start", + clear_live_filter = "api.live_filter.clear", + close = "api.tree.close", + collapse_all = "api.tree.collapse_all", + expand_all = "api.tree.expand_all", + search_node = "api.tree.search_node", + run_file_command = "api.node.run.cmd", + toggle_file_info = "api.node.show_info_popup", + toggle_help = "api.tree.toggle_help", + toggle_mark = "api.marks.toggle", + bulk_move = "api.marks.bulk.move", } -- END_LEGACY_CALLBACKS @@ -153,7 +153,7 @@ local on_attach = function(bufnr) M.on_attach_lua = string.format("%send\n", M.on_attach_lua) return function(bufnr) - keymap.on_attach_default(bufnr) + keymap.default_on_attach(bufnr) for _, el in pairs(call_list) do if el.action_cb then vim.keymap.set(el.mode or "n", el.key, function() diff --git a/scripts/generate_default_keymaps.lua b/scripts/generate_default_keymaps.lua index a5da3d2e652..ef82758616b 100644 --- a/scripts/generate_default_keymaps.lua +++ b/scripts/generate_default_keymaps.lua @@ -41,25 +41,6 @@ end io.write "\n" io.close(file) --- lua on_attach -file = io.open("/tmp/DEFAULT_KEYMAPS.on_attach.lua", "w") -io.output(file) -io.write " local Api = require('nvim-tree.api')\n\n" -fmt = string.format( - " vim.keymap.set('n', %%-%d.%ds %%-%d.%ds { desc = '%%s', buffer = bufnr, noremap = true, silent = true, nowait = true, })\n", - max_key + 3, - max_key + 3, - max_callback + 1, - max_callback + 1 -) -for _, m in pairs(DEFAULT_KEYMAPS) do - local keys = type(m.key) == "table" and m.key or { m.key } - for _, key in ipairs(keys) do - io.write(string.format(fmt, "'" .. key .. "',", m.callback .. ",", m.desc.short)) - end -end -io.close(file) - -- legacy callback mappings file = io.open("/tmp/LEGACY_CALLBACKS.lua", "w") io.output(file) diff --git a/scripts/update-help.sh b/scripts/update-help.sh index 6385f3d6931..c2e5c4285b9 100755 --- a/scripts/update-help.sh +++ b/scripts/update-help.sh @@ -21,6 +21,22 @@ sed -e "s/^ / /" /tmp/DEFAULT_OPTS.2.lua > /tmp/DEFAULT_OPTS.6.lua sed -i -e "/${begin}/,/${end}/{ /${begin}/{p; r /tmp/DEFAULT_OPTS.6.lua }; /${end}/p; d; }" doc/nvim-tree-lua.txt +# +# DEFAULT_ON_ATTACH +# + +begin="BEGIN_DEFAULT_ON_ATTACH" +end="END_DEFAULT_ON_ATTACH" + +# scrape DEFAULT_ON_ATTACH, indented at 2 +sed -n -e "/${begin}/,/${end}/{ /${begin}/d; /${end}/d; p; }" lua/nvim-tree/keymap.lua > /tmp/DEFAULT_ON_ATTACH.2.lua + +# indent some more +sed -e "s/^ / /" /tmp/DEFAULT_ON_ATTACH.2.lua > /tmp/DEFAULT_ON_ATTACH.4.lua + +# help, indented at 4 +sed -i -e "/${begin}/,/${end}/{ /${begin}/{p; r /tmp/DEFAULT_ON_ATTACH.4.lua + }; /${end}/p; d; }" doc/nvim-tree-lua.txt # # DEFAULT_KEYMAPS @@ -41,12 +57,6 @@ end="END_LEGACY_CALLBACKS" sed -i -e "/${begin}/,/${end}/{ /${begin}/{p; r /tmp/LEGACY_CALLBACKS.lua }; /${end}/p; d }" lua/nvim-tree/legacy.lua -# help on_attach -begin="BEGIN_ON_ATTACH" -end="END_ON_ATTACH" -sed -i -e "/${begin}/,/${end}/{ /${begin}/{p; r /tmp/DEFAULT_KEYMAPS.on_attach.lua - }; /${end}/p; d }" doc/nvim-tree-lua.txt - # help human sed -i -e "/^DEFAULT MAPPINGS/,/^>$/{ /^DEFAULT MAPPINGS/{p; r /tmp/DEFAULT_KEYMAPS.help }; /^>$/p; d }" doc/nvim-tree-lua.txt From c2b9793ab2dd45cd98d59abd6330f2ead58e6d8e Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Thu, 26 Jan 2023 14:33:11 +1100 Subject: [PATCH 22/42] remove human mappings help --- doc/nvim-tree-lua.txt | 52 ---------------------------- scripts/generate_default_keymaps.lua | 15 -------- scripts/update-help.sh | 4 --- 3 files changed, 71 deletions(-) diff --git a/doc/nvim-tree-lua.txt b/doc/nvim-tree-lua.txt index 1f3da84627d..b67d6b4240d 100644 --- a/doc/nvim-tree-lua.txt +++ b/doc/nvim-tree-lua.txt @@ -1477,58 +1477,6 @@ Single left mouse mappings can be achieved via ``. Single right / middle mouse mappings will requre changes to |mousemodel| or |mouse|. DEFAULT MAPPINGS *nvim-tree-default-mappings* - -`` Open Open a file or directory; root will cd to the above directory. -`o` -`<2-LeftMouse>` -`` Open: In Place Open file in place, effectively replacing the tree explorer. -`O` Open: No Window Picker Open file with no window picker. -`` CD cd in the directory under the cursor. -`<2-RightMouse>` -`` Open: Vertical Split Open file in a vertical split. -`` Open: Horizontal Split Open file in a horizontal split. -`` Open: New Tab Open file in a new tab. -`<` Previous Sibling Navigate to the previous sibling. -`>` Next Sibling Navigate to the next sibling -`P` Parent Directory Move cursor to the parent directory. -`` Close Directory Close current opened directory or parent. -`` Open Preview Open file as a preview (keeps the cursor in the tree). -`K` First Sibling Navigate to the first sibling. -`J` Last Sibling Navigate to the last sibling. -`I` Toggle Git Ignore Toggle visibility of files/directories hidden via |git.ignore| option. -`H` Toggle Dotfiles Toggle visibility of dotfiles via |filters.dotfiles| option. -`U` Toggle Hidden Toggle visibility of files/directories hidden via |filters.custom| option. -`R` Refresh Refresh the tree. -`a` Create Create a file; leaving a trailing `/` will add a directory. -`d` Delete Delete a file, prompting for confirmation. -`D` Trash Trash a file via |trash| option. -`r` Rename Rename a file or directory. -`` Rename: Omit Filename Rename a file or directory and omit the filename on input. -`e` Rename: Basename no description -`x` Cut Cut file or directory to cut clipboard. -`c` Copy Copy file or directory to copy clipboard. -`p` Paste Paste from clipboard; cut clipboard has precedence over copy; will prompt for confirmation. -`y` Copy Name Copy name to system clipboard. -`Y` Copy Relative Path Copy relative path to system clipboard. -`gy` Copy Absolute Path Copy absolute path to system clipboard. -`]e` Next Diagnostic Go to next diagnostic item. -`]c` Next Git Go to next git item. -`[e` Prev Diagnostic Go to prev diagnostic item. -`[c` Prev Git Go to prev git item. -`-` Up Navigate up to the parent directory of the current file/directory. -`s` Run System Open a file with default system application or a directory with default file manager, using |system_open| option. -`f` Filter Live filter nodes dynamically based on regex matching. -`F` Clean Filter Clear live filter. -`q` Close Close tree window. -`W` Collapse Collapse the whole tree. -`E` Expand All Expand the whole tree, stopping after expanding |callbacks.expand_all.max_folder_discovery| directories; this might hang neovim for a while if running on a big directory. -`S` Search Prompt the user to enter a path and then expands the tree to match the path. -`.` Run Command Enter vim command mode with the file the cursor is on. -`` Info Toggle a popup with file info about the file under the cursor. -`g?` Help Toggle help. -`m` Toggle Bookmark Toggle node in bookmarks. -`bmv` Move Bookmarked Move all bookmarked nodes into specified location. - > local on_attach = function(bufnr) local api = require('nvim-tree.api') diff --git a/scripts/generate_default_keymaps.lua b/scripts/generate_default_keymaps.lua index ef82758616b..168298808ab 100644 --- a/scripts/generate_default_keymaps.lua +++ b/scripts/generate_default_keymaps.lua @@ -26,21 +26,6 @@ for _, m in pairs(DEFAULT_KEYMAPS) do max_callback = math.max(#m.callback, max_callback) end --- help -local file = io.open("/tmp/DEFAULT_KEYMAPS.help", "w") -io.output(file) -io.write "\n" -local fmt = string.format("%%-%d.%ds %%-%d.%ds %%s\n", max_key, max_key, max_short, max_short) -for _, m in pairs(outs_help) do - if not m.short then - io.write(string.format("%s\n", m.key)) - else - io.write(string.format(fmt, m.key, m.short, m.long)) - end -end -io.write "\n" -io.close(file) - -- legacy callback mappings file = io.open("/tmp/LEGACY_CALLBACKS.lua", "w") io.output(file) diff --git a/scripts/update-help.sh b/scripts/update-help.sh index c2e5c4285b9..11438030440 100755 --- a/scripts/update-help.sh +++ b/scripts/update-help.sh @@ -57,7 +57,3 @@ end="END_LEGACY_CALLBACKS" sed -i -e "/${begin}/,/${end}/{ /${begin}/{p; r /tmp/LEGACY_CALLBACKS.lua }; /${end}/p; d }" lua/nvim-tree/legacy.lua -# help human -sed -i -e "/^DEFAULT MAPPINGS/,/^>$/{ /^DEFAULT MAPPINGS/{p; r /tmp/DEFAULT_KEYMAPS.help - }; /^>$/p; d }" doc/nvim-tree-lua.txt - From 43d190080f37cc3e35c96f4bb4f9bd54354ec240 Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Thu, 26 Jan 2023 16:34:21 +1100 Subject: [PATCH 23/42] simplified on_attach generation --- lua/nvim-tree/api.lua | 2 +- lua/nvim-tree/keymap.lua | 430 --------------------------- lua/nvim-tree/legacy.lua | 227 ++++++-------- scripts/generate_default_keymaps.lua | 37 --- scripts/update-help.sh | 23 +- 5 files changed, 88 insertions(+), 631 deletions(-) delete mode 100644 scripts/generate_default_keymaps.lua diff --git a/lua/nvim-tree/api.lua b/lua/nvim-tree/api.lua index 720436815f2..1be50ae89f4 100644 --- a/lua/nvim-tree/api.lua +++ b/lua/nvim-tree/api.lua @@ -168,7 +168,7 @@ Api.marks.navigate.next = require("nvim-tree.marks.navigation").next Api.marks.navigate.prev = require("nvim-tree.marks.navigation").prev Api.marks.navigate.select = require("nvim-tree.marks.navigation").select --- TODO #1579 +-- TODO #1579 source from LEGACY_MAPPINGS -- Api.config.mappings.active = require("nvim-tree.actions").active_mappings_clone -- Api.config.mappings.default = require("nvim-tree.actions").default_mappings_clone diff --git a/lua/nvim-tree/keymap.lua b/lua/nvim-tree/keymap.lua index 8d8f99ad1e8..169e9017cc6 100644 --- a/lua/nvim-tree/keymap.lua +++ b/lua/nvim-tree/keymap.lua @@ -2,434 +2,6 @@ local api = require "nvim-tree.api" local M = {} --- BEGIN_DEFAULT_KEYMAPS -local DEFAULT_KEYMAPS = { - { - key = { "", "o", "<2-LeftMouse>" }, - callback = api.node.open.edit, - desc = { - long = "Open a file or directory; root will cd to the above directory.", - short = "Open", - }, - legacy_action = "edit", - }, - { - key = "", - callback = api.node.open.replace_tree_buffer, - desc = { - long = "Open file in place, effectively replacing the tree explorer.", - short = "Open: In Place", - }, - legacy_action = "edit_in_place", - }, - { - key = "O", - callback = api.node.open.no_window_picker, - desc = { - long = "Open file with no window picker.", - short = "Open: No Window Picker", - }, - legacy_action = "edit_no_picker", - }, - { - key = { "", "<2-RightMouse>" }, - callback = api.tree.change_root_to_node, - desc = { - long = "cd in the directory under the cursor.", - short = "CD", - }, - legacy_action = "cd", - }, - { - key = "", - callback = api.node.open.vertical, - desc = { - long = "Open file in a vertical split.", - short = "Open: Vertical Split", - }, - legacy_action = "vsplit", - }, - { - key = "", - callback = api.node.open.horizontal, - desc = { - long = "Open file in a horizontal split.", - short = "Open: Horizontal Split", - }, - legacy_action = "split", - }, - { - key = "", - callback = api.node.open.tab, - desc = { - long = "Open file in a new tab.", - short = "Open: New Tab", - }, - legacy_action = "tabnew", - }, - { - key = "<", - callback = api.node.navigate.sibling.prev, - desc = { - long = "Navigate to the previous sibling.", - short = "Previous Sibling", - }, - legacy_action = "prev_sibling", - }, - { - key = ">", - callback = api.node.navigate.sibling.next, - desc = { - long = "Navigate to the next sibling", - short = "Next Sibling", - }, - legacy_action = "next_sibling", - }, - { - key = "P", - callback = api.node.navigate.parent, - desc = { - long = "Move cursor to the parent directory.", - short = "Parent Directory", - }, - legacy_action = "parent_node", - }, - { - key = "", - callback = api.node.navigate.parent_close, - desc = { - long = "Close current opened directory or parent.", - short = "Close Directory", - }, - legacy_action = "close_node", - }, - { - key = "", - callback = api.node.open.preview, - desc = { - long = "Open file as a preview (keeps the cursor in the tree).", - short = "Open Preview", - }, - legacy_action = "preview", - }, - { - key = "K", - callback = api.node.navigate.sibling.first, - desc = { - long = "Navigate to the first sibling.", - short = "First Sibling", - }, - legacy_action = "first_sibling", - }, - { - key = "J", - callback = api.node.navigate.sibling.last, - desc = { - long = "Navigate to the last sibling.", - short = "Last Sibling", - }, - legacy_action = "last_sibling", - }, - { - key = "I", - callback = api.tree.toggle_gitignore_filter, - desc = { - long = "Toggle visibility of files/directories hidden via |git.ignore| option.", - short = "Toggle Git Ignore", - }, - legacy_action = "toggle_git_ignored", - }, - { - key = "H", - callback = api.tree.toggle_hidden_filter, - desc = { - long = "Toggle visibility of dotfiles via |filters.dotfiles| option.", - short = "Toggle Dotfiles", - }, - legacy_action = "toggle_dotfiles", - }, - { - key = "U", - callback = api.tree.toggle_custom_filter, - desc = { - long = "Toggle visibility of files/directories hidden via |filters.custom| option.", - short = "Toggle Hidden", - }, - legacy_action = "toggle_custom", - }, - { - key = "R", - callback = api.tree.reload, - desc = { - long = "Refresh the tree.", - short = "Refresh", - }, - legacy_action = "refresh", - }, - { - key = "a", - callback = api.fs.create, - desc = { - long = "Create a file; leaving a trailing `/` will add a directory.", - short = "Create", - }, - legacy_action = "create", - }, - { - key = "d", - callback = api.fs.remove, - desc = { - long = "Delete a file, prompting for confirmation.", - short = "Delete", - }, - legacy_action = "remove", - }, - { - key = "D", - callback = api.fs.trash, - desc = { - long = "Trash a file via |trash| option.", - short = "Trash", - }, - legacy_action = "trash", - }, - { - key = "r", - callback = api.fs.rename, - desc = { - long = "Rename a file or directory.", - short = "Rename", - }, - legacy_action = "rename", - }, - { - key = "", - callback = api.fs.rename_sub, - desc = { - long = "Rename a file or directory and omit the filename on input.", - short = "Rename: Omit Filename", - }, - legacy_action = "full_rename", - }, - { - key = "e", - callback = api.fs.rename_basename, - desc = { - long = "no description", - short = "Rename: Basename", - }, - legacy_action = "rename_basename", - }, - { - key = "x", - callback = api.fs.cut, - desc = { - long = "Cut file or directory to cut clipboard.", - short = "Cut", - }, - legacy_action = "cut", - }, - { - key = "c", - callback = api.fs.copy.node, - desc = { - long = "Copy file or directory to copy clipboard.", - short = "Copy", - }, - legacy_action = "copy", - }, - { - key = "p", - callback = api.fs.paste, - desc = { - long = "Paste from clipboard; cut clipboard has precedence over copy; will prompt for confirmation.", - short = "Paste", - }, - legacy_action = "paste", - }, - { - key = "y", - callback = api.fs.copy.filename, - desc = { - long = "Copy name to system clipboard.", - short = "Copy Name", - }, - legacy_action = "copy_name", - }, - { - key = "Y", - callback = api.fs.copy.relative_path, - desc = { - long = "Copy relative path to system clipboard.", - short = "Copy Relative Path", - }, - legacy_action = "copy_path", - }, - { - key = "gy", - callback = api.fs.copy.absolute_path, - desc = { - long = "Copy absolute path to system clipboard.", - short = "Copy Absolute Path", - }, - legacy_action = "copy_absolute_path", - }, - { - key = "]e", - callback = api.node.navigate.diagnostics.next, - desc = { - long = "Go to next diagnostic item.", - short = "Next Diagnostic", - }, - legacy_action = "next_diag_item", - }, - { - key = "]c", - callback = api.node.navigate.git.next, - desc = { - long = "Go to next git item.", - short = "Next Git", - }, - legacy_action = "next_git_item", - }, - { - key = "[e", - callback = api.node.navigate.diagnostics.prev, - desc = { - long = "Go to prev diagnostic item.", - short = "Prev Diagnostic", - }, - legacy_action = "prev_diag_item", - }, - { - key = "[c", - callback = api.node.navigate.git.prev, - desc = { - long = "Go to prev git item.", - short = "Prev Git", - }, - legacy_action = "prev_git_item", - }, - { - key = "-", - callback = api.tree.change_root_to_parent, - desc = { - long = "Navigate up to the parent directory of the current file/directory.", - short = "Up", - }, - legacy_action = "dir_up", - }, - { - key = "s", - callback = api.node.run.system, - desc = { - long = "Open a file with default system application or a directory with default file manager, using |system_open| option.", - short = "Run System", - }, - legacy_action = "system_open", - }, - { - key = "f", - callback = api.live_filter.start, - desc = { - long = "Live filter nodes dynamically based on regex matching.", - short = "Filter", - }, - legacy_action = "live_filter", - }, - { - key = "F", - callback = api.live_filter.clear, - desc = { - long = "Clear live filter.", - short = "Clean Filter", - }, - legacy_action = "clear_live_filter", - }, - { - key = "q", - callback = api.tree.close, - desc = { - long = "Close tree window.", - short = "Close", - }, - legacy_action = "close", - }, - { - key = "W", - callback = api.tree.collapse_all, - desc = { - long = "Collapse the whole tree.", - short = "Collapse", - }, - legacy_action = "collapse_all", - }, - { - key = "E", - callback = api.tree.expand_all, - desc = { - long = "Expand the whole tree, stopping after expanding |callbacks.expand_all.max_folder_discovery| directories; this might hang neovim for a while if running on a big directory.", - short = "Expand All", - }, - legacy_action = "expand_all", - }, - { - key = "S", - callback = api.tree.search_node, - desc = { - long = "Prompt the user to enter a path and then expands the tree to match the path.", - short = "Search", - }, - legacy_action = "search_node", - }, - { - key = ".", - callback = api.node.run.cmd, - desc = { - long = "Enter vim command mode with the file the cursor is on.", - short = "Run Command", - }, - legacy_action = "run_file_command", - }, - { - key = "", - callback = api.node.show_info_popup, - desc = { - long = "Toggle a popup with file info about the file under the cursor.", - short = "Info", - }, - legacy_action = "toggle_file_info", - }, - { - key = "g?", - callback = api.tree.toggle_help, - desc = { - long = "Toggle help.", - short = "Help", - }, - legacy_action = "toggle_help", - }, - { - key = "m", - callback = api.marks.toggle, - desc = { - long = "Toggle node in bookmarks.", - short = "Toggle Bookmark", - }, - legacy_action = "toggle_mark", - }, - { - key = "bmv", - callback = api.marks.bulk.move, - desc = { - long = "Move all bookmarked nodes into specified location.", - short = "Move Bookmarked", - }, - legacy_action = "bulk_move", - }, -} --- END_DEFAULT_KEYMAPS - -- stylua: ignore start function M.default_on_attach(bufnr) -- BEGIN_DEFAULT_ON_ATTACH @@ -495,6 +67,4 @@ function M.setup(opts) end end -M.DEFAULT_KEYMAPS = DEFAULT_KEYMAPS - return M diff --git a/lua/nvim-tree/legacy.lua b/lua/nvim-tree/legacy.lua index 5c9a28e8ff2..38471fd8d36 100644 --- a/lua/nvim-tree/legacy.lua +++ b/lua/nvim-tree/legacy.lua @@ -1,64 +1,21 @@ +local api = require "nvim-tree.api" local utils = require "nvim-tree.utils" local notify = require "nvim-tree.notify" local open_file = require "nvim-tree.actions.node.open-file" local keymap = require "nvim-tree.keymap" -local log = require "nvim-tree.log" local M = { on_attach_lua = "", } --- BEGIN_LEGACY_CALLBACKS -local LEGACY_CALLBACKS = { - edit = "api.node.open.edit", - edit_in_place = "api.node.open.replace_tree_buffer", - edit_no_picker = "api.node.open.no_window_picker", - cd = "api.tree.change_root_to_node", - vsplit = "api.node.open.vertical", - split = "api.node.open.horizontal", - tabnew = "api.node.open.tab", - prev_sibling = "api.node.navigate.sibling.prev", - next_sibling = "api.node.navigate.sibling.next", - parent_node = "api.node.navigate.parent", - close_node = "api.node.navigate.parent_close", - preview = "api.node.open.preview", - first_sibling = "api.node.navigate.sibling.first", - last_sibling = "api.node.navigate.sibling.last", - toggle_git_ignored = "api.tree.toggle_gitignore_filter", - toggle_dotfiles = "api.tree.toggle_hidden_filter", - toggle_custom = "api.tree.toggle_custom_filter", - refresh = "api.tree.reload", - create = "api.fs.create", - remove = "api.fs.remove", - trash = "api.fs.trash", - rename = "api.fs.rename", - full_rename = "api.fs.rename_sub", - rename_basename = "api.fs.rename_basename", - cut = "api.fs.cut", - copy = "api.fs.copy.node", - paste = "api.fs.paste", - copy_name = "api.fs.copy.filename", - copy_path = "api.fs.copy.relative_path", - copy_absolute_path = "api.fs.copy.absolute_path", - next_diag_item = "api.node.navigate.diagnostics.next", - next_git_item = "api.node.navigate.git.next", - prev_diag_item = "api.node.navigate.diagnostics.prev", - prev_git_item = "api.node.navigate.git.prev", - dir_up = "api.tree.change_root_to_parent", - system_open = "api.node.run.system", - live_filter = "api.live_filter.start", - clear_live_filter = "api.live_filter.clear", - close = "api.tree.close", - collapse_all = "api.tree.collapse_all", - expand_all = "api.tree.expand_all", - search_node = "api.tree.search_node", - run_file_command = "api.node.run.cmd", - toggle_file_info = "api.node.show_info_popup", - toggle_help = "api.tree.toggle_help", - toggle_mark = "api.marks.toggle", - bulk_move = "api.marks.bulk.move", +-- TODO complete list from DEFAULT_MAPPINGS from actions/init.lua +local LEGACY_MAPPINGS = { + close_node = { + key = "", + fn = api.node.navigate.parent_close, + t = "api.node.navigate.parent_close", + }, } --- END_LEGACY_CALLBACKS local function refactored(opts) -- mapping actions @@ -117,113 +74,99 @@ local function removed(opts) opts.create_in_closed_folder = nil end --- TODO pcall vim.keymap.del("n", key, opts) for action = "" and remove_keymaps -local function build_on_attach(call_list) - if #call_list == 0 then - return nil - end - - M.on_attach_lua = [[ -local api = require('nvim-tree.api') - -local on_attach = function(bufnr) -]] - - for _, el in pairs(call_list) do - local vim_keymap_set - if el.action_cb then - vim_keymap_set = string.format( - 'vim.keymap.set("n", "%s", function()\n local node = api.tree.get_node_under_cursor()\n -- my code\n end, { desc = "my description", buffer = bufnr, noremap = true, silent = true, nowait = true })', - el.key - ) - elseif el.keymap then - vim_keymap_set = string.format( - "vim.keymap.set('n', '%s', %s, { desc = '%s', buffer = bufnr, noremap = true, silent = true, nowait = true })", - el.key, - LEGACY_CALLBACKS[el.keymap.legacy_action], - el.keymap.desc.short - ) +local function generate_on_attach_function(list, remove_keys, remove_defaults) + return function(bufnr) + -- apply defaults first + if not remove_defaults then + keymap.default_on_attach(bufnr) end - if vim_keymap_set then - log.line("config", "generated %s", vim_keymap_set) - M.on_attach_lua = string.format("%s %s\n", M.on_attach_lua, vim_keymap_set) + -- explicit removals + for _, key in ipairs(remove_keys) do + vim.keymap.set("n", key, "", { buffer = bufnr }) + vim.keymap.del("n", key, { buffer = bufnr }) end - end - M.on_attach_lua = string.format("%send\n", M.on_attach_lua) - return function(bufnr) - keymap.default_on_attach(bufnr) - for _, el in pairs(call_list) do - if el.action_cb then - vim.keymap.set(el.mode or "n", el.key, function() - el.action_cb(require("nvim-tree.api").tree.get_node_under_cursor()) - end, { buffer = bufnr, remap = false, silent = true }) - elseif el.keymap then - vim.keymap.set( - el.mode or "n", - el.key, - el.keymap.callback, - { buffer = bufnr, remap = false, silent = true, desc = el.keymap.desc.short } - ) + -- mappings + for _, m in ipairs(list) do + local keys = type(m.key) == "table" and m.key or { m.key } + for _, k in ipairs(keys) do + if LEGACY_MAPPINGS[m.action] then + -- straight action + vim.keymap.set( + m.mode or "n", + k, + LEGACY_MAPPINGS[m.action].fn, + { desc = m.action, buffer = bufnr, noremap = true, silent = true, nowait = true } + ) + elseif type(m.action_cb) == "function" then + -- action_cb + vim.keymap.set(m.mode or "n", k, function() + m.action_cb(api.tree.get_node_under_cursor()) + end, { desc = m.action, buffer = bufnr, noremap = true, silent = true, nowait = true }) + end end end end end -function M.generate_legacy_on_attach(opts) - if type(opts.on_attach) ~= "function" and opts.view and opts.view.mappings and opts.view.mappings.list and #opts.view.mappings.list > 0 then - local list = opts.view.mappings.list - log.line("config", "generating on_attach for %d legacy view.mappings.list:", #list) +local function generate_on_attach_lua(list, remove_keys, remove_defaults) + local lua = [[ +local api = require('nvim-tree.api') - if opts.view.mappings.custom_only then - opts.remove_keymaps = true - opts.view.mappings.custom_only = nil - end +local on_attach = function(bufnr)]] - if list then - local keymap_by_legacy_action = utils.key_by(keymap.DEFAULT_KEYMAPS, "legacy_action") - local call_list = {} + -- TODO generate from LEGACY_MAPPINGS; text table from default_on_attach is not worth the effort - for _, km in ipairs(keymap.DEFAULT_KEYMAPS) do - local keys = type(km.key) == "table" and km.key or { km.key } - for _, k in ipairs(keys) do - table.insert(call_list, { mode = "n", key = k, keymap = km }) - end - end - - for _, map in pairs(list) do - local keys = type(map.key) == "table" and map.key or { map.key } - local mode = map.mode or "n" - local action_cb - local km - if map.action ~= "" then - if map.action_cb then - action_cb = map.action_cb - elseif keymap_by_legacy_action[map.action] then - km = keymap_by_legacy_action[map.action] - end - end + -- explicit removals + if #remove_keys > 0 then + lua = lua .. "\n\n -- remove_keys" + end + for _, key in ipairs(remove_keys) do + lua = lua .. "\n" .. string.format([[ vim.keymap.set('n', '%s', '', { buffer = bufnr })]], key) + lua = lua .. "\n" .. string.format([[ vim.keymap.del('n', '%s', { buffer = bufnr })]], key) + end - for _, k in pairs(keys) do - if map.action == "" and opts.remove_keymaps ~= true then - if type(opts.remove_keymaps) ~= "table" then - opts.remove_keymaps = {} - end - table.insert(opts.remove_keymaps, k) - end - - if action_cb then - table.insert(call_list, { mode = mode, key = k, action_cb = action_cb }) - elseif km then - table.insert(call_list, { mode = mode, key = k, keymap = km }) - end - end + -- list + if #list > 0 then + lua = lua .. "\n\n -- view.mappings.list" + end + for _, m in ipairs(list) do + local keys = type(m.key) == "table" and m.key or { m.key } + for _, k in ipairs(keys) do + if LEGACY_MAPPINGS[m.action] then + lua = lua .. "\n" .. string.format([[ vim.keymap.set('%s', '%s', %s, { desc = '%s', buffer = bufnr, noremap = true, silent = true, nowait = true })]], m.mode or "n", k, LEGACY_MAPPINGS[m.action].t, m.action) + elseif type(m.action_cb) == "function" then + lua = lua .. "\n" .. string.format([[ vim.keymap.set('%s', '%s', function()]], m.mode or "n", k) + lua = lua .. "\n" .. string.format([[ local node = api.tree.get_node_under_cursor()]]) + lua = lua .. "\n" .. string.format([[ -- your code goes here]]) + lua = lua .. "\n" .. string.format([[ end, { desc = '%s', buffer = bufnr, noremap = true, silent = true, nowait = true })]], m.action) end - opts.on_attach = build_on_attach(call_list) - opts.view.mappings.list = nil end end + + lua = lua .. "\nend" + + return lua +end + +function M.generate_legacy_on_attach(opts) + if type(opts.on_attach) == "function" then + return + end + + local list = opts.view and opts.view.mappings and opts.view.mappings.list or {} + local remove_keys = type(opts.remove_keymaps) == "table" and opts.remove_keymaps or {} + local remove_defaults = opts.remove_keymaps == true + or opts.view and opts.view.mappings and opts.view.mappings.custom_only + + -- do nothing unless the user has configured something + if #list == 0 and #remove_keys == 0 and not remove_defaults then + return + end + + opts.on_attach = generate_on_attach_function(list, remove_keys, remove_defaults) + M.on_attach_lua = generate_on_attach_lua(list, remove_keys, remove_defaults) end function M.generate_on_attach() diff --git a/scripts/generate_default_keymaps.lua b/scripts/generate_default_keymaps.lua deleted file mode 100644 index 168298808ab..00000000000 --- a/scripts/generate_default_keymaps.lua +++ /dev/null @@ -1,37 +0,0 @@ --- luacheck:ignore 113 ----@diagnostic disable: undefined-global - --- write DEFAULT_KEYMAPS in various formats - -local max_key = 0 -local max_short = 0 -local max_callback = 0 -local outs_help = {} - -for _, m in pairs(DEFAULT_KEYMAPS) do - local first = true - local keys = type(m.key) == "table" and m.key or { m.key } - for _, key in ipairs(keys) do - local out = {} - out.key = string.format("`%s`", key) - max_key = math.max(#out.key, max_key) - if first then - out.short = m.desc.short - max_short = math.max(#out.short, max_short) - out.long = m.desc.long - first = false - end - table.insert(outs_help, out) - end - max_callback = math.max(#m.callback, max_callback) -end - --- legacy callback mappings -file = io.open("/tmp/LEGACY_CALLBACKS.lua", "w") -io.output(file) -io.write "local LEGACY_CALLBACKS = {\n" -for _, m in pairs(DEFAULT_KEYMAPS) do - io.write(string.format(' %s = "%s",\n', m.legacy_action, m.callback)) -end -io.write "}\n" -io.close(file) diff --git a/scripts/update-help.sh b/scripts/update-help.sh index 11438030440..9f8c403201b 100755 --- a/scripts/update-help.sh +++ b/scripts/update-help.sh @@ -1,8 +1,8 @@ #!/bin/sh -# run after changing nvim-tree.lua DEFAULT_OPTS or nvim-tree/actions/init.lua M.mappings +# run after changing nvim-tree.lua DEFAULT_OPTS or nvim-tree/keymap.lua M.default_on_attach # scrapes and updates nvim-tree-lua.txt -# run from repository root: scripts/update-default-opts.sh +# run from repository root: scripts/update-help.sh # @@ -38,22 +38,3 @@ sed -e "s/^ / /" /tmp/DEFAULT_ON_ATTACH.2.lua > /tmp/DEFAULT_ON_ATTACH.4.lua sed -i -e "/${begin}/,/${end}/{ /${begin}/{p; r /tmp/DEFAULT_ON_ATTACH.4.lua }; /${end}/p; d; }" doc/nvim-tree-lua.txt -# -# DEFAULT_KEYMAPS -# - -begin="BEGIN_DEFAULT_KEYMAPS" -end="END_DEFAULT_KEYMAPS" - -# scrape DEFAULT_KEYMAPS -sed -n -e "/${begin}/,/${end}/{ /${begin}/d; /${end}/d; s/callback = \(.*\),/callback = '\1',/g; p; }" lua/nvim-tree/keymap.lua > /tmp/DEFAULT_KEYMAPS.M.lua - -# generate /tmp/DEFAULT_KEYMAPS.on_attach.lua, /tmp/DEFAULT_KEYMAPS.help and /tmp/LEGACY_CALLBACKS.lua -cat /tmp/DEFAULT_KEYMAPS.M.lua scripts/generate_default_keymaps.lua | lua - -# legacy.lua LEGACY_CALLBACKS -begin="BEGIN_LEGACY_CALLBACKS" -end="END_LEGACY_CALLBACKS" -sed -i -e "/${begin}/,/${end}/{ /${begin}/{p; r /tmp/LEGACY_CALLBACKS.lua - }; /${end}/p; d }" lua/nvim-tree/legacy.lua - From c35027bc4146554996bc8d51975ecf9bccac298d Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Sun, 29 Jan 2023 15:54:42 +1100 Subject: [PATCH 24/42] simplified on_attach generation --- lua/nvim-tree/legacy.lua | 83 +++++++++++++++++++++++++++++++++------- 1 file changed, 69 insertions(+), 14 deletions(-) diff --git a/lua/nvim-tree/legacy.lua b/lua/nvim-tree/legacy.lua index 38471fd8d36..4268c796552 100644 --- a/lua/nvim-tree/legacy.lua +++ b/lua/nvim-tree/legacy.lua @@ -8,14 +8,56 @@ local M = { on_attach_lua = "", } --- TODO complete list from DEFAULT_MAPPINGS from actions/init.lua +-- stylua: ignore start local LEGACY_MAPPINGS = { - close_node = { - key = "", - fn = api.node.navigate.parent_close, - t = "api.node.navigate.parent_close", - }, + edit = { key = { "", "o", "<2-LeftMouse>" }, desc = "Open", fn = api.node.open.edit, n = "api.node.open.edit" }, + edit_in_place = { key = "", desc = "Open: In Place", fn = api.node.open.replace_tree_buffer, n = "api.node.open.replace_tree_buffer" }, + edit_no_picker = { key = "O", desc = "Open: No Window Picker", fn = api.node.open.no_window_picker, n = "api.node.open.no_window_picker" }, + cd = { key = { "", "<2-RightMouse>" }, desc = "CD", fn = api.tree.change_root_to_node, n = "api.tree.change_root_to_node" }, + vsplit = { key = "", desc = "Open: Vertical Split", fn = api.node.open.vertical, n = "api.node.open.vertical" }, + split = { key = "", desc = "Open: Horizontal Split", fn = api.node.open.horizontal, n = "api.node.open.horizontal" }, + tabnew = { key = "", desc = "Open: New Tab", fn = api.node.open.tab, n = "api.node.open.tab" }, + prev_sibling = { key = "<", desc = "Previous Sibling", fn = api.node.navigate.sibling.prev, n = "api.node.navigate.sibling.prev" }, + next_sibling = { key = ">", desc = "Next Sibling", fn = api.node.navigate.sibling.next, n = "api.node.navigate.sibling.next" }, + parent_node = { key = "P", desc = "Parent Directory", fn = api.node.navigate.parent, n = "api.node.navigate.parent" }, + close_node = { key = "", desc = "Close Directory", fn = api.node.navigate.parent_close, n = "api.node.navigate.parent_close" }, + preview = { key = "", desc = "Open Preview", fn = api.node.open.preview, n = "api.node.open.preview" }, + first_sibling = { key = "K", desc = "First Sibling", fn = api.node.navigate.sibling.first, n = "api.node.navigate.sibling.first" }, + last_sibling = { key = "J", desc = "Last Sibling", fn = api.node.navigate.sibling.last, n = "api.node.navigate.sibling.last" }, + toggle_git_ignored = { key = "I", desc = "Toggle Git Ignore", fn = api.tree.toggle_gitignore_filter, n = "api.tree.toggle_gitignore_filter" }, + toggle_dotfiles = { key = "H", desc = "Toggle Dotfiles", fn = api.tree.toggle_hidden_filter, n = "api.tree.toggle_hidden_filter" }, + toggle_custom = { key = "U", desc = "Toggle Hidden", fn = api.tree.toggle_custom_filter, n = "api.tree.toggle_custom_filter" }, + refresh = { key = "R", desc = "Refresh", fn = api.tree.reload, n = "api.tree.reload" }, + create = { key = "a", desc = "Create", fn = api.fs.create, n = "api.fs.create" }, + remove = { key = "d", desc = "Delete", fn = api.fs.remove, n = "api.fs.remove" }, + trash = { key = "D", desc = "Trash", fn = api.fs.trash, n = "api.fs.trash" }, + rename = { key = "r", desc = "Rename", fn = api.fs.rename, n = "api.fs.rename" }, + full_rename = { key = "", desc = "Rename: Omit Filename", fn = api.fs.rename_sub, n = "api.fs.rename_sub" }, + cut = { key = "x", desc = "Cut", fn = api.fs.cut, n = "api.fs.cut" }, + copy = { key = "c", desc = "Copy", fn = api.fs.copy.node, n = "api.fs.copy.node" }, + paste = { key = "p", desc = "Paste", fn = api.fs.paste, n = "api.fs.paste" }, + copy_name = { key = "y", desc = "Copy Name", fn = api.fs.copy.filename, n = "api.fs.copy.filename" }, + copy_path = { key = "Y", desc = "Copy Relative Path", fn = api.fs.copy.relative_path, n = "api.fs.copy.relative_path" }, + copy_absolute_path = { key = "gy", desc = "Copy Absolute Path", fn = api.fs.copy.absolute_path, n = "api.fs.copy.absolute_path" }, + next_diag_item = { key = "]e", desc = "Next Diagnostic", fn = api.node.navigate.diagnostics.next, n = "api.node.navigate.diagnostics.next" }, + next_git_item = { key = "]c", desc = "Next Git", fn = api.node.navigate.git.next, n = "api.node.navigate.git.next" }, + prev_diag_item = { key = "[e", desc = "Prev Diagnostic", fn = api.node.navigate.diagnostics.prev, n = "api.node.navigate.diagnostics.prev" }, + prev_git_item = { key = "[c", desc = "Prev Git", fn = api.node.navigate.git.prev, n = "api.node.navigate.git.prev" }, + dir_up = { key = "-", desc = "Up", fn = api.tree.change_root_to_parent, n = "api.tree.change_root_to_parent" }, + system_open = { key = "s", desc = "Run System", fn = api.node.run.system, n = "api.node.run.system" }, + live_filter = { key = "f", desc = "Filter", fn = api.live_filter.start, n = "api.live_filter.start" }, + clear_live_filter = { key = "F", desc = "Clean Filter", fn = api.live_filter.clear, n = "api.live_filter.clear" }, + close = { key = "q", desc = "Close", fn = api.tree.close, n = "api.tree.close" }, + collapse_all = { key = "W", desc = "Collapse", fn = api.tree.collapse_all, n = "api.tree.collapse_all" }, + expand_all = { key = "E", desc = "Expand All", fn = api.tree.expand_all, n = "api.tree.expand_all" }, + search_node = { key = "S", desc = "Search", fn = api.tree.search_node, n = "api.tree.search_node" }, + run_file_command = { key = ".", desc = "Run Command", fn = api.node.run.cmd, n = "api.node.run.cmd" }, + toggle_file_info = { key = "", desc = "Info", fn = api.node.show_info_popup, n = "api.node.show_info_popup" }, + toggle_help = { key = "g?", desc = "Help", fn = api.tree.toggle_help, n = "api.tree.toggle_help" }, + toggle_mark = { key = "m", desc = "Toggle Bookmark", fn = api.marks.toggle, n = "api.marks.toggle" }, + bulk_move = { key = "bmv", desc = "Move Bookmarked", fn = api.marks.bulk.move, n = "api.marks.bulk.move" }, } +-- stylua: ignore end local function refactored(opts) -- mapping actions @@ -110,13 +152,13 @@ local function generate_on_attach_function(list, remove_keys, remove_defaults) end end -local function generate_on_attach_lua(list, remove_keys, remove_defaults) +local function generate_on_attach_lua(list, remove_keys) local lua = [[ local api = require('nvim-tree.api') -local on_attach = function(bufnr)]] +local on_attach = function(bufnr) - -- TODO generate from LEGACY_MAPPINGS; text table from default_on_attach is not worth the effort + -- please insert mappings from :help nvim-tree-default-mappings]] -- explicit removals if #remove_keys > 0 then @@ -135,12 +177,25 @@ local on_attach = function(bufnr)]] local keys = type(m.key) == "table" and m.key or { m.key } for _, k in ipairs(keys) do if LEGACY_MAPPINGS[m.action] then - lua = lua .. "\n" .. string.format([[ vim.keymap.set('%s', '%s', %s, { desc = '%s', buffer = bufnr, noremap = true, silent = true, nowait = true })]], m.mode or "n", k, LEGACY_MAPPINGS[m.action].t, m.action) + lua = lua + .. "\n" + .. string.format( + [[ vim.keymap.set('%s', '%s', %s, { desc = '%s', buffer = bufnr, noremap = true, silent = true, nowait = true })]], + m.mode or "n", + k, + LEGACY_MAPPINGS[m.action].n, + LEGACY_MAPPINGS[m.action].desc + ) elseif type(m.action_cb) == "function" then lua = lua .. "\n" .. string.format([[ vim.keymap.set('%s', '%s', function()]], m.mode or "n", k) - lua = lua .. "\n" .. string.format([[ local node = api.tree.get_node_under_cursor()]]) - lua = lua .. "\n" .. string.format([[ -- your code goes here]]) - lua = lua .. "\n" .. string.format([[ end, { desc = '%s', buffer = bufnr, noremap = true, silent = true, nowait = true })]], m.action) + lua = lua .. "\n" .. string.format [[ local node = api.tree.get_node_under_cursor()]] + lua = lua .. "\n" .. string.format [[ -- your code goes here]] + lua = lua + .. "\n" + .. string.format( + [[ end, { desc = '%s', buffer = bufnr, noremap = true, silent = true, nowait = true })]], + m.action + ) end end end @@ -166,7 +221,7 @@ function M.generate_legacy_on_attach(opts) end opts.on_attach = generate_on_attach_function(list, remove_keys, remove_defaults) - M.on_attach_lua = generate_on_attach_lua(list, remove_keys, remove_defaults) + M.on_attach_lua = generate_on_attach_lua(list, remove_keys) end function M.generate_on_attach() From 7627d21165f3f49fe5deb72e47d84b8d9cf10dd4 Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Sun, 29 Jan 2023 16:30:13 +1100 Subject: [PATCH 25/42] generate default on_attach --- lua/nvim-tree/legacy.lua | 111 ++++++++++++++++++++++++++++----------- scripts/update-help.sh | 4 ++ 2 files changed, 84 insertions(+), 31 deletions(-) diff --git a/lua/nvim-tree/legacy.lua b/lua/nvim-tree/legacy.lua index 4268c796552..28c3631cb2a 100644 --- a/lua/nvim-tree/legacy.lua +++ b/lua/nvim-tree/legacy.lua @@ -5,9 +5,68 @@ local open_file = require "nvim-tree.actions.node.open-file" local keymap = require "nvim-tree.keymap" local M = { - on_attach_lua = "", + user_on_attach_lua = "" } +local DEFAULT_ON_ATTACH = [[ +local api = require('nvim-tree.api') + +local on_attach = function(bufnr) + + -- BEGIN_DEFAULT_ON_ATTACH + vim.keymap.set('n', '', api.tree.change_root_to_node, { desc = 'CD', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', api.node.open.replace_tree_buffer, { desc = 'Open: In Place', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', api.node.show_info_popup, { desc = 'Info', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', api.fs.rename_sub, { desc = 'Rename: Omit Filename', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', api.node.open.tab, { desc = 'Open: New Tab', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', api.node.open.vertical, { desc = 'Open: Vertical Split', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', api.node.open.horizontal, { desc = 'Open: Horizontal Split', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', api.node.navigate.parent_close, { desc = 'Close Directory', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', api.node.open.edit, { desc = 'Open', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', api.node.open.preview, { desc = 'Open Preview', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '>', api.node.navigate.sibling.next, { desc = 'Next Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '<', api.node.navigate.sibling.prev, { desc = 'Previous Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '.', api.node.run.cmd, { desc = 'Run Command', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '-', api.tree.change_root_to_parent, { desc = 'Up', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'a', api.fs.create, { desc = 'Create', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'bmv', api.marks.bulk.move, { desc = 'Move Bookmarked', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'c', api.fs.copy.node, { desc = 'Copy', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '[c', api.node.navigate.git.prev, { desc = 'Prev Git', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', ']c', api.node.navigate.git.next, { desc = 'Next Git', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'd', api.fs.remove, { desc = 'Delete', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'D', api.fs.trash, { desc = 'Trash', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'E', api.tree.expand_all, { desc = 'Expand All', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'e', api.fs.rename_basename, { desc = 'Rename: Basename', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', ']e', api.node.navigate.diagnostics.next, { desc = 'Next Diagnostic', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '[e', api.node.navigate.diagnostics.prev, { desc = 'Prev Diagnostic', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'F', api.live_filter.clear, { desc = 'Clean Filter', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'f', api.live_filter.start, { desc = 'Filter', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'g?', api.tree.toggle_help, { desc = 'Help', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'gy', api.fs.copy.absolute_path, { desc = 'Copy Absolute Path', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'H', api.tree.toggle_hidden_filter, { desc = 'Toggle Dotfiles', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'I', api.tree.toggle_gitignore_filter, { desc = 'Toggle Git Ignore', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'J', api.node.navigate.sibling.last, { desc = 'Last Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'K', api.node.navigate.sibling.first, { desc = 'First Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'm', api.marks.toggle, { desc = 'Toggle Bookmark', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'o', api.node.open.edit, { desc = 'Open', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'O', api.node.open.no_window_picker, { desc = 'Open: No Window Picker', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'p', api.fs.paste, { desc = 'Paste', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'P', api.node.navigate.parent, { desc = 'Parent Directory', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'q', api.tree.close, { desc = 'Close', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'r', api.fs.rename, { desc = 'Rename', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'R', api.tree.reload, { desc = 'Refresh', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 's', api.node.run.system, { desc = 'Run System', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'S', api.tree.search_node, { desc = 'Search', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'U', api.tree.toggle_custom_filter, { desc = 'Toggle Hidden', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'W', api.tree.collapse_all, { desc = 'Collapse', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'x', api.fs.cut, { desc = 'Cut', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'y', api.fs.copy.filename, { desc = 'Copy Name', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'Y', api.fs.copy.relative_path, { desc = 'Copy Relative Path', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '<2-LeftMouse>', api.node.open.edit, { desc = 'Open', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '<2-RightMouse>', api.tree.change_root_to_node, { desc = 'CD', buffer = bufnr, noremap = true, silent = true, nowait = true }) + -- END_DEFAULT_ON_ATTACH +]] + -- stylua: ignore start local LEGACY_MAPPINGS = { edit = { key = { "", "o", "<2-LeftMouse>" }, desc = "Open", fn = api.node.open.edit, n = "api.node.open.edit" }, @@ -153,55 +212,48 @@ local function generate_on_attach_function(list, remove_keys, remove_defaults) end local function generate_on_attach_lua(list, remove_keys) - local lua = [[ -local api = require('nvim-tree.api') - -local on_attach = function(bufnr) - - -- please insert mappings from :help nvim-tree-default-mappings]] + local lua = "" -- explicit removals if #remove_keys > 0 then - lua = lua .. "\n\n -- remove_keys" + lua = lua .. "\n -- remove_keys\n" end for _, key in ipairs(remove_keys) do - lua = lua .. "\n" .. string.format([[ vim.keymap.set('n', '%s', '', { buffer = bufnr })]], key) - lua = lua .. "\n" .. string.format([[ vim.keymap.del('n', '%s', { buffer = bufnr })]], key) + lua = lua .. string.format([[ vim.keymap.set('n', '%s', '', { buffer = bufnr })]], key) .. "\n" + lua = lua .. string.format([[ vim.keymap.del('n', '%s', { buffer = bufnr })]], key) .. "\n" end -- list if #list > 0 then - lua = lua .. "\n\n -- view.mappings.list" + lua = lua .. "\n -- view.mappings.list\n" end for _, m in ipairs(list) do local keys = type(m.key) == "table" and m.key or { m.key } for _, k in ipairs(keys) do if LEGACY_MAPPINGS[m.action] then lua = lua - .. "\n" .. string.format( - [[ vim.keymap.set('%s', '%s', %s, { desc = '%s', buffer = bufnr, noremap = true, silent = true, nowait = true })]], + [[ vim.keymap.set('%s', '%s', %s, { desc = '%s', buffer = bufnr, noremap = true, silent = true, nowait = true })]], m.mode or "n", k, LEGACY_MAPPINGS[m.action].n, LEGACY_MAPPINGS[m.action].desc ) + .. "\n" elseif type(m.action_cb) == "function" then - lua = lua .. "\n" .. string.format([[ vim.keymap.set('%s', '%s', function()]], m.mode or "n", k) - lua = lua .. "\n" .. string.format [[ local node = api.tree.get_node_under_cursor()]] - lua = lua .. "\n" .. string.format [[ -- your code goes here]] + lua = lua .. string.format([[ vim.keymap.set('%s', '%s', function()]], m.mode or "n", k) .. "\n" + lua = lua .. [[ local node = api.tree.get_node_under_cursor()]] .. "\n" + lua = lua .. [[ -- your code goes here]] .. "\n" lua = lua - .. "\n" .. string.format( - [[ end, { desc = '%s', buffer = bufnr, noremap = true, silent = true, nowait = true })]], + [[ end, { desc = '%s', buffer = bufnr, noremap = true, silent = true, nowait = true })]], m.action ) + .. "\n" end end end - lua = lua .. "\nend" - return lua end @@ -221,20 +273,17 @@ function M.generate_legacy_on_attach(opts) end opts.on_attach = generate_on_attach_function(list, remove_keys, remove_defaults) - M.on_attach_lua = generate_on_attach_lua(list, remove_keys) + M.user_on_attach_lua = generate_on_attach_lua(list, remove_keys) end function M.generate_on_attach() - if #M.on_attach_lua > 0 then - local name = "/tmp/my_on_attach.lua" - local file = io.open(name, "w") - io.output(file) - io.write(M.on_attach_lua) - io.close(file) - open_file.fn("edit", name) - else - notify.info "no custom mappings" - end + local name = "/tmp/my_on_attach.lua" + local file = io.output(name) + io.write(DEFAULT_ON_ATTACH) + io.write(M.user_on_attach_lua) + io.write("end") + io.close(file) + open_file.fn("edit", name) end function M.migrate_legacy_options(opts) diff --git a/scripts/update-help.sh b/scripts/update-help.sh index 9f8c403201b..eeb98b4395e 100755 --- a/scripts/update-help.sh +++ b/scripts/update-help.sh @@ -38,3 +38,7 @@ sed -e "s/^ / /" /tmp/DEFAULT_ON_ATTACH.2.lua > /tmp/DEFAULT_ON_ATTACH.4.lua sed -i -e "/${begin}/,/${end}/{ /${begin}/{p; r /tmp/DEFAULT_ON_ATTACH.4.lua }; /${end}/p; d; }" doc/nvim-tree-lua.txt +# legacy, indented at 2 +sed -i -e "/${begin}/,/${end}/{ /${begin}/{p; r /tmp/DEFAULT_ON_ATTACH.2.lua + }; /${end}/p; d; }" lua/nvim-tree/legacy.lua + From 34558295eb9ef2b286cc8f9e6736f18d738c9a31 Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Sun, 29 Jan 2023 16:31:12 +1100 Subject: [PATCH 26/42] generate default on_attach --- lua/nvim-tree/legacy.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lua/nvim-tree/legacy.lua b/lua/nvim-tree/legacy.lua index 28c3631cb2a..a3d9e59022c 100644 --- a/lua/nvim-tree/legacy.lua +++ b/lua/nvim-tree/legacy.lua @@ -5,7 +5,7 @@ local open_file = require "nvim-tree.actions.node.open-file" local keymap = require "nvim-tree.keymap" local M = { - user_on_attach_lua = "" + user_on_attach_lua = "", } local DEFAULT_ON_ATTACH = [[ @@ -281,7 +281,7 @@ function M.generate_on_attach() local file = io.output(name) io.write(DEFAULT_ON_ATTACH) io.write(M.user_on_attach_lua) - io.write("end") + io.write "end" io.close(file) open_file.fn("edit", name) end From 68096fc0f8e290535132c197c56fdca39bcafa20 Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Sun, 12 Feb 2023 15:48:23 +1100 Subject: [PATCH 27/42] split out keymap_legacy --- lua/nvim-tree.lua | 5 +- lua/nvim-tree/keymap-legacy.lua | 230 ++++++++++++++++++++++++++++++++ lua/nvim-tree/legacy.lua | 228 +------------------------------ 3 files changed, 234 insertions(+), 229 deletions(-) create mode 100644 lua/nvim-tree/keymap-legacy.lua diff --git a/lua/nvim-tree.lua b/lua/nvim-tree.lua index 17fd03d751c..edadb251ce3 100644 --- a/lua/nvim-tree.lua +++ b/lua/nvim-tree.lua @@ -14,6 +14,7 @@ local git = require "nvim-tree.git" local filters = require "nvim-tree.explorer.filters" local modified = require "nvim-tree.modified" local notify = require "nvim-tree.notify" +local keymap_legacy = require "nvim-tree.keymap-legacy" local _config = {} @@ -376,7 +377,7 @@ local function setup_vim_commands() vim.api.nvim_create_user_command("NvimTreeCollapseKeepBuffers", function() collapse_all.fn(true) end, { bar = true }) - vim.api.nvim_create_user_command("NvimTreeGenerateOnAttach", legacy.generate_on_attach, {}) + vim.api.nvim_create_user_command("NvimTreeGenerateOnAttach", keymap_legacy.generate_on_attach, {}) end function M.change_dir(name) @@ -884,7 +885,7 @@ function M.setup(conf) log.raw("config", "%s\n", vim.inspect(opts)) end - legacy.generate_legacy_on_attach(opts) + keymap_legacy.generate_legacy_on_attach(opts) require("nvim-tree.actions").setup(opts) require("nvim-tree.keymap").setup(opts) diff --git a/lua/nvim-tree/keymap-legacy.lua b/lua/nvim-tree/keymap-legacy.lua new file mode 100644 index 00000000000..d4ca51c6b5c --- /dev/null +++ b/lua/nvim-tree/keymap-legacy.lua @@ -0,0 +1,230 @@ +local api = require "nvim-tree.api" +local open_file = require "nvim-tree.actions.node.open-file" +local keymap = require "nvim-tree.keymap" + +local M = { + user_on_attach_lua = "", +} + +local DEFAULT_ON_ATTACH = [[ +local api = require('nvim-tree.api') + +local on_attach = function(bufnr) + + -- BEGIN_DEFAULT_ON_ATTACH + vim.keymap.set('n', '', api.tree.change_root_to_node, { desc = 'CD', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', api.node.open.replace_tree_buffer, { desc = 'Open: In Place', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', api.node.show_info_popup, { desc = 'Info', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', api.fs.rename_sub, { desc = 'Rename: Omit Filename', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', api.node.open.tab, { desc = 'Open: New Tab', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', api.node.open.vertical, { desc = 'Open: Vertical Split', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', api.node.open.horizontal, { desc = 'Open: Horizontal Split', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', api.node.navigate.parent_close, { desc = 'Close Directory', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', api.node.open.edit, { desc = 'Open', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '', api.node.open.preview, { desc = 'Open Preview', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '>', api.node.navigate.sibling.next, { desc = 'Next Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '<', api.node.navigate.sibling.prev, { desc = 'Previous Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '.', api.node.run.cmd, { desc = 'Run Command', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '-', api.tree.change_root_to_parent, { desc = 'Up', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'a', api.fs.create, { desc = 'Create', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'bmv', api.marks.bulk.move, { desc = 'Move Bookmarked', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'c', api.fs.copy.node, { desc = 'Copy', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '[c', api.node.navigate.git.prev, { desc = 'Prev Git', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', ']c', api.node.navigate.git.next, { desc = 'Next Git', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'd', api.fs.remove, { desc = 'Delete', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'D', api.fs.trash, { desc = 'Trash', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'E', api.tree.expand_all, { desc = 'Expand All', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'e', api.fs.rename_basename, { desc = 'Rename: Basename', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', ']e', api.node.navigate.diagnostics.next, { desc = 'Next Diagnostic', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '[e', api.node.navigate.diagnostics.prev, { desc = 'Prev Diagnostic', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'F', api.live_filter.clear, { desc = 'Clean Filter', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'f', api.live_filter.start, { desc = 'Filter', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'g?', api.tree.toggle_help, { desc = 'Help', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'gy', api.fs.copy.absolute_path, { desc = 'Copy Absolute Path', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'H', api.tree.toggle_hidden_filter, { desc = 'Toggle Dotfiles', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'I', api.tree.toggle_gitignore_filter, { desc = 'Toggle Git Ignore', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'J', api.node.navigate.sibling.last, { desc = 'Last Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'K', api.node.navigate.sibling.first, { desc = 'First Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'm', api.marks.toggle, { desc = 'Toggle Bookmark', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'o', api.node.open.edit, { desc = 'Open', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'O', api.node.open.no_window_picker, { desc = 'Open: No Window Picker', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'p', api.fs.paste, { desc = 'Paste', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'P', api.node.navigate.parent, { desc = 'Parent Directory', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'q', api.tree.close, { desc = 'Close', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'r', api.fs.rename, { desc = 'Rename', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'R', api.tree.reload, { desc = 'Refresh', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 's', api.node.run.system, { desc = 'Run System', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'S', api.tree.search_node, { desc = 'Search', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'U', api.tree.toggle_custom_filter, { desc = 'Toggle Hidden', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'W', api.tree.collapse_all, { desc = 'Collapse', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'x', api.fs.cut, { desc = 'Cut', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'y', api.fs.copy.filename, { desc = 'Copy Name', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'Y', api.fs.copy.relative_path, { desc = 'Copy Relative Path', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '<2-LeftMouse>', api.node.open.edit, { desc = 'Open', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '<2-RightMouse>', api.tree.change_root_to_node, { desc = 'CD', buffer = bufnr, noremap = true, silent = true, nowait = true }) + -- END_DEFAULT_ON_ATTACH +]] + +-- stylua: ignore start +local LEGACY_MAPPINGS = { + edit = { key = { "", "o", "<2-LeftMouse>" }, desc = "Open", fn = api.node.open.edit, n = "api.node.open.edit" }, + edit_in_place = { key = "", desc = "Open: In Place", fn = api.node.open.replace_tree_buffer, n = "api.node.open.replace_tree_buffer" }, + edit_no_picker = { key = "O", desc = "Open: No Window Picker", fn = api.node.open.no_window_picker, n = "api.node.open.no_window_picker" }, + cd = { key = { "", "<2-RightMouse>" }, desc = "CD", fn = api.tree.change_root_to_node, n = "api.tree.change_root_to_node" }, + vsplit = { key = "", desc = "Open: Vertical Split", fn = api.node.open.vertical, n = "api.node.open.vertical" }, + split = { key = "", desc = "Open: Horizontal Split", fn = api.node.open.horizontal, n = "api.node.open.horizontal" }, + tabnew = { key = "", desc = "Open: New Tab", fn = api.node.open.tab, n = "api.node.open.tab" }, + prev_sibling = { key = "<", desc = "Previous Sibling", fn = api.node.navigate.sibling.prev, n = "api.node.navigate.sibling.prev" }, + next_sibling = { key = ">", desc = "Next Sibling", fn = api.node.navigate.sibling.next, n = "api.node.navigate.sibling.next" }, + parent_node = { key = "P", desc = "Parent Directory", fn = api.node.navigate.parent, n = "api.node.navigate.parent" }, + close_node = { key = "", desc = "Close Directory", fn = api.node.navigate.parent_close, n = "api.node.navigate.parent_close" }, + preview = { key = "", desc = "Open Preview", fn = api.node.open.preview, n = "api.node.open.preview" }, + first_sibling = { key = "K", desc = "First Sibling", fn = api.node.navigate.sibling.first, n = "api.node.navigate.sibling.first" }, + last_sibling = { key = "J", desc = "Last Sibling", fn = api.node.navigate.sibling.last, n = "api.node.navigate.sibling.last" }, + toggle_git_ignored = { key = "I", desc = "Toggle Git Ignore", fn = api.tree.toggle_gitignore_filter, n = "api.tree.toggle_gitignore_filter" }, + toggle_dotfiles = { key = "H", desc = "Toggle Dotfiles", fn = api.tree.toggle_hidden_filter, n = "api.tree.toggle_hidden_filter" }, + toggle_custom = { key = "U", desc = "Toggle Hidden", fn = api.tree.toggle_custom_filter, n = "api.tree.toggle_custom_filter" }, + refresh = { key = "R", desc = "Refresh", fn = api.tree.reload, n = "api.tree.reload" }, + create = { key = "a", desc = "Create", fn = api.fs.create, n = "api.fs.create" }, + remove = { key = "d", desc = "Delete", fn = api.fs.remove, n = "api.fs.remove" }, + trash = { key = "D", desc = "Trash", fn = api.fs.trash, n = "api.fs.trash" }, + rename = { key = "r", desc = "Rename", fn = api.fs.rename, n = "api.fs.rename" }, + full_rename = { key = "", desc = "Rename: Omit Filename", fn = api.fs.rename_sub, n = "api.fs.rename_sub" }, + cut = { key = "x", desc = "Cut", fn = api.fs.cut, n = "api.fs.cut" }, + copy = { key = "c", desc = "Copy", fn = api.fs.copy.node, n = "api.fs.copy.node" }, + paste = { key = "p", desc = "Paste", fn = api.fs.paste, n = "api.fs.paste" }, + copy_name = { key = "y", desc = "Copy Name", fn = api.fs.copy.filename, n = "api.fs.copy.filename" }, + copy_path = { key = "Y", desc = "Copy Relative Path", fn = api.fs.copy.relative_path, n = "api.fs.copy.relative_path" }, + copy_absolute_path = { key = "gy", desc = "Copy Absolute Path", fn = api.fs.copy.absolute_path, n = "api.fs.copy.absolute_path" }, + next_diag_item = { key = "]e", desc = "Next Diagnostic", fn = api.node.navigate.diagnostics.next, n = "api.node.navigate.diagnostics.next" }, + next_git_item = { key = "]c", desc = "Next Git", fn = api.node.navigate.git.next, n = "api.node.navigate.git.next" }, + prev_diag_item = { key = "[e", desc = "Prev Diagnostic", fn = api.node.navigate.diagnostics.prev, n = "api.node.navigate.diagnostics.prev" }, + prev_git_item = { key = "[c", desc = "Prev Git", fn = api.node.navigate.git.prev, n = "api.node.navigate.git.prev" }, + dir_up = { key = "-", desc = "Up", fn = api.tree.change_root_to_parent, n = "api.tree.change_root_to_parent" }, + system_open = { key = "s", desc = "Run System", fn = api.node.run.system, n = "api.node.run.system" }, + live_filter = { key = "f", desc = "Filter", fn = api.live_filter.start, n = "api.live_filter.start" }, + clear_live_filter = { key = "F", desc = "Clean Filter", fn = api.live_filter.clear, n = "api.live_filter.clear" }, + close = { key = "q", desc = "Close", fn = api.tree.close, n = "api.tree.close" }, + collapse_all = { key = "W", desc = "Collapse", fn = api.tree.collapse_all, n = "api.tree.collapse_all" }, + expand_all = { key = "E", desc = "Expand All", fn = api.tree.expand_all, n = "api.tree.expand_all" }, + search_node = { key = "S", desc = "Search", fn = api.tree.search_node, n = "api.tree.search_node" }, + run_file_command = { key = ".", desc = "Run Command", fn = api.node.run.cmd, n = "api.node.run.cmd" }, + toggle_file_info = { key = "", desc = "Info", fn = api.node.show_info_popup, n = "api.node.show_info_popup" }, + toggle_help = { key = "g?", desc = "Help", fn = api.tree.toggle_help, n = "api.tree.toggle_help" }, + toggle_mark = { key = "m", desc = "Toggle Bookmark", fn = api.marks.toggle, n = "api.marks.toggle" }, + bulk_move = { key = "bmv", desc = "Move Bookmarked", fn = api.marks.bulk.move, n = "api.marks.bulk.move" }, +} +-- stylua: ignore end + +local function generate_on_attach_function(list, remove_keys, remove_defaults) + return function(bufnr) + -- apply defaults first + if not remove_defaults then + keymap.default_on_attach(bufnr) + end + + -- explicit removals + for _, key in ipairs(remove_keys) do + vim.keymap.set("n", key, "", { buffer = bufnr }) + vim.keymap.del("n", key, { buffer = bufnr }) + end + + -- mappings + for _, m in ipairs(list) do + local keys = type(m.key) == "table" and m.key or { m.key } + for _, k in ipairs(keys) do + if LEGACY_MAPPINGS[m.action] then + -- straight action + vim.keymap.set( + m.mode or "n", + k, + LEGACY_MAPPINGS[m.action].fn, + { desc = m.action, buffer = bufnr, noremap = true, silent = true, nowait = true } + ) + elseif type(m.action_cb) == "function" then + -- action_cb + vim.keymap.set(m.mode or "n", k, function() + m.action_cb(api.tree.get_node_under_cursor()) + end, { desc = m.action, buffer = bufnr, noremap = true, silent = true, nowait = true }) + end + end + end + end +end + +local function generate_on_attach_lua(list, remove_keys) + local lua = "" + + -- explicit removals + if #remove_keys > 0 then + lua = lua .. "\n -- remove_keys\n" + end + for _, key in ipairs(remove_keys) do + lua = lua .. string.format([[ vim.keymap.set('n', '%s', '', { buffer = bufnr })]], key) .. "\n" + lua = lua .. string.format([[ vim.keymap.del('n', '%s', { buffer = bufnr })]], key) .. "\n" + end + + -- list + if #list > 0 then + lua = lua .. "\n -- view.mappings.list\n" + end + for _, m in ipairs(list) do + local keys = type(m.key) == "table" and m.key or { m.key } + for _, k in ipairs(keys) do + if LEGACY_MAPPINGS[m.action] then + lua = lua + .. string.format( + [[ vim.keymap.set('%s', '%s', %s, { desc = '%s', buffer = bufnr, noremap = true, silent = true, nowait = true })]], + m.mode or "n", + k, + LEGACY_MAPPINGS[m.action].n, + LEGACY_MAPPINGS[m.action].desc + ) + .. "\n" + elseif type(m.action_cb) == "function" then + lua = lua .. string.format([[ vim.keymap.set('%s', '%s', function()]], m.mode or "n", k) .. "\n" + lua = lua .. [[ local node = api.tree.get_node_under_cursor()]] .. "\n" + lua = lua .. [[ -- your code goes here]] .. "\n" + lua = lua + .. string.format( + [[ end, { desc = '%s', buffer = bufnr, noremap = true, silent = true, nowait = true })]], + m.action + ) + .. "\n" + end + end + end + + return lua +end + +function M.generate_legacy_on_attach(opts) + if type(opts.on_attach) == "function" then + return + end + + local list = opts.view and opts.view.mappings and opts.view.mappings.list or {} + local remove_keys = type(opts.remove_keymaps) == "table" and opts.remove_keymaps or {} + local remove_defaults = opts.remove_keymaps == true + or opts.view and opts.view.mappings and opts.view.mappings.custom_only + + -- do nothing unless the user has configured something + if #list == 0 and #remove_keys == 0 and not remove_defaults then + return + end + + opts.on_attach = generate_on_attach_function(list, remove_keys, remove_defaults) + M.user_on_attach_lua = generate_on_attach_lua(list, remove_keys) +end + +function M.generate_on_attach() + local name = "/tmp/my_on_attach.lua" + local file = io.output(name) + io.write(DEFAULT_ON_ATTACH) + io.write(M.user_on_attach_lua) + io.write "end" + io.close(file) + open_file.fn("edit", name) +end + +return M diff --git a/lua/nvim-tree/legacy.lua b/lua/nvim-tree/legacy.lua index a3d9e59022c..dffe6b5510e 100644 --- a/lua/nvim-tree/legacy.lua +++ b/lua/nvim-tree/legacy.lua @@ -1,122 +1,7 @@ -local api = require "nvim-tree.api" local utils = require "nvim-tree.utils" local notify = require "nvim-tree.notify" -local open_file = require "nvim-tree.actions.node.open-file" -local keymap = require "nvim-tree.keymap" -local M = { - user_on_attach_lua = "", -} - -local DEFAULT_ON_ATTACH = [[ -local api = require('nvim-tree.api') - -local on_attach = function(bufnr) - - -- BEGIN_DEFAULT_ON_ATTACH - vim.keymap.set('n', '', api.tree.change_root_to_node, { desc = 'CD', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', api.node.open.replace_tree_buffer, { desc = 'Open: In Place', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', api.node.show_info_popup, { desc = 'Info', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', api.fs.rename_sub, { desc = 'Rename: Omit Filename', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', api.node.open.tab, { desc = 'Open: New Tab', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', api.node.open.vertical, { desc = 'Open: Vertical Split', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', api.node.open.horizontal, { desc = 'Open: Horizontal Split', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', api.node.navigate.parent_close, { desc = 'Close Directory', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', api.node.open.edit, { desc = 'Open', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', api.node.open.preview, { desc = 'Open Preview', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '>', api.node.navigate.sibling.next, { desc = 'Next Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '<', api.node.navigate.sibling.prev, { desc = 'Previous Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '.', api.node.run.cmd, { desc = 'Run Command', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '-', api.tree.change_root_to_parent, { desc = 'Up', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'a', api.fs.create, { desc = 'Create', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'bmv', api.marks.bulk.move, { desc = 'Move Bookmarked', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'c', api.fs.copy.node, { desc = 'Copy', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '[c', api.node.navigate.git.prev, { desc = 'Prev Git', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', ']c', api.node.navigate.git.next, { desc = 'Next Git', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'd', api.fs.remove, { desc = 'Delete', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'D', api.fs.trash, { desc = 'Trash', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'E', api.tree.expand_all, { desc = 'Expand All', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'e', api.fs.rename_basename, { desc = 'Rename: Basename', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', ']e', api.node.navigate.diagnostics.next, { desc = 'Next Diagnostic', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '[e', api.node.navigate.diagnostics.prev, { desc = 'Prev Diagnostic', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'F', api.live_filter.clear, { desc = 'Clean Filter', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'f', api.live_filter.start, { desc = 'Filter', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'g?', api.tree.toggle_help, { desc = 'Help', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'gy', api.fs.copy.absolute_path, { desc = 'Copy Absolute Path', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'H', api.tree.toggle_hidden_filter, { desc = 'Toggle Dotfiles', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'I', api.tree.toggle_gitignore_filter, { desc = 'Toggle Git Ignore', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'J', api.node.navigate.sibling.last, { desc = 'Last Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'K', api.node.navigate.sibling.first, { desc = 'First Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'm', api.marks.toggle, { desc = 'Toggle Bookmark', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'o', api.node.open.edit, { desc = 'Open', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'O', api.node.open.no_window_picker, { desc = 'Open: No Window Picker', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'p', api.fs.paste, { desc = 'Paste', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'P', api.node.navigate.parent, { desc = 'Parent Directory', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'q', api.tree.close, { desc = 'Close', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'r', api.fs.rename, { desc = 'Rename', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'R', api.tree.reload, { desc = 'Refresh', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 's', api.node.run.system, { desc = 'Run System', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'S', api.tree.search_node, { desc = 'Search', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'U', api.tree.toggle_custom_filter, { desc = 'Toggle Hidden', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'W', api.tree.collapse_all, { desc = 'Collapse', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'x', api.fs.cut, { desc = 'Cut', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'y', api.fs.copy.filename, { desc = 'Copy Name', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'Y', api.fs.copy.relative_path, { desc = 'Copy Relative Path', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '<2-LeftMouse>', api.node.open.edit, { desc = 'Open', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '<2-RightMouse>', api.tree.change_root_to_node, { desc = 'CD', buffer = bufnr, noremap = true, silent = true, nowait = true }) - -- END_DEFAULT_ON_ATTACH -]] - --- stylua: ignore start -local LEGACY_MAPPINGS = { - edit = { key = { "", "o", "<2-LeftMouse>" }, desc = "Open", fn = api.node.open.edit, n = "api.node.open.edit" }, - edit_in_place = { key = "", desc = "Open: In Place", fn = api.node.open.replace_tree_buffer, n = "api.node.open.replace_tree_buffer" }, - edit_no_picker = { key = "O", desc = "Open: No Window Picker", fn = api.node.open.no_window_picker, n = "api.node.open.no_window_picker" }, - cd = { key = { "", "<2-RightMouse>" }, desc = "CD", fn = api.tree.change_root_to_node, n = "api.tree.change_root_to_node" }, - vsplit = { key = "", desc = "Open: Vertical Split", fn = api.node.open.vertical, n = "api.node.open.vertical" }, - split = { key = "", desc = "Open: Horizontal Split", fn = api.node.open.horizontal, n = "api.node.open.horizontal" }, - tabnew = { key = "", desc = "Open: New Tab", fn = api.node.open.tab, n = "api.node.open.tab" }, - prev_sibling = { key = "<", desc = "Previous Sibling", fn = api.node.navigate.sibling.prev, n = "api.node.navigate.sibling.prev" }, - next_sibling = { key = ">", desc = "Next Sibling", fn = api.node.navigate.sibling.next, n = "api.node.navigate.sibling.next" }, - parent_node = { key = "P", desc = "Parent Directory", fn = api.node.navigate.parent, n = "api.node.navigate.parent" }, - close_node = { key = "", desc = "Close Directory", fn = api.node.navigate.parent_close, n = "api.node.navigate.parent_close" }, - preview = { key = "", desc = "Open Preview", fn = api.node.open.preview, n = "api.node.open.preview" }, - first_sibling = { key = "K", desc = "First Sibling", fn = api.node.navigate.sibling.first, n = "api.node.navigate.sibling.first" }, - last_sibling = { key = "J", desc = "Last Sibling", fn = api.node.navigate.sibling.last, n = "api.node.navigate.sibling.last" }, - toggle_git_ignored = { key = "I", desc = "Toggle Git Ignore", fn = api.tree.toggle_gitignore_filter, n = "api.tree.toggle_gitignore_filter" }, - toggle_dotfiles = { key = "H", desc = "Toggle Dotfiles", fn = api.tree.toggle_hidden_filter, n = "api.tree.toggle_hidden_filter" }, - toggle_custom = { key = "U", desc = "Toggle Hidden", fn = api.tree.toggle_custom_filter, n = "api.tree.toggle_custom_filter" }, - refresh = { key = "R", desc = "Refresh", fn = api.tree.reload, n = "api.tree.reload" }, - create = { key = "a", desc = "Create", fn = api.fs.create, n = "api.fs.create" }, - remove = { key = "d", desc = "Delete", fn = api.fs.remove, n = "api.fs.remove" }, - trash = { key = "D", desc = "Trash", fn = api.fs.trash, n = "api.fs.trash" }, - rename = { key = "r", desc = "Rename", fn = api.fs.rename, n = "api.fs.rename" }, - full_rename = { key = "", desc = "Rename: Omit Filename", fn = api.fs.rename_sub, n = "api.fs.rename_sub" }, - cut = { key = "x", desc = "Cut", fn = api.fs.cut, n = "api.fs.cut" }, - copy = { key = "c", desc = "Copy", fn = api.fs.copy.node, n = "api.fs.copy.node" }, - paste = { key = "p", desc = "Paste", fn = api.fs.paste, n = "api.fs.paste" }, - copy_name = { key = "y", desc = "Copy Name", fn = api.fs.copy.filename, n = "api.fs.copy.filename" }, - copy_path = { key = "Y", desc = "Copy Relative Path", fn = api.fs.copy.relative_path, n = "api.fs.copy.relative_path" }, - copy_absolute_path = { key = "gy", desc = "Copy Absolute Path", fn = api.fs.copy.absolute_path, n = "api.fs.copy.absolute_path" }, - next_diag_item = { key = "]e", desc = "Next Diagnostic", fn = api.node.navigate.diagnostics.next, n = "api.node.navigate.diagnostics.next" }, - next_git_item = { key = "]c", desc = "Next Git", fn = api.node.navigate.git.next, n = "api.node.navigate.git.next" }, - prev_diag_item = { key = "[e", desc = "Prev Diagnostic", fn = api.node.navigate.diagnostics.prev, n = "api.node.navigate.diagnostics.prev" }, - prev_git_item = { key = "[c", desc = "Prev Git", fn = api.node.navigate.git.prev, n = "api.node.navigate.git.prev" }, - dir_up = { key = "-", desc = "Up", fn = api.tree.change_root_to_parent, n = "api.tree.change_root_to_parent" }, - system_open = { key = "s", desc = "Run System", fn = api.node.run.system, n = "api.node.run.system" }, - live_filter = { key = "f", desc = "Filter", fn = api.live_filter.start, n = "api.live_filter.start" }, - clear_live_filter = { key = "F", desc = "Clean Filter", fn = api.live_filter.clear, n = "api.live_filter.clear" }, - close = { key = "q", desc = "Close", fn = api.tree.close, n = "api.tree.close" }, - collapse_all = { key = "W", desc = "Collapse", fn = api.tree.collapse_all, n = "api.tree.collapse_all" }, - expand_all = { key = "E", desc = "Expand All", fn = api.tree.expand_all, n = "api.tree.expand_all" }, - search_node = { key = "S", desc = "Search", fn = api.tree.search_node, n = "api.tree.search_node" }, - run_file_command = { key = ".", desc = "Run Command", fn = api.node.run.cmd, n = "api.node.run.cmd" }, - toggle_file_info = { key = "", desc = "Info", fn = api.node.show_info_popup, n = "api.node.show_info_popup" }, - toggle_help = { key = "g?", desc = "Help", fn = api.tree.toggle_help, n = "api.tree.toggle_help" }, - toggle_mark = { key = "m", desc = "Toggle Bookmark", fn = api.marks.toggle, n = "api.marks.toggle" }, - bulk_move = { key = "bmv", desc = "Move Bookmarked", fn = api.marks.bulk.move, n = "api.marks.bulk.move" }, -} --- stylua: ignore end +local M = {} local function refactored(opts) -- mapping actions @@ -175,117 +60,6 @@ local function removed(opts) opts.create_in_closed_folder = nil end -local function generate_on_attach_function(list, remove_keys, remove_defaults) - return function(bufnr) - -- apply defaults first - if not remove_defaults then - keymap.default_on_attach(bufnr) - end - - -- explicit removals - for _, key in ipairs(remove_keys) do - vim.keymap.set("n", key, "", { buffer = bufnr }) - vim.keymap.del("n", key, { buffer = bufnr }) - end - - -- mappings - for _, m in ipairs(list) do - local keys = type(m.key) == "table" and m.key or { m.key } - for _, k in ipairs(keys) do - if LEGACY_MAPPINGS[m.action] then - -- straight action - vim.keymap.set( - m.mode or "n", - k, - LEGACY_MAPPINGS[m.action].fn, - { desc = m.action, buffer = bufnr, noremap = true, silent = true, nowait = true } - ) - elseif type(m.action_cb) == "function" then - -- action_cb - vim.keymap.set(m.mode or "n", k, function() - m.action_cb(api.tree.get_node_under_cursor()) - end, { desc = m.action, buffer = bufnr, noremap = true, silent = true, nowait = true }) - end - end - end - end -end - -local function generate_on_attach_lua(list, remove_keys) - local lua = "" - - -- explicit removals - if #remove_keys > 0 then - lua = lua .. "\n -- remove_keys\n" - end - for _, key in ipairs(remove_keys) do - lua = lua .. string.format([[ vim.keymap.set('n', '%s', '', { buffer = bufnr })]], key) .. "\n" - lua = lua .. string.format([[ vim.keymap.del('n', '%s', { buffer = bufnr })]], key) .. "\n" - end - - -- list - if #list > 0 then - lua = lua .. "\n -- view.mappings.list\n" - end - for _, m in ipairs(list) do - local keys = type(m.key) == "table" and m.key or { m.key } - for _, k in ipairs(keys) do - if LEGACY_MAPPINGS[m.action] then - lua = lua - .. string.format( - [[ vim.keymap.set('%s', '%s', %s, { desc = '%s', buffer = bufnr, noremap = true, silent = true, nowait = true })]], - m.mode or "n", - k, - LEGACY_MAPPINGS[m.action].n, - LEGACY_MAPPINGS[m.action].desc - ) - .. "\n" - elseif type(m.action_cb) == "function" then - lua = lua .. string.format([[ vim.keymap.set('%s', '%s', function()]], m.mode or "n", k) .. "\n" - lua = lua .. [[ local node = api.tree.get_node_under_cursor()]] .. "\n" - lua = lua .. [[ -- your code goes here]] .. "\n" - lua = lua - .. string.format( - [[ end, { desc = '%s', buffer = bufnr, noremap = true, silent = true, nowait = true })]], - m.action - ) - .. "\n" - end - end - end - - return lua -end - -function M.generate_legacy_on_attach(opts) - if type(opts.on_attach) == "function" then - return - end - - local list = opts.view and opts.view.mappings and opts.view.mappings.list or {} - local remove_keys = type(opts.remove_keymaps) == "table" and opts.remove_keymaps or {} - local remove_defaults = opts.remove_keymaps == true - or opts.view and opts.view.mappings and opts.view.mappings.custom_only - - -- do nothing unless the user has configured something - if #list == 0 and #remove_keys == 0 and not remove_defaults then - return - end - - opts.on_attach = generate_on_attach_function(list, remove_keys, remove_defaults) - M.user_on_attach_lua = generate_on_attach_lua(list, remove_keys) -end - -function M.generate_on_attach() - local name = "/tmp/my_on_attach.lua" - local file = io.output(name) - io.write(DEFAULT_ON_ATTACH) - io.write(M.user_on_attach_lua) - io.write "end" - io.close(file) - open_file.fn("edit", name) -end - function M.migrate_legacy_options(opts) -- silently move refactored(opts) From 24ecf3575465cdb474ffa73b157d3dcfd774b9a1 Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Sun, 12 Feb 2023 16:04:54 +1100 Subject: [PATCH 28/42] add recently introduced mappings --- doc/nvim-tree-lua.txt | 2 ++ lua/nvim-tree/keymap-legacy.lua | 5 +++++ lua/nvim-tree/keymap.lua | 2 ++ scripts/update-help.sh | 4 ++-- 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/doc/nvim-tree-lua.txt b/doc/nvim-tree-lua.txt index df119dc3c5e..ae9cad99baa 100644 --- a/doc/nvim-tree-lua.txt +++ b/doc/nvim-tree-lua.txt @@ -1510,7 +1510,9 @@ DEFAULT MAPPINGS *nvim-tree-default-mappings vim.keymap.set('n', '-', api.tree.change_root_to_parent, { desc = 'Up', buffer = bufnr, noremap = true, silent = true, nowait = true }) vim.keymap.set('n', 'a', api.fs.create, { desc = 'Create', buffer = bufnr, noremap = true, silent = true, nowait = true }) vim.keymap.set('n', 'bmv', api.marks.bulk.move, { desc = 'Move Bookmarked', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'B', api.tree.toggle_no_buffer_filter, { desc = 'Toggle No Buffer', buffer = bufnr, noremap = true, silent = true, nowait = true }) vim.keymap.set('n', 'c', api.fs.copy.node, { desc = 'Copy', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'C', api.tree.toggle_git_clean_filter, { desc = 'Toggle Git Clean', buffer = bufnr, noremap = true, silent = true, nowait = true }) vim.keymap.set('n', '[c', api.node.navigate.git.prev, { desc = 'Prev Git', buffer = bufnr, noremap = true, silent = true, nowait = true }) vim.keymap.set('n', ']c', api.node.navigate.git.next, { desc = 'Next Git', buffer = bufnr, noremap = true, silent = true, nowait = true }) vim.keymap.set('n', 'd', api.fs.remove, { desc = 'Delete', buffer = bufnr, noremap = true, silent = true, nowait = true }) diff --git a/lua/nvim-tree/keymap-legacy.lua b/lua/nvim-tree/keymap-legacy.lua index d4ca51c6b5c..2fe3a344cae 100644 --- a/lua/nvim-tree/keymap-legacy.lua +++ b/lua/nvim-tree/keymap-legacy.lua @@ -28,7 +28,9 @@ local on_attach = function(bufnr) vim.keymap.set('n', '-', api.tree.change_root_to_parent, { desc = 'Up', buffer = bufnr, noremap = true, silent = true, nowait = true }) vim.keymap.set('n', 'a', api.fs.create, { desc = 'Create', buffer = bufnr, noremap = true, silent = true, nowait = true }) vim.keymap.set('n', 'bmv', api.marks.bulk.move, { desc = 'Move Bookmarked', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'B', api.tree.toggle_no_buffer_filter, { desc = 'Toggle No Buffer', buffer = bufnr, noremap = true, silent = true, nowait = true }) vim.keymap.set('n', 'c', api.fs.copy.node, { desc = 'Copy', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'C', api.tree.toggle_git_clean_filter, { desc = 'Toggle Git Clean', buffer = bufnr, noremap = true, silent = true, nowait = true }) vim.keymap.set('n', '[c', api.node.navigate.git.prev, { desc = 'Prev Git', buffer = bufnr, noremap = true, silent = true, nowait = true }) vim.keymap.set('n', ']c', api.node.navigate.git.next, { desc = 'Next Git', buffer = bufnr, noremap = true, silent = true, nowait = true }) vim.keymap.set('n', 'd', api.fs.remove, { desc = 'Delete', buffer = bufnr, noremap = true, silent = true, nowait = true }) @@ -82,6 +84,8 @@ local LEGACY_MAPPINGS = { first_sibling = { key = "K", desc = "First Sibling", fn = api.node.navigate.sibling.first, n = "api.node.navigate.sibling.first" }, last_sibling = { key = "J", desc = "Last Sibling", fn = api.node.navigate.sibling.last, n = "api.node.navigate.sibling.last" }, toggle_git_ignored = { key = "I", desc = "Toggle Git Ignore", fn = api.tree.toggle_gitignore_filter, n = "api.tree.toggle_gitignore_filter" }, + toggle_no_buffer = { key = "B", desc = "Toggle No Buffer", fn = api.tree.toggle_no_buffer_filter, n = "api.tree.toggle_no_buffer_filter" }, + toggle_git_clean = { key = "C", desc = "Toggle Git Clean", fn = api.tree.toggle_git_clean_filter, n = "api.tree.toggle_git_clean_filter" }, toggle_dotfiles = { key = "H", desc = "Toggle Dotfiles", fn = api.tree.toggle_hidden_filter, n = "api.tree.toggle_hidden_filter" }, toggle_custom = { key = "U", desc = "Toggle Hidden", fn = api.tree.toggle_custom_filter, n = "api.tree.toggle_custom_filter" }, refresh = { key = "R", desc = "Refresh", fn = api.tree.reload, n = "api.tree.reload" }, @@ -90,6 +94,7 @@ local LEGACY_MAPPINGS = { trash = { key = "D", desc = "Trash", fn = api.fs.trash, n = "api.fs.trash" }, rename = { key = "r", desc = "Rename", fn = api.fs.rename, n = "api.fs.rename" }, full_rename = { key = "", desc = "Rename: Omit Filename", fn = api.fs.rename_sub, n = "api.fs.rename_sub" }, + rename_basename = { key = "e", desc = "Rename: Basename", fn = api.fs.rename_basename, n = "api.fs.rename_basename" }, cut = { key = "x", desc = "Cut", fn = api.fs.cut, n = "api.fs.cut" }, copy = { key = "c", desc = "Copy", fn = api.fs.copy.node, n = "api.fs.copy.node" }, paste = { key = "p", desc = "Paste", fn = api.fs.paste, n = "api.fs.paste" }, diff --git a/lua/nvim-tree/keymap.lua b/lua/nvim-tree/keymap.lua index 169e9017cc6..40933bb23e8 100644 --- a/lua/nvim-tree/keymap.lua +++ b/lua/nvim-tree/keymap.lua @@ -21,7 +21,9 @@ function M.default_on_attach(bufnr) vim.keymap.set('n', '-', api.tree.change_root_to_parent, { desc = 'Up', buffer = bufnr, noremap = true, silent = true, nowait = true }) vim.keymap.set('n', 'a', api.fs.create, { desc = 'Create', buffer = bufnr, noremap = true, silent = true, nowait = true }) vim.keymap.set('n', 'bmv', api.marks.bulk.move, { desc = 'Move Bookmarked', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'B', api.tree.toggle_no_buffer_filter, { desc = 'Toggle No Buffer', buffer = bufnr, noremap = true, silent = true, nowait = true }) vim.keymap.set('n', 'c', api.fs.copy.node, { desc = 'Copy', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'C', api.tree.toggle_git_clean_filter, { desc = 'Toggle Git Clean', buffer = bufnr, noremap = true, silent = true, nowait = true }) vim.keymap.set('n', '[c', api.node.navigate.git.prev, { desc = 'Prev Git', buffer = bufnr, noremap = true, silent = true, nowait = true }) vim.keymap.set('n', ']c', api.node.navigate.git.next, { desc = 'Next Git', buffer = bufnr, noremap = true, silent = true, nowait = true }) vim.keymap.set('n', 'd', api.fs.remove, { desc = 'Delete', buffer = bufnr, noremap = true, silent = true, nowait = true }) diff --git a/scripts/update-help.sh b/scripts/update-help.sh index eeb98b4395e..580d7009461 100755 --- a/scripts/update-help.sh +++ b/scripts/update-help.sh @@ -38,7 +38,7 @@ sed -e "s/^ / /" /tmp/DEFAULT_ON_ATTACH.2.lua > /tmp/DEFAULT_ON_ATTACH.4.lua sed -i -e "/${begin}/,/${end}/{ /${begin}/{p; r /tmp/DEFAULT_ON_ATTACH.4.lua }; /${end}/p; d; }" doc/nvim-tree-lua.txt -# legacy, indented at 2 +# legacy keymap, indented at 2 sed -i -e "/${begin}/,/${end}/{ /${begin}/{p; r /tmp/DEFAULT_ON_ATTACH.2.lua - }; /${end}/p; d; }" lua/nvim-tree/legacy.lua + }; /${end}/p; d; }" lua/nvim-tree/keymap-legacy.lua From 25dc48ded0a723dc080e0b629f33b7bd85ae4341 Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Sun, 12 Feb 2023 16:50:30 +1100 Subject: [PATCH 29/42] legacy api.config.mappings.active and default --- doc/nvim-tree-lua.txt | 7 +-- lua/nvim-tree/api.lua | 9 ++-- lua/nvim-tree/keymap-legacy.lua | 83 +++++++++++++++++++++++++++++++-- 3 files changed, 90 insertions(+), 9 deletions(-) diff --git a/doc/nvim-tree-lua.txt b/doc/nvim-tree-lua.txt index ae9cad99baa..20c01a188cc 100644 --- a/doc/nvim-tree-lua.txt +++ b/doc/nvim-tree-lua.txt @@ -1425,15 +1425,16 @@ api.tree.toggle_help() *nvim-tree.api.tree.toggle_help()* - navigate.select api.config.mappings.active() *nvim-tree.api.config.mappings.active()* - Retrieve a clone of the currently active mappings: - |nvim-tree-default-mappings| with |nvim-tree.view.mappings| applied. + Deprecated: only functions when using legacy |nvim-tree.view.mappings| + Retrieve a clone of the currently active mappings: defaults + user. Changing the active mappings will require a call to |nvim-tree-setup| Return: ~ (table) as per |nvim-tree.view.mappings.list| api.config.mappings.default() *nvim-tree.api.config.mappings.default()* - Retrieve a clone of the default mappings: |nvim-tree-default-mappings| + Deprecated: only functions when using legacy |nvim-tree.view.mappings| + Retrieve a clone of the default mappings. Return: ~ (table) as per |nvim-tree.view.mappings.list| diff --git a/lua/nvim-tree/api.lua b/lua/nvim-tree/api.lua index f3c3552f687..515a415ff90 100644 --- a/lua/nvim-tree/api.lua +++ b/lua/nvim-tree/api.lua @@ -170,8 +170,11 @@ Api.marks.navigate.next = require("nvim-tree.marks.navigation").next Api.marks.navigate.prev = require("nvim-tree.marks.navigation").prev Api.marks.navigate.select = require("nvim-tree.marks.navigation").select --- TODO #1579 source from LEGACY_MAPPINGS --- Api.config.mappings.active = require("nvim-tree.actions").active_mappings_clone --- Api.config.mappings.default = require("nvim-tree.actions").default_mappings_clone +Api.config.mappings.active = function() + return require("nvim-tree.keymap-legacy").active_mappings_clone() +end +Api.config.mappings.default = function() + return require("nvim-tree.keymap-legacy").default_mappings_clone() +end return Api diff --git a/lua/nvim-tree/keymap-legacy.lua b/lua/nvim-tree/keymap-legacy.lua index 2fe3a344cae..0f200d9bfe0 100644 --- a/lua/nvim-tree/keymap-legacy.lua +++ b/lua/nvim-tree/keymap-legacy.lua @@ -3,7 +3,9 @@ local open_file = require "nvim-tree.actions.node.open-file" local keymap = require "nvim-tree.keymap" local M = { - user_on_attach_lua = "", + on_attach_lua = "", + legacy_default = {}, + legacy_active = {}, } local DEFAULT_ON_ATTACH = [[ @@ -157,6 +159,71 @@ local function generate_on_attach_function(list, remove_keys, remove_defaults) end end +local function generate_legacy_default_mappings() + local mappings = {} + + for a, m in pairs(LEGACY_MAPPINGS) do + table.insert(mappings, { + action = a, + desc = m.desc, + key = m.key, + }) + end + + return mappings +end + +-- taken from actions/init merge_mappings +local function generate_legacy_active_mappings(user_mappings, default) + if #user_mappings == 0 then + return default + end + + local function is_empty(s) + return s == "" + end + + local user_keys = {} + local removed_keys = {} + -- remove default mappings if action is a empty string + for _, map in pairs(user_mappings) do + if type(map.key) == "table" then + for _, key in pairs(map.key) do + table.insert(user_keys, key) + if is_empty(map.action) then + table.insert(removed_keys, key) + end + end + else + table.insert(user_keys, map.key) + if is_empty(map.action) then + table.insert(removed_keys, map.key) + end + end + end + + local default_map = vim.tbl_filter(function(map) + if type(map.key) == "table" then + local filtered_keys = {} + for _, key in pairs(map.key) do + if not vim.tbl_contains(user_keys, key) and not vim.tbl_contains(removed_keys, key) then + table.insert(filtered_keys, key) + end + end + map.key = filtered_keys + return not vim.tbl_isempty(map.key) + else + return not vim.tbl_contains(user_keys, map.key) and not vim.tbl_contains(removed_keys, map.key) + end + end, default) + + local user_map = vim.tbl_filter(function(map) + return not is_empty(map.action) + end, user_mappings) + + return vim.fn.extend(default_map, user_map) +end + local function generate_on_attach_lua(list, remove_keys) local lua = "" @@ -219,17 +286,27 @@ function M.generate_legacy_on_attach(opts) end opts.on_attach = generate_on_attach_function(list, remove_keys, remove_defaults) - M.user_on_attach_lua = generate_on_attach_lua(list, remove_keys) + M.on_attach_lua = generate_on_attach_lua(list, remove_keys) + M.legacy_default = generate_legacy_default_mappings() + M.legacy_active = generate_legacy_active_mappings(list, vim.deepcopy(M.legacy_default)) end function M.generate_on_attach() local name = "/tmp/my_on_attach.lua" local file = io.output(name) io.write(DEFAULT_ON_ATTACH) - io.write(M.user_on_attach_lua) + io.write(M.on_attach_lua) io.write "end" io.close(file) open_file.fn("edit", name) end +function M.active_mappings_clone() + return vim.deepcopy(M.legacy_active) +end + +function M.default_mappings_clone() + return vim.deepcopy(M.legacy_default) +end + return M From e01fa1c7a7a14cb1b15a3672fc3aa53e8981bf19 Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Sun, 12 Feb 2023 17:22:08 +1100 Subject: [PATCH 30/42] legacy api.config.mappings.active and default --- lua/nvim-tree/keymap-legacy.lua | 33 ++++++++++++++++++++++++++++----- scripts/update-help.sh | 4 ++-- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/lua/nvim-tree/keymap-legacy.lua b/lua/nvim-tree/keymap-legacy.lua index 0f200d9bfe0..4d38952ea5c 100644 --- a/lua/nvim-tree/keymap-legacy.lua +++ b/lua/nvim-tree/keymap-legacy.lua @@ -173,10 +173,33 @@ local function generate_legacy_default_mappings() return mappings end --- taken from actions/init merge_mappings -local function generate_legacy_active_mappings(user_mappings, default) +-- taken from actions/init merge_mappings and filter_mappings +local function generate_legacy_active_mappings(user_mappings, defaults, remove_keys, remove_defaults) + local filtered_defaults + + -- + -- filter_mappings + -- + if remove_defaults then + filtered_defaults = {} + else + filtered_defaults = vim.tbl_filter(function(m) + if type(m.key) == "table" then + m.key = vim.tbl_filter(function(k) + return not vim.tbl_contains(remove_keys, k) + end, m.key) + return #m.key > 0 + else + return not vim.tbl_contains(remove_keys, m.key) + end + end, vim.deepcopy(defaults)) + end + + -- + -- merge_mappings + -- if #user_mappings == 0 then - return default + return filtered_defaults end local function is_empty(s) @@ -215,7 +238,7 @@ local function generate_legacy_active_mappings(user_mappings, default) else return not vim.tbl_contains(user_keys, map.key) and not vim.tbl_contains(removed_keys, map.key) end - end, default) + end, filtered_defaults) local user_map = vim.tbl_filter(function(map) return not is_empty(map.action) @@ -288,7 +311,7 @@ function M.generate_legacy_on_attach(opts) opts.on_attach = generate_on_attach_function(list, remove_keys, remove_defaults) M.on_attach_lua = generate_on_attach_lua(list, remove_keys) M.legacy_default = generate_legacy_default_mappings() - M.legacy_active = generate_legacy_active_mappings(list, vim.deepcopy(M.legacy_default)) + M.legacy_active = generate_legacy_active_mappings(list, M.legacy_default, remove_keys, remove_defaults) end function M.generate_on_attach() diff --git a/scripts/update-help.sh b/scripts/update-help.sh index 580d7009461..9e720cad8c6 100755 --- a/scripts/update-help.sh +++ b/scripts/update-help.sh @@ -1,7 +1,7 @@ #!/bin/sh -# run after changing nvim-tree.lua DEFAULT_OPTS or nvim-tree/keymap.lua M.default_on_attach -# scrapes and updates nvim-tree-lua.txt +# run after changing nvim-tree.lua DEFAULT_OPTS or keymap.lua M.default_on_attach +# scrapes and updates nvim-tree-lua.txt and keymap-legacy.lua # run from repository root: scripts/update-help.sh From 4f89a04e99e4f097f002d996575808bd5c7594e9 Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Mon, 20 Feb 2023 14:11:02 +1100 Subject: [PATCH 31/42] on_attach help and readme --- README.md | 34 +++------ doc/nvim-tree-lua.txt | 173 +++++++++++++++++++++++++++--------------- lua/nvim-tree.lua | 2 +- 3 files changed, 120 insertions(+), 89 deletions(-) diff --git a/README.md b/README.md index 7b6a6c0ce9a..67fb96bb141 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,10 @@ Take a look at the [wiki](https://github.com/nvim-tree/nvim-tree.lua/wiki) for S Existing `*_on_setup*` mechanisms have been removed in favour of [Open At Startup](https://github.com/nvim-tree/nvim-tree.lua/wiki/Open-At-Startup) +## New Mapping Method 2023-03-01 + +[:help nvim-tree.view.mappings](doc/nvim-tree-lua.txt) have been deprecated in favour of [:help nvim-tree.on_attach](doc/nvim-tree-lua.txt). Please visit [Migrating To on_attach](https://github.com/nvim-tree/nvim-tree.lua/wiki/Migrating-To-on_attach) to transition. + ## Requirements [neovim >=0.8.0](https://github.com/neovim/neovim/wiki/Installing-Neovim) @@ -77,14 +81,6 @@ require("nvim-tree").setup() -- OR setup with some options require("nvim-tree").setup({ sort_by = "case_sensitive", - view = { - width = 30, - mappings = { - list = { - { key = "u", action = "dir_up" }, - }, - }, - }, renderer = { group_empty = true, }, @@ -96,7 +92,7 @@ require("nvim-tree").setup({ For complete list of available configuration options see [:help nvim-tree-setup](doc/nvim-tree-lua.txt) -Each option is documented in `:help nvim-tree.OPTION_NAME`. Nested options can be accessed by appending `.`, for example [:help nvim-tree.view.mappings](doc/nvim-tree-lua.txt) +Each option is documented in `:help nvim-tree.OPTION_NAME`. Nested options can be accessed by appending `.`, for example [:help nvim-tree.filters.dotfiles](doc/nvim-tree-lua.txt) ## Commands @@ -114,10 +110,10 @@ Basic commands: ## Mappings -nvim-tree comes with number of mappings; for default mappings please see [:help nvim-tree-default-mappings](doc/nvim-tree-lua.txt), for way of configuring mappings see [:help nvim-tree-mappings](doc/nvim-tree-lua.txt) - `g?` toggles help, showing all the mappings and their actions. +To customise your mappings see [:help nvim-tree.on_attach](doc/nvim-tree-lua.txt) and [:help nvim-tree-mappings](doc/nvim-tree-lua.txt) + ## Roadmap nvim-tree is stable and new major features will not be added. The focus is on existing user experience. @@ -133,25 +129,13 @@ Development is focused on: ## API -nvim-tree exposes a public API. This is non breaking, with additions made as necessary. +nvim-tree exposes a public API. This is non breaking, with additions made as necessary. See [:help nvim-tree-api](doc/nvim-tree-lua.txt) See wiki [Recipes](https://github.com/nvim-tree/nvim-tree.lua/wiki/Recipes) and [Tips](https://github.com/nvim-tree/nvim-tree.lua/wiki/Tips) for ideas and insipration. Please raise a [feature request](https://github.com/nvim-tree/nvim-tree.lua/issues/new?assignees=&labels=feature+request&template=feature_request.md&title=) if the API is insufficent for your needs. [Contributions](#Contributing) are always welcome. -[:help nvim-tree-api](doc/nvim-tree-lua.txt) - -### Events - -Users may subscribe to events that nvim-tree will dispatch in a variety of situations. - -[:help nvim-tree-events](doc/nvim-tree-lua.txt) - -### Actions - -Custom actions may be mapped which can invoke API or perform your own actions. - -[:help nvim-tree-mappings](doc/nvim-tree-lua.txt) +You may also subscribe to events that nvim-tree will dispatch in a variety of situations, see [:help nvim-tree-events](doc/nvim-tree-lua.txt) ## Contributing diff --git a/doc/nvim-tree-lua.txt b/doc/nvim-tree-lua.txt index 6d4e402ccb8..b73f2d48d25 100644 --- a/doc/nvim-tree-lua.txt +++ b/doc/nvim-tree-lua.txt @@ -11,6 +11,8 @@ CONTENTS *nvim-tree* 4. Setup/Configuration |nvim-tree-setup| 5. Api |nvim-tree-api| 6. Mappings |nvim-tree-mappings| + 6.1 Default Mappings |nvim-tree-mappings-default| + 6.2 Legacy Mappings |nvim-tree-mappings-legacy| 7. Highlight Groups |nvim-tree-highlight| 8. Events |nvim-tree-events| 9. Bookmarks |nvim-tree-bookmarks| @@ -99,27 +101,27 @@ Setup should be run in a lua file or in a |lua-heredoc| if using in a vim file. ============================================================================== 3. COMMANDS *nvim-tree-commands* -|:NvimTreeOpen| +*:NvimTreeOpen* opens the tree. Takes an optional path argument. -|:NvimTreeClose| +*:NvimTreeClose* closes the tree -|:NvimTreeToggle| +*:NvimTreeToggle* open or close the tree. Takes an optional path argument. -|:NvimTreeFocus| +*:NvimTreeFocus* open the tree if it is closed, and then focus on the tree -|:NvimTreeRefresh| +*:NvimTreeRefresh* refresh the tree -|:NvimTreeFindFile| +*:NvimTreeFindFile* The command will change the cursor in the tree for the current bufname. @@ -129,7 +131,7 @@ Setup should be run in a lua file or in a |lua-heredoc| if using in a vim file. Invoke with a bang `:NvimTreeFindFile!` to update the root. -|:NvimTreeFindFileToggle| +*:NvimTreeFindFileToggle* close the tree or change the cursor in the tree for the current bufname, similar to combination of |:NvimTreeToggle| and |:NvimTreeFindFile|. Takes an @@ -137,11 +139,11 @@ Setup should be run in a lua file or in a |lua-heredoc| if using in a vim file. Invoke with a bang `:NvimTreeFindFileToggle!` to update the root. -|:NvimTreeClipboard| +*:NvimTreeClipboard* Print clipboard content for both cut and copy -|:NvimTreeResize| +*:NvimTreeResize* Resize the NvimTree window to the given size. Example: `:NvimTreeResize 50` resizes the window to the width of 50. If the size starts with "+" or "-" it @@ -149,15 +151,21 @@ Setup should be run in a lua file or in a |lua-heredoc| if using in a vim file. Example `:NvimTreeResize -20` removes the value 20 from the current width. And `:NvimTreeResize +20` adds the value 20 to the current width. -|:NvimTreeCollapse| +*:NvimTreeCollapse* Collapses the nvim-tree recursively. -|:NvimTreeCollapseKeepBuffers| +*:NvimTreeCollapseKeepBuffers* Collapses the nvim-tree recursively, but keep the directories open, which are used in an open buffer. +*:NvimTreeGenerateOnAttach* + + Creates and opens a new file `/tmp/my_on_attach.lua` containing an + |nvim-tree.on_attach| function based on your |nvim-tree.view.mappings|, + |nvim-tree.remove_keymaps| as well as the defaults. + See https://github.com/nvim-tree/nvim-tree.lua/wiki/Migrating-To-on_attach ============================================================================== 4. SETUP *nvim-tree-setup* @@ -184,7 +192,7 @@ Subsequent calls to setup will replace the previous configuration. sync_root_with_cwd = false, reload_on_bufenter = false, respect_buf_cwd = false, - on_attach = "disable", + on_attach = "default", remove_keymaps = false, select_prompts = false, view = { @@ -682,23 +690,13 @@ performance. Type: {string}, Default: `{}` *nvim-tree.on_attach* -Function ran when creating the nvim-tree buffer. -This can be used to attach keybindings to the tree buffer. -When on_attach is not a function, |nvim-tree.view.mappings| will be used. - Type: `function(bufnr)`, Default: `"disable"` - e.g. > - local api = require('nvim-tree.api') +Runs when creating the nvim-tree buffer. Use this to set your nvim-tree +specific mappings. See |nvim-tree-mappings|. +When on_attach is not a function, |nvim-tree-mappings-default| will be called. + Type: `function(bufnr) | string`, Default: `"default"` - local function on_attach(bufnr) - vim.keymap.set('n', '?', api.tree.toggle_help, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Help' }) - vim.keymap.set('n', 'h', api.tree.toggle_help, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = 'Help' }) - vim.keymap.set("n", "", function() - local node = api.tree.get_node_under_cursor() - print(node.absolute_path) - end, { buffer = bufnr, noremap = true, silent = true, nowait = true, desc = "my description" }) - end -< *nvim-tree.remove_keymaps* +Deprecated: please see |nvim-tree-mappings-legacy| This can be used to remove the default mappings in the tree. - Remove specific keys by passing a `string` table of keys eg. {"", "", "o", ""} @@ -775,7 +773,7 @@ Window / buffer setup. Type: `string`, Default: `"yes"` *nvim-tree.view.mappings* - Configuration options for |nvim-tree-mappings| + Deprecated: please see |nvim-tree-mappings-legacy| *nvim-tree.view.mappings.custom_only* Will use only the provided user mappings and not the default otherwise, @@ -786,7 +784,7 @@ Window / buffer setup. *nvim-tree.view.mappings.list* A list of keymaps that will extend or override the default keymaps. Type: `table` - Default: see |nvim-tree-default-mappings| + Default: see |nvim-tree-mappings-legacy| *nvim-tree.view.float* Configuration options for floating window @@ -1445,54 +1443,52 @@ api.config.mappings.default() *nvim-tree.api.config.mappings.default()* ============================================================================== 6. MAPPINGS *nvim-tree-mappings* -Setting your own mapping in the configuration will soon be deprecated, see -|nvim-tree.on_attach| for experimental replacement. - -`view.mappings.list` is a table of: - {key} (string|table of string) mandatory |{lhs}|. - - {action} (string) mandatory name of the action. - `""` to remove an action with {key}. The case of {key} must - exactly match the action you are removing e.g. `''` to - remove the default preview action. - An arbitrary description when using `action_cb`. +Mappings are set via the |nvim-tree.on_attach| function, which is run upon +creating the nvim-tree buffer. Mappings may be directly to |nvim-tree-api| +functions or your own. - {action_cb} (function) optional custom function that will be called. - Receives the node as a parameter. - Non-empty description for `action` is required. +When on_attach is not a function, |nvim-tree-mappings-default| will be used. - {mode} (string) optional mode as per |nvim_set_keymap|. - Default `'n'`. +Active mappings may be viewed via HELP, default `g?`. The mapping's description +is used when displaying HELP. -Examples: +The `on_attach` function is passed the `bufnr` of nvim-tree. Use +|vim.keymap.set()| or |nvim_set_keymap()| to define mappings as usual. e.g. > - local function print_node_path(node) - print(node.absolute_path) - end + local M = {} - ---- - - view = { - mappings = { - list = { - -- remove a default mapping for cd - { key = "<2-RightMouse>", action = "" }, + local api = require("nvim-tree.api") - -- add multiple normal mode mappings for edit - { key = { "", "o" }, action = "edit", mode = "n" }, + function M.on_attach(bufnr) + -- put some default mappings here + vim.keymap.set('n', 'h', api.tree.toggle_help, { desc = 'Help', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', '?', api.tree.toggle_help, { desc = 'Help', buffer = bufnr, noremap = true, silent = true, nowait = true }) + vim.keymap.set('n', 'p', M.print_node_path, { desc = 'Print', buffer = bufnr, noremap = true, silent = true, nowait = true }) + end - -- custom action - { key = "p", action = "print_the_node_path", action_cb = print_node_path }, + function M.print_node_path() + local node = api.tree.get_node_under_cursor() + print(node.absolute_path) + end - ---- + require("nvim-tree").setup({ + on_attach = M.on_attach, + -- + }) < -Mouse support defined in |KeyBindings| +Mouse support is defined in |KeyBindings| Single left mouse mappings can be achieved via ``. Single right / middle mouse mappings will requre changes to |mousemodel| or |mouse|. -DEFAULT MAPPINGS *nvim-tree-default-mappings* +============================================================================== + 6.1 DEFAULT MAPPINGS *nvim-tree-mappings-default* + +In the absence of an |nvim-tree.on_attach| function, the following defaults +will be applied. + +You are encouraged to copy these to your own |nvim-tree.on_attach| function. > local on_attach = function(bufnr) local api = require('nvim-tree.api') @@ -1552,7 +1548,58 @@ DEFAULT MAPPINGS *nvim-tree-default-mappings vim.keymap.set('n', '<2-RightMouse>', api.tree.change_root_to_node, { desc = 'CD', buffer = bufnr, noremap = true, silent = true, nowait = true }) -- END_DEFAULT_ON_ATTACH end +< +============================================================================== + 6.2 LEGACY MAPPINGS *nvim-tree-mappings-legacy* + +nvim-tree mappings were provided via the deprecated |nvim-tree.view.mappings| +and |nvim-tree.remove_keymaps| + +These are ignored when |nvim-tree.on_attach| is present. + +You are encouraged to migrate you existing legacy mappings to +|nvim-tree.on_attach| using |:NvimTreeGenerateOnAttach| + +Please visit https://github.com/nvim-tree/nvim-tree.lua/wiki/Migrating-To-on_attach + +`view.mappings.list` is a table of: + {key} (string|table of string) mandatory |{lhs}|. + + {action} (string) mandatory name of the action. + `""` to remove an action with {key}. The case of {key} must + exactly match the action you are removing e.g. `''` to + remove the default preview action. + An arbitrary description when using `action_cb`. + {action_cb} (function) optional custom function that will be called. + Receives the node as a parameter. + Non-empty description for `action` is required. + + {mode} (string) optional mode as per |nvim_set_keymap|. + Default `'n'`. + +Examples: +> + local function print_node_path(node) + print(node.absolute_path) + end + + ---- + + view = { + mappings = { + list = { + -- remove a default mapping for cd + { key = "<2-RightMouse>", action = "" }, + + -- add multiple normal mode mappings for edit + { key = { "", "o" }, action = "edit", mode = "n" }, + + -- custom action + { key = "p", action = "print_the_node_path", action_cb = print_node_path }, + + ---- +< ============================================================================== 7. HIGHLIGHT GROUPS *nvim-tree-highlight* diff --git a/lua/nvim-tree.lua b/lua/nvim-tree.lua index edadb251ce3..4ae77762963 100644 --- a/lua/nvim-tree.lua +++ b/lua/nvim-tree.lua @@ -561,7 +561,7 @@ local DEFAULT_OPTS = { -- BEGIN_DEFAULT_OPTS sync_root_with_cwd = false, reload_on_bufenter = false, respect_buf_cwd = false, - on_attach = "disable", + on_attach = "default", remove_keymaps = false, select_prompts = false, view = { From 90ea114898c8706c4dd6702d902f45a2df5c2faf Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Mon, 20 Feb 2023 15:18:13 +1100 Subject: [PATCH 32/42] legacy generate handles action = "" --- lua/nvim-tree/keymap-legacy.lua | 63 ++++++++++++++++++++++----------- 1 file changed, 42 insertions(+), 21 deletions(-) diff --git a/lua/nvim-tree/keymap-legacy.lua b/lua/nvim-tree/keymap-legacy.lua index 4d38952ea5c..c75253b32da 100644 --- a/lua/nvim-tree/keymap-legacy.lua +++ b/lua/nvim-tree/keymap-legacy.lua @@ -9,10 +9,6 @@ local M = { } local DEFAULT_ON_ATTACH = [[ -local api = require('nvim-tree.api') - -local on_attach = function(bufnr) - -- BEGIN_DEFAULT_ON_ATTACH vim.keymap.set('n', '', api.tree.change_root_to_node, { desc = 'CD', buffer = bufnr, noremap = true, silent = true, nowait = true }) vim.keymap.set('n', '', api.node.open.replace_tree_buffer, { desc = 'Open: In Place', buffer = bufnr, noremap = true, silent = true, nowait = true }) @@ -123,7 +119,20 @@ local LEGACY_MAPPINGS = { } -- stylua: ignore end -local function generate_on_attach_function(list, remove_keys, remove_defaults) +local function all_unmapped_keys(list, remove_keys) + local unmapped_keys = vim.deepcopy(remove_keys) + for _, map in pairs(list) do + if map.action == "" then + local keys = type(map.key) == "table" and map.key or { map.key } + for _, key in ipairs(keys) do + table.insert(unmapped_keys, key) + end + end + end + return unmapped_keys +end + +local function generate_on_attach_function(list, unmapped_keys, remove_defaults) return function(bufnr) -- apply defaults first if not remove_defaults then @@ -131,7 +140,7 @@ local function generate_on_attach_function(list, remove_keys, remove_defaults) end -- explicit removals - for _, key in ipairs(remove_keys) do + for _, key in ipairs(unmapped_keys) do vim.keymap.set("n", key, "", { buffer = bufnr }) vim.keymap.del("n", key, { buffer = bufnr }) end @@ -247,16 +256,26 @@ local function generate_legacy_active_mappings(user_mappings, defaults, remove_k return vim.fn.extend(default_map, user_map) end -local function generate_on_attach_lua(list, remove_keys) - local lua = "" +local function generate_on_attach_lua(list, unmapped_keys, remove_defaults) + local lua = [[ +local api = require('nvim-tree.api') + +local on_attach = function(bufnr) +]] - -- explicit removals - if #remove_keys > 0 then - lua = lua .. "\n -- remove_keys\n" - end - for _, key in ipairs(remove_keys) do - lua = lua .. string.format([[ vim.keymap.set('n', '%s', '', { buffer = bufnr })]], key) .. "\n" - lua = lua .. string.format([[ vim.keymap.del('n', '%s', { buffer = bufnr })]], key) .. "\n" + if remove_defaults then + -- no defaults + lua = lua .. "\n -- remove_keymaps = true\n" + else + -- defaults with explicit removals + lua = lua .. DEFAULT_ON_ATTACH + if #unmapped_keys > 0 then + lua = lua .. '\n -- remove_keymaps, action = ""\n' + end + for _, key in ipairs(unmapped_keys) do + lua = lua .. string.format([[ vim.keymap.set('n', '%s', '', { buffer = bufnr })]], key) .. "\n" + lua = lua .. string.format([[ vim.keymap.del('n', '%s', { buffer = bufnr })]], key) .. "\n" + end end -- list @@ -299,25 +318,27 @@ function M.generate_legacy_on_attach(opts) end local list = opts.view and opts.view.mappings and opts.view.mappings.list or {} - local remove_keys = type(opts.remove_keymaps) == "table" and opts.remove_keymaps or {} + local remove_keymaps = type(opts.remove_keymaps) == "table" and opts.remove_keymaps or {} local remove_defaults = opts.remove_keymaps == true or opts.view and opts.view.mappings and opts.view.mappings.custom_only -- do nothing unless the user has configured something - if #list == 0 and #remove_keys == 0 and not remove_defaults then + if #list == 0 and #remove_keymaps == 0 and not remove_defaults then return end - opts.on_attach = generate_on_attach_function(list, remove_keys, remove_defaults) - M.on_attach_lua = generate_on_attach_lua(list, remove_keys) + local unmapped_keys = all_unmapped_keys(list, remove_keymaps) + + opts.on_attach = generate_on_attach_function(list, unmapped_keys, remove_defaults) + M.on_attach_lua = generate_on_attach_lua(list, unmapped_keys, remove_defaults) + M.legacy_default = generate_legacy_default_mappings() - M.legacy_active = generate_legacy_active_mappings(list, M.legacy_default, remove_keys, remove_defaults) + M.legacy_active = generate_legacy_active_mappings(list, M.legacy_default, remove_keymaps, remove_defaults) end function M.generate_on_attach() local name = "/tmp/my_on_attach.lua" local file = io.output(name) - io.write(DEFAULT_ON_ATTACH) io.write(M.on_attach_lua) io.write "end" io.close(file) From f073cbaf055f5588933a92a411243816540253b3 Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Mon, 20 Feb 2023 15:37:52 +1100 Subject: [PATCH 33/42] legacy generate handles action = --- lua/nvim-tree/keymap-legacy.lua | 138 ++++++++++++-------------------- 1 file changed, 49 insertions(+), 89 deletions(-) diff --git a/lua/nvim-tree/keymap-legacy.lua b/lua/nvim-tree/keymap-legacy.lua index c75253b32da..7f5f8108c0e 100644 --- a/lua/nvim-tree/keymap-legacy.lua +++ b/lua/nvim-tree/keymap-legacy.lua @@ -168,94 +168,6 @@ local function generate_on_attach_function(list, unmapped_keys, remove_defaults) end end -local function generate_legacy_default_mappings() - local mappings = {} - - for a, m in pairs(LEGACY_MAPPINGS) do - table.insert(mappings, { - action = a, - desc = m.desc, - key = m.key, - }) - end - - return mappings -end - --- taken from actions/init merge_mappings and filter_mappings -local function generate_legacy_active_mappings(user_mappings, defaults, remove_keys, remove_defaults) - local filtered_defaults - - -- - -- filter_mappings - -- - if remove_defaults then - filtered_defaults = {} - else - filtered_defaults = vim.tbl_filter(function(m) - if type(m.key) == "table" then - m.key = vim.tbl_filter(function(k) - return not vim.tbl_contains(remove_keys, k) - end, m.key) - return #m.key > 0 - else - return not vim.tbl_contains(remove_keys, m.key) - end - end, vim.deepcopy(defaults)) - end - - -- - -- merge_mappings - -- - if #user_mappings == 0 then - return filtered_defaults - end - - local function is_empty(s) - return s == "" - end - - local user_keys = {} - local removed_keys = {} - -- remove default mappings if action is a empty string - for _, map in pairs(user_mappings) do - if type(map.key) == "table" then - for _, key in pairs(map.key) do - table.insert(user_keys, key) - if is_empty(map.action) then - table.insert(removed_keys, key) - end - end - else - table.insert(user_keys, map.key) - if is_empty(map.action) then - table.insert(removed_keys, map.key) - end - end - end - - local default_map = vim.tbl_filter(function(map) - if type(map.key) == "table" then - local filtered_keys = {} - for _, key in pairs(map.key) do - if not vim.tbl_contains(user_keys, key) and not vim.tbl_contains(removed_keys, key) then - table.insert(filtered_keys, key) - end - end - map.key = filtered_keys - return not vim.tbl_isempty(map.key) - else - return not vim.tbl_contains(user_keys, map.key) and not vim.tbl_contains(removed_keys, map.key) - end - end, filtered_defaults) - - local user_map = vim.tbl_filter(function(map) - return not is_empty(map.action) - end, user_mappings) - - return vim.fn.extend(default_map, user_map) -end - local function generate_on_attach_lua(list, unmapped_keys, remove_defaults) local lua = [[ local api = require('nvim-tree.api') @@ -312,6 +224,54 @@ local on_attach = function(bufnr) return lua end +local function generate_legacy_default_mappings() + local mappings = {} + + for a, m in pairs(LEGACY_MAPPINGS) do + table.insert(mappings, { + action = a, + desc = m.desc, + key = m.key, + }) + end + + return mappings +end + +local function generate_legacy_active_mappings(list, defaults, unmapped_keys, remove_defaults) + local filtered_defaults + + -- + -- remove explicitly unmapped defaults + -- + if remove_defaults then + filtered_defaults = {} + else + filtered_defaults = vim.tbl_filter(function(m) + if type(m.key) == "table" then + m.key = vim.tbl_filter(function(k) + return not vim.tbl_contains(unmapped_keys, k) + end, m.key) + return #m.key > 0 + else + return not vim.tbl_contains(unmapped_keys, m.key) + end + end, vim.deepcopy(defaults)) + end + + -- + -- remove user action = "" + -- + local user_map = vim.tbl_filter(function(map) + return map.action ~= "" + end, list) + + -- + -- merge + -- + return vim.fn.extend(filtered_defaults, user_map) +end + function M.generate_legacy_on_attach(opts) if type(opts.on_attach) == "function" then return @@ -333,7 +293,7 @@ function M.generate_legacy_on_attach(opts) M.on_attach_lua = generate_on_attach_lua(list, unmapped_keys, remove_defaults) M.legacy_default = generate_legacy_default_mappings() - M.legacy_active = generate_legacy_active_mappings(list, M.legacy_default, remove_keymaps, remove_defaults) + M.legacy_active = generate_legacy_active_mappings(list, M.legacy_default, unmapped_keys, remove_defaults) end function M.generate_on_attach() From 00be1db28dc74590dd1e2dcd47d02c7dd6985b69 Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Mon, 20 Feb 2023 15:56:42 +1100 Subject: [PATCH 34/42] legacy generate gives defaults when no user mappings --- lua/nvim-tree/keymap-legacy.lua | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/lua/nvim-tree/keymap-legacy.lua b/lua/nvim-tree/keymap-legacy.lua index 7f5f8108c0e..fa22b97ec6d 100644 --- a/lua/nvim-tree/keymap-legacy.lua +++ b/lua/nvim-tree/keymap-legacy.lua @@ -8,6 +8,16 @@ local M = { legacy_active = {}, } +local BEGIN_ON_ATTACH = [[ +local api = require('nvim-tree.api') + +local on_attach = function(bufnr) +]] + +local END_ON_ATTACH = [[ +end +]] + local DEFAULT_ON_ATTACH = [[ -- BEGIN_DEFAULT_ON_ATTACH vim.keymap.set('n', '', api.tree.change_root_to_node, { desc = 'CD', buffer = bufnr, noremap = true, silent = true, nowait = true }) @@ -169,15 +179,11 @@ local function generate_on_attach_function(list, unmapped_keys, remove_defaults) end local function generate_on_attach_lua(list, unmapped_keys, remove_defaults) - local lua = [[ -local api = require('nvim-tree.api') - -local on_attach = function(bufnr) -]] + local lua = BEGIN_ON_ATTACH .. "\n" if remove_defaults then -- no defaults - lua = lua .. "\n -- remove_keymaps = true\n" + lua = lua .. "\n -- remove_keymaps = true OR view.mappings.custom_only = true\n" else -- defaults with explicit removals lua = lua .. DEFAULT_ON_ATTACH @@ -216,12 +222,12 @@ local on_attach = function(bufnr) [[ end, { desc = '%s', buffer = bufnr, noremap = true, silent = true, nowait = true })]], m.action ) - .. "\n" + .. "\n\n" end end end - return lua + return lua .. "\n" .. END_ON_ATTACH end local function generate_legacy_default_mappings() @@ -273,6 +279,8 @@ local function generate_legacy_active_mappings(list, defaults, unmapped_keys, re end function M.generate_legacy_on_attach(opts) + M.on_attach_lua = BEGIN_ON_ATTACH .. "\n" .. DEFAULT_ON_ATTACH .. "\n" .. END_ON_ATTACH + if type(opts.on_attach) == "function" then return end @@ -300,7 +308,6 @@ function M.generate_on_attach() local name = "/tmp/my_on_attach.lua" local file = io.output(name) io.write(M.on_attach_lua) - io.write "end" io.close(file) open_file.fn("edit", name) end From 3ca305c860b29e9902347fe7fd0c564406839f14 Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Mon, 20 Feb 2023 16:20:31 +1100 Subject: [PATCH 35/42] legacy generate handles action = "" --- lua/nvim-tree/keymap-legacy.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lua/nvim-tree/keymap-legacy.lua b/lua/nvim-tree/keymap-legacy.lua index fa22b97ec6d..2166c30f4fe 100644 --- a/lua/nvim-tree/keymap-legacy.lua +++ b/lua/nvim-tree/keymap-legacy.lua @@ -179,14 +179,14 @@ local function generate_on_attach_function(list, unmapped_keys, remove_defaults) end local function generate_on_attach_lua(list, unmapped_keys, remove_defaults) - local lua = BEGIN_ON_ATTACH .. "\n" + local lua = BEGIN_ON_ATTACH if remove_defaults then -- no defaults lua = lua .. "\n -- remove_keymaps = true OR view.mappings.custom_only = true\n" else -- defaults with explicit removals - lua = lua .. DEFAULT_ON_ATTACH + lua = lua .. "\n" .. DEFAULT_ON_ATTACH .. "\n" if #unmapped_keys > 0 then lua = lua .. '\n -- remove_keymaps, action = ""\n' end From 4ec73bbf7b3f4ce22043969b7f66698b116091fd Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Mon, 20 Feb 2023 17:06:16 +1100 Subject: [PATCH 36/42] legacy generate api handles overrides --- lua/nvim-tree/keymap-legacy.lua | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/lua/nvim-tree/keymap-legacy.lua b/lua/nvim-tree/keymap-legacy.lua index 2166c30f4fe..f7abefd6c44 100644 --- a/lua/nvim-tree/keymap-legacy.lua +++ b/lua/nvim-tree/keymap-legacy.lua @@ -129,6 +129,19 @@ local LEGACY_MAPPINGS = { } -- stylua: ignore end +local function all_mapped_keys(list) + local mapped_keys = {} + for _, map in pairs(list) do + if map.action ~= "" then + local keys = type(map.key) == "table" and map.key or { map.key } + for _, key in ipairs(keys) do + table.insert(mapped_keys, key) + end + end + end + return mapped_keys +end + local function all_unmapped_keys(list, remove_keys) local unmapped_keys = vim.deepcopy(remove_keys) for _, map in pairs(list) do @@ -244,23 +257,27 @@ local function generate_legacy_default_mappings() return mappings end -local function generate_legacy_active_mappings(list, defaults, unmapped_keys, remove_defaults) +local function generate_legacy_active_mappings(list, defaults, unmapped_keys, mapped_keys, remove_defaults) local filtered_defaults - -- - -- remove explicitly unmapped defaults - -- if remove_defaults then + -- + -- unmap all defaults + -- filtered_defaults = {} else + -- + -- unmap defaults by removal and override + -- + local to_unmap = vim.fn.extend(unmapped_keys, mapped_keys) filtered_defaults = vim.tbl_filter(function(m) if type(m.key) == "table" then m.key = vim.tbl_filter(function(k) - return not vim.tbl_contains(unmapped_keys, k) + return not vim.tbl_contains(to_unmap, k) end, m.key) return #m.key > 0 else - return not vim.tbl_contains(unmapped_keys, m.key) + return not vim.tbl_contains(to_unmap, m.key) end end, vim.deepcopy(defaults)) end @@ -295,13 +312,14 @@ function M.generate_legacy_on_attach(opts) return end + local mapped_keys = all_mapped_keys(list) local unmapped_keys = all_unmapped_keys(list, remove_keymaps) opts.on_attach = generate_on_attach_function(list, unmapped_keys, remove_defaults) M.on_attach_lua = generate_on_attach_lua(list, unmapped_keys, remove_defaults) M.legacy_default = generate_legacy_default_mappings() - M.legacy_active = generate_legacy_active_mappings(list, M.legacy_default, unmapped_keys, remove_defaults) + M.legacy_active = generate_legacy_active_mappings(list, M.legacy_default, unmapped_keys, mapped_keys, remove_defaults) end function M.generate_on_attach() From b7b142708478ac50be4db9b12f37322324d205fc Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Tue, 21 Feb 2023 11:40:22 +1100 Subject: [PATCH 37/42] legacy generate handles subsequent setup, on_attach retains deep copies of legacy config --- lua/nvim-tree.lua | 2 +- lua/nvim-tree/keymap-legacy.lua | 38 +++++++++++++++++++++++++-------- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/lua/nvim-tree.lua b/lua/nvim-tree.lua index 4ae77762963..689ad42305c 100644 --- a/lua/nvim-tree.lua +++ b/lua/nvim-tree.lua @@ -377,7 +377,7 @@ local function setup_vim_commands() vim.api.nvim_create_user_command("NvimTreeCollapseKeepBuffers", function() collapse_all.fn(true) end, { bar = true }) - vim.api.nvim_create_user_command("NvimTreeGenerateOnAttach", keymap_legacy.generate_on_attach, {}) + vim.api.nvim_create_user_command("NvimTreeGenerateOnAttach", keymap_legacy.cmd_generate_on_attach, {}) end function M.change_dir(name) diff --git a/lua/nvim-tree/keymap-legacy.lua b/lua/nvim-tree/keymap-legacy.lua index f7abefd6c44..874bbffa1d1 100644 --- a/lua/nvim-tree/keymap-legacy.lua +++ b/lua/nvim-tree/keymap-legacy.lua @@ -1,11 +1,22 @@ local api = require "nvim-tree.api" local open_file = require "nvim-tree.actions.node.open-file" local keymap = require "nvim-tree.keymap" +local notify = require "nvim-tree.notify" local M = { - on_attach_lua = "", + -- only populated when legacy mappings active + on_attach_lua = nil, + + -- API config.mappings.active .default legacy_default = {}, legacy_active = {}, + + -- used by generated on_attach + on_attach = { + list = {}, + unmapped_keys = {}, + remove_defaults = false, + }, } local BEGIN_ON_ATTACH = [[ @@ -156,20 +167,24 @@ local function all_unmapped_keys(list, remove_keys) end local function generate_on_attach_function(list, unmapped_keys, remove_defaults) + M.on_attach.list = vim.deepcopy(list) + M.on_attach.unmapped_keys = vim.deepcopy(unmapped_keys) + M.on_attach.remove_defaults = remove_defaults + return function(bufnr) -- apply defaults first - if not remove_defaults then + if not M.on_attach.remove_defaults then keymap.default_on_attach(bufnr) end -- explicit removals - for _, key in ipairs(unmapped_keys) do + for _, key in ipairs(M.on_attach.unmapped_keys) do vim.keymap.set("n", key, "", { buffer = bufnr }) vim.keymap.del("n", key, { buffer = bufnr }) end -- mappings - for _, m in ipairs(list) do + for _, m in ipairs(M.on_attach.list) do local keys = type(m.key) == "table" and m.key or { m.key } for _, k in ipairs(keys) do if LEGACY_MAPPINGS[m.action] then @@ -196,12 +211,12 @@ local function generate_on_attach_lua(list, unmapped_keys, remove_defaults) if remove_defaults then -- no defaults - lua = lua .. "\n -- remove_keymaps = true OR view.mappings.custom_only = true\n" + lua = lua .. "\n -- no defaults: remove_keymaps = true OR view.mappings.custom_only = true\n" else -- defaults with explicit removals - lua = lua .. "\n" .. DEFAULT_ON_ATTACH .. "\n" + lua = lua .. "\n" .. DEFAULT_ON_ATTACH if #unmapped_keys > 0 then - lua = lua .. '\n -- remove_keymaps, action = ""\n' + lua = lua .. '\n -- view.mappings.list..action = "", remove_keymaps\n' end for _, key in ipairs(unmapped_keys) do lua = lua .. string.format([[ vim.keymap.set('n', '%s', '', { buffer = bufnr })]], key) .. "\n" @@ -296,7 +311,7 @@ local function generate_legacy_active_mappings(list, defaults, unmapped_keys, ma end function M.generate_legacy_on_attach(opts) - M.on_attach_lua = BEGIN_ON_ATTACH .. "\n" .. DEFAULT_ON_ATTACH .. "\n" .. END_ON_ATTACH + M.on_attach_lua = nil if type(opts.on_attach) == "function" then return @@ -322,7 +337,12 @@ function M.generate_legacy_on_attach(opts) M.legacy_active = generate_legacy_active_mappings(list, M.legacy_default, unmapped_keys, mapped_keys, remove_defaults) end -function M.generate_on_attach() +function M.cmd_generate_on_attach() + if not M.on_attach_lua then + notify.info "No view.mappings.list for on_attach generation." + return + end + local name = "/tmp/my_on_attach.lua" local file = io.output(name) io.write(M.on_attach_lua) From 8359ffc8c54e25e02d2deae393836b9727ee06f9 Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Tue, 21 Feb 2023 11:52:49 +1100 Subject: [PATCH 38/42] add wiki link to generated on_attach --- lua/nvim-tree/keymap-legacy.lua | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lua/nvim-tree/keymap-legacy.lua b/lua/nvim-tree/keymap-legacy.lua index 874bbffa1d1..bdebebaed83 100644 --- a/lua/nvim-tree/keymap-legacy.lua +++ b/lua/nvim-tree/keymap-legacy.lua @@ -20,6 +20,15 @@ local M = { } local BEGIN_ON_ATTACH = [[ +-- +-- This function has been generated from your +-- view.mappings.list +-- view.mappings.custom_only +-- remove_keymaps +-- +-- Please see https://github.com/nvim-tree/nvim-tree.lua/wiki/Migrating-To-on_attach for assistance in migrating. +-- + local api = require('nvim-tree.api') local on_attach = function(bufnr) From 8810d3c15908f4b2c19cf0862ffbbacfef2d618f Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Mon, 27 Feb 2023 13:45:46 +1100 Subject: [PATCH 39/42] add opts helper function for on_attach, prefixing 'nvim-tree: ' --- doc/nvim-tree-lua.txt | 108 +++++++++++++++--------------- lua/nvim-tree/keymap-legacy.lua | 112 +++++++++++++++++--------------- lua/nvim-tree/keymap.lua | 108 +++++++++++++++--------------- lua/nvim-tree/renderer/help.lua | 11 +++- 4 files changed, 180 insertions(+), 159 deletions(-) diff --git a/doc/nvim-tree-lua.txt b/doc/nvim-tree-lua.txt index b73f2d48d25..863e37c794a 100644 --- a/doc/nvim-tree-lua.txt +++ b/doc/nvim-tree-lua.txt @@ -1494,58 +1494,62 @@ You are encouraged to copy these to your own |nvim-tree.on_attach| function. local api = require('nvim-tree.api') -- BEGIN_DEFAULT_ON_ATTACH - vim.keymap.set('n', '', api.tree.change_root_to_node, { desc = 'CD', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', api.node.open.replace_tree_buffer, { desc = 'Open: In Place', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', api.node.show_info_popup, { desc = 'Info', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', api.fs.rename_sub, { desc = 'Rename: Omit Filename', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', api.node.open.tab, { desc = 'Open: New Tab', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', api.node.open.vertical, { desc = 'Open: Vertical Split', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', api.node.open.horizontal, { desc = 'Open: Horizontal Split', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', api.node.navigate.parent_close, { desc = 'Close Directory', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', api.node.open.edit, { desc = 'Open', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', api.node.open.preview, { desc = 'Open Preview', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '>', api.node.navigate.sibling.next, { desc = 'Next Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '<', api.node.navigate.sibling.prev, { desc = 'Previous Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '.', api.node.run.cmd, { desc = 'Run Command', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '-', api.tree.change_root_to_parent, { desc = 'Up', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'a', api.fs.create, { desc = 'Create', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'bmv', api.marks.bulk.move, { desc = 'Move Bookmarked', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'B', api.tree.toggle_no_buffer_filter, { desc = 'Toggle No Buffer', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'c', api.fs.copy.node, { desc = 'Copy', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'C', api.tree.toggle_git_clean_filter, { desc = 'Toggle Git Clean', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '[c', api.node.navigate.git.prev, { desc = 'Prev Git', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', ']c', api.node.navigate.git.next, { desc = 'Next Git', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'd', api.fs.remove, { desc = 'Delete', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'D', api.fs.trash, { desc = 'Trash', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'E', api.tree.expand_all, { desc = 'Expand All', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'e', api.fs.rename_basename, { desc = 'Rename: Basename', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', ']e', api.node.navigate.diagnostics.next, { desc = 'Next Diagnostic', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '[e', api.node.navigate.diagnostics.prev, { desc = 'Prev Diagnostic', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'F', api.live_filter.clear, { desc = 'Clean Filter', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'f', api.live_filter.start, { desc = 'Filter', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'g?', api.tree.toggle_help, { desc = 'Help', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'gy', api.fs.copy.absolute_path, { desc = 'Copy Absolute Path', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'H', api.tree.toggle_hidden_filter, { desc = 'Toggle Dotfiles', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'I', api.tree.toggle_gitignore_filter, { desc = 'Toggle Git Ignore', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'J', api.node.navigate.sibling.last, { desc = 'Last Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'K', api.node.navigate.sibling.first, { desc = 'First Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'm', api.marks.toggle, { desc = 'Toggle Bookmark', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'o', api.node.open.edit, { desc = 'Open', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'O', api.node.open.no_window_picker, { desc = 'Open: No Window Picker', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'p', api.fs.paste, { desc = 'Paste', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'P', api.node.navigate.parent, { desc = 'Parent Directory', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'q', api.tree.close, { desc = 'Close', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'r', api.fs.rename, { desc = 'Rename', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'R', api.tree.reload, { desc = 'Refresh', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 's', api.node.run.system, { desc = 'Run System', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'S', api.tree.search_node, { desc = 'Search', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'U', api.tree.toggle_custom_filter, { desc = 'Toggle Hidden', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'W', api.tree.collapse_all, { desc = 'Collapse', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'x', api.fs.cut, { desc = 'Cut', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'y', api.fs.copy.filename, { desc = 'Copy Name', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'Y', api.fs.copy.relative_path, { desc = 'Copy Relative Path', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '<2-LeftMouse>', api.node.open.edit, { desc = 'Open', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '<2-RightMouse>', api.tree.change_root_to_node, { desc = 'CD', buffer = bufnr, noremap = true, silent = true, nowait = true }) + local opts = function(desc) + return { desc = 'nvim-tree: ' .. desc, buffer = bufnr, noremap = true, silent = true, nowait = true } + end + + vim.keymap.set('n', '', api.tree.change_root_to_node, opts('CD')) + vim.keymap.set('n', '', api.node.open.replace_tree_buffer, opts('Open: In Place')) + vim.keymap.set('n', '', api.node.show_info_popup, opts('Info')) + vim.keymap.set('n', '', api.fs.rename_sub, opts('Rename: Omit Filename')) + vim.keymap.set('n', '', api.node.open.tab, opts('Open: New Tab')) + vim.keymap.set('n', '', api.node.open.vertical, opts('Open: Vertical Split')) + vim.keymap.set('n', '', api.node.open.horizontal, opts('Open: Horizontal Split')) + vim.keymap.set('n', '', api.node.navigate.parent_close, opts('Close Directory')) + vim.keymap.set('n', '', api.node.open.edit, opts('Open')) + vim.keymap.set('n', '', api.node.open.preview, opts('Open Preview')) + vim.keymap.set('n', '>', api.node.navigate.sibling.next, opts('Next Sibling')) + vim.keymap.set('n', '<', api.node.navigate.sibling.prev, opts('Previous Sibling')) + vim.keymap.set('n', '.', api.node.run.cmd, opts('Run Command')) + vim.keymap.set('n', '-', api.tree.change_root_to_parent, opts('Up')) + vim.keymap.set('n', 'a', api.fs.create, opts('Create')) + vim.keymap.set('n', 'bmv', api.marks.bulk.move, opts('Move Bookmarked')) + vim.keymap.set('n', 'B', api.tree.toggle_no_buffer_filter, opts('Toggle No Buffer')) + vim.keymap.set('n', 'c', api.fs.copy.node, opts('Copy')) + vim.keymap.set('n', 'C', api.tree.toggle_git_clean_filter, opts('Toggle Git Clean')) + vim.keymap.set('n', '[c', api.node.navigate.git.prev, opts('Prev Git')) + vim.keymap.set('n', ']c', api.node.navigate.git.next, opts('Next Git')) + vim.keymap.set('n', 'd', api.fs.remove, opts('Delete')) + vim.keymap.set('n', 'D', api.fs.trash, opts('Trash')) + vim.keymap.set('n', 'E', api.tree.expand_all, opts('Expand All')) + vim.keymap.set('n', 'e', api.fs.rename_basename, opts('Rename: Basename')) + vim.keymap.set('n', ']e', api.node.navigate.diagnostics.next, opts('Next Diagnostic')) + vim.keymap.set('n', '[e', api.node.navigate.diagnostics.prev, opts('Prev Diagnostic')) + vim.keymap.set('n', 'F', api.live_filter.clear, opts('Clean Filter')) + vim.keymap.set('n', 'f', api.live_filter.start, opts('Filter')) + vim.keymap.set('n', 'g?', api.tree.toggle_help, opts('Help')) + vim.keymap.set('n', 'gy', api.fs.copy.absolute_path, opts('Copy Absolute Path')) + vim.keymap.set('n', 'H', api.tree.toggle_hidden_filter, opts('Toggle Dotfiles')) + vim.keymap.set('n', 'I', api.tree.toggle_gitignore_filter, opts('Toggle Git Ignore')) + vim.keymap.set('n', 'J', api.node.navigate.sibling.last, opts('Last Sibling')) + vim.keymap.set('n', 'K', api.node.navigate.sibling.first, opts('First Sibling')) + vim.keymap.set('n', 'm', api.marks.toggle, opts('Toggle Bookmark')) + vim.keymap.set('n', 'o', api.node.open.edit, opts('Open')) + vim.keymap.set('n', 'O', api.node.open.no_window_picker, opts('Open: No Window Picker')) + vim.keymap.set('n', 'p', api.fs.paste, opts('Paste')) + vim.keymap.set('n', 'P', api.node.navigate.parent, opts('Parent Directory')) + vim.keymap.set('n', 'q', api.tree.close, opts('Close')) + vim.keymap.set('n', 'r', api.fs.rename, opts('Rename')) + vim.keymap.set('n', 'R', api.tree.reload, opts('Refresh')) + vim.keymap.set('n', 's', api.node.run.system, opts('Run System')) + vim.keymap.set('n', 'S', api.tree.search_node, opts('Search')) + vim.keymap.set('n', 'U', api.tree.toggle_custom_filter, opts('Toggle Hidden')) + vim.keymap.set('n', 'W', api.tree.collapse_all, opts('Collapse')) + vim.keymap.set('n', 'x', api.fs.cut, opts('Cut')) + vim.keymap.set('n', 'y', api.fs.copy.filename, opts('Copy Name')) + vim.keymap.set('n', 'Y', api.fs.copy.relative_path, opts('Copy Relative Path')) + vim.keymap.set('n', '<2-LeftMouse>', api.node.open.edit, opts('Open')) + vim.keymap.set('n', '<2-RightMouse>', api.tree.change_root_to_node, opts('CD')) -- END_DEFAULT_ON_ATTACH end < diff --git a/lua/nvim-tree/keymap-legacy.lua b/lua/nvim-tree/keymap-legacy.lua index bdebebaed83..3d7fa4e9912 100644 --- a/lua/nvim-tree/keymap-legacy.lua +++ b/lua/nvim-tree/keymap-legacy.lua @@ -40,58 +40,62 @@ end local DEFAULT_ON_ATTACH = [[ -- BEGIN_DEFAULT_ON_ATTACH - vim.keymap.set('n', '', api.tree.change_root_to_node, { desc = 'CD', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', api.node.open.replace_tree_buffer, { desc = 'Open: In Place', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', api.node.show_info_popup, { desc = 'Info', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', api.fs.rename_sub, { desc = 'Rename: Omit Filename', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', api.node.open.tab, { desc = 'Open: New Tab', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', api.node.open.vertical, { desc = 'Open: Vertical Split', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', api.node.open.horizontal, { desc = 'Open: Horizontal Split', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', api.node.navigate.parent_close, { desc = 'Close Directory', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', api.node.open.edit, { desc = 'Open', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', api.node.open.preview, { desc = 'Open Preview', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '>', api.node.navigate.sibling.next, { desc = 'Next Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '<', api.node.navigate.sibling.prev, { desc = 'Previous Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '.', api.node.run.cmd, { desc = 'Run Command', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '-', api.tree.change_root_to_parent, { desc = 'Up', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'a', api.fs.create, { desc = 'Create', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'bmv', api.marks.bulk.move, { desc = 'Move Bookmarked', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'B', api.tree.toggle_no_buffer_filter, { desc = 'Toggle No Buffer', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'c', api.fs.copy.node, { desc = 'Copy', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'C', api.tree.toggle_git_clean_filter, { desc = 'Toggle Git Clean', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '[c', api.node.navigate.git.prev, { desc = 'Prev Git', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', ']c', api.node.navigate.git.next, { desc = 'Next Git', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'd', api.fs.remove, { desc = 'Delete', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'D', api.fs.trash, { desc = 'Trash', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'E', api.tree.expand_all, { desc = 'Expand All', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'e', api.fs.rename_basename, { desc = 'Rename: Basename', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', ']e', api.node.navigate.diagnostics.next, { desc = 'Next Diagnostic', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '[e', api.node.navigate.diagnostics.prev, { desc = 'Prev Diagnostic', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'F', api.live_filter.clear, { desc = 'Clean Filter', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'f', api.live_filter.start, { desc = 'Filter', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'g?', api.tree.toggle_help, { desc = 'Help', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'gy', api.fs.copy.absolute_path, { desc = 'Copy Absolute Path', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'H', api.tree.toggle_hidden_filter, { desc = 'Toggle Dotfiles', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'I', api.tree.toggle_gitignore_filter, { desc = 'Toggle Git Ignore', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'J', api.node.navigate.sibling.last, { desc = 'Last Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'K', api.node.navigate.sibling.first, { desc = 'First Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'm', api.marks.toggle, { desc = 'Toggle Bookmark', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'o', api.node.open.edit, { desc = 'Open', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'O', api.node.open.no_window_picker, { desc = 'Open: No Window Picker', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'p', api.fs.paste, { desc = 'Paste', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'P', api.node.navigate.parent, { desc = 'Parent Directory', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'q', api.tree.close, { desc = 'Close', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'r', api.fs.rename, { desc = 'Rename', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'R', api.tree.reload, { desc = 'Refresh', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 's', api.node.run.system, { desc = 'Run System', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'S', api.tree.search_node, { desc = 'Search', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'U', api.tree.toggle_custom_filter, { desc = 'Toggle Hidden', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'W', api.tree.collapse_all, { desc = 'Collapse', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'x', api.fs.cut, { desc = 'Cut', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'y', api.fs.copy.filename, { desc = 'Copy Name', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'Y', api.fs.copy.relative_path, { desc = 'Copy Relative Path', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '<2-LeftMouse>', api.node.open.edit, { desc = 'Open', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '<2-RightMouse>', api.tree.change_root_to_node, { desc = 'CD', buffer = bufnr, noremap = true, silent = true, nowait = true }) + local opts = function(desc) + return { desc = 'nvim-tree: ' .. desc, buffer = bufnr, noremap = true, silent = true, nowait = true } + end + + vim.keymap.set('n', '', api.tree.change_root_to_node, opts('CD')) + vim.keymap.set('n', '', api.node.open.replace_tree_buffer, opts('Open: In Place')) + vim.keymap.set('n', '', api.node.show_info_popup, opts('Info')) + vim.keymap.set('n', '', api.fs.rename_sub, opts('Rename: Omit Filename')) + vim.keymap.set('n', '', api.node.open.tab, opts('Open: New Tab')) + vim.keymap.set('n', '', api.node.open.vertical, opts('Open: Vertical Split')) + vim.keymap.set('n', '', api.node.open.horizontal, opts('Open: Horizontal Split')) + vim.keymap.set('n', '', api.node.navigate.parent_close, opts('Close Directory')) + vim.keymap.set('n', '', api.node.open.edit, opts('Open')) + vim.keymap.set('n', '', api.node.open.preview, opts('Open Preview')) + vim.keymap.set('n', '>', api.node.navigate.sibling.next, opts('Next Sibling')) + vim.keymap.set('n', '<', api.node.navigate.sibling.prev, opts('Previous Sibling')) + vim.keymap.set('n', '.', api.node.run.cmd, opts('Run Command')) + vim.keymap.set('n', '-', api.tree.change_root_to_parent, opts('Up')) + vim.keymap.set('n', 'a', api.fs.create, opts('Create')) + vim.keymap.set('n', 'bmv', api.marks.bulk.move, opts('Move Bookmarked')) + vim.keymap.set('n', 'B', api.tree.toggle_no_buffer_filter, opts('Toggle No Buffer')) + vim.keymap.set('n', 'c', api.fs.copy.node, opts('Copy')) + vim.keymap.set('n', 'C', api.tree.toggle_git_clean_filter, opts('Toggle Git Clean')) + vim.keymap.set('n', '[c', api.node.navigate.git.prev, opts('Prev Git')) + vim.keymap.set('n', ']c', api.node.navigate.git.next, opts('Next Git')) + vim.keymap.set('n', 'd', api.fs.remove, opts('Delete')) + vim.keymap.set('n', 'D', api.fs.trash, opts('Trash')) + vim.keymap.set('n', 'E', api.tree.expand_all, opts('Expand All')) + vim.keymap.set('n', 'e', api.fs.rename_basename, opts('Rename: Basename')) + vim.keymap.set('n', ']e', api.node.navigate.diagnostics.next, opts('Next Diagnostic')) + vim.keymap.set('n', '[e', api.node.navigate.diagnostics.prev, opts('Prev Diagnostic')) + vim.keymap.set('n', 'F', api.live_filter.clear, opts('Clean Filter')) + vim.keymap.set('n', 'f', api.live_filter.start, opts('Filter')) + vim.keymap.set('n', 'g?', api.tree.toggle_help, opts('Help')) + vim.keymap.set('n', 'gy', api.fs.copy.absolute_path, opts('Copy Absolute Path')) + vim.keymap.set('n', 'H', api.tree.toggle_hidden_filter, opts('Toggle Dotfiles')) + vim.keymap.set('n', 'I', api.tree.toggle_gitignore_filter, opts('Toggle Git Ignore')) + vim.keymap.set('n', 'J', api.node.navigate.sibling.last, opts('Last Sibling')) + vim.keymap.set('n', 'K', api.node.navigate.sibling.first, opts('First Sibling')) + vim.keymap.set('n', 'm', api.marks.toggle, opts('Toggle Bookmark')) + vim.keymap.set('n', 'o', api.node.open.edit, opts('Open')) + vim.keymap.set('n', 'O', api.node.open.no_window_picker, opts('Open: No Window Picker')) + vim.keymap.set('n', 'p', api.fs.paste, opts('Paste')) + vim.keymap.set('n', 'P', api.node.navigate.parent, opts('Parent Directory')) + vim.keymap.set('n', 'q', api.tree.close, opts('Close')) + vim.keymap.set('n', 'r', api.fs.rename, opts('Rename')) + vim.keymap.set('n', 'R', api.tree.reload, opts('Refresh')) + vim.keymap.set('n', 's', api.node.run.system, opts('Run System')) + vim.keymap.set('n', 'S', api.tree.search_node, opts('Search')) + vim.keymap.set('n', 'U', api.tree.toggle_custom_filter, opts('Toggle Hidden')) + vim.keymap.set('n', 'W', api.tree.collapse_all, opts('Collapse')) + vim.keymap.set('n', 'x', api.fs.cut, opts('Cut')) + vim.keymap.set('n', 'y', api.fs.copy.filename, opts('Copy Name')) + vim.keymap.set('n', 'Y', api.fs.copy.relative_path, opts('Copy Relative Path')) + vim.keymap.set('n', '<2-LeftMouse>', api.node.open.edit, opts('Open')) + vim.keymap.set('n', '<2-RightMouse>', api.tree.change_root_to_node, opts('CD')) -- END_DEFAULT_ON_ATTACH ]] @@ -243,7 +247,7 @@ local function generate_on_attach_lua(list, unmapped_keys, remove_defaults) if LEGACY_MAPPINGS[m.action] then lua = lua .. string.format( - [[ vim.keymap.set('%s', '%s', %s, { desc = '%s', buffer = bufnr, noremap = true, silent = true, nowait = true })]], + [[ vim.keymap.set('%s', '%s', %s, opts('%s'))]], m.mode or "n", k, LEGACY_MAPPINGS[m.action].n, @@ -256,7 +260,7 @@ local function generate_on_attach_lua(list, unmapped_keys, remove_defaults) lua = lua .. [[ -- your code goes here]] .. "\n" lua = lua .. string.format( - [[ end, { desc = '%s', buffer = bufnr, noremap = true, silent = true, nowait = true })]], + [[ end, opts('%s'))]], m.action ) .. "\n\n" diff --git a/lua/nvim-tree/keymap.lua b/lua/nvim-tree/keymap.lua index 40933bb23e8..a6fc23f983a 100644 --- a/lua/nvim-tree/keymap.lua +++ b/lua/nvim-tree/keymap.lua @@ -5,58 +5,62 @@ local M = {} -- stylua: ignore start function M.default_on_attach(bufnr) -- BEGIN_DEFAULT_ON_ATTACH - vim.keymap.set('n', '', api.tree.change_root_to_node, { desc = 'CD', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', api.node.open.replace_tree_buffer, { desc = 'Open: In Place', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', api.node.show_info_popup, { desc = 'Info', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', api.fs.rename_sub, { desc = 'Rename: Omit Filename', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', api.node.open.tab, { desc = 'Open: New Tab', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', api.node.open.vertical, { desc = 'Open: Vertical Split', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', api.node.open.horizontal, { desc = 'Open: Horizontal Split', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', api.node.navigate.parent_close, { desc = 'Close Directory', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', api.node.open.edit, { desc = 'Open', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '', api.node.open.preview, { desc = 'Open Preview', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '>', api.node.navigate.sibling.next, { desc = 'Next Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '<', api.node.navigate.sibling.prev, { desc = 'Previous Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '.', api.node.run.cmd, { desc = 'Run Command', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '-', api.tree.change_root_to_parent, { desc = 'Up', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'a', api.fs.create, { desc = 'Create', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'bmv', api.marks.bulk.move, { desc = 'Move Bookmarked', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'B', api.tree.toggle_no_buffer_filter, { desc = 'Toggle No Buffer', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'c', api.fs.copy.node, { desc = 'Copy', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'C', api.tree.toggle_git_clean_filter, { desc = 'Toggle Git Clean', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '[c', api.node.navigate.git.prev, { desc = 'Prev Git', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', ']c', api.node.navigate.git.next, { desc = 'Next Git', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'd', api.fs.remove, { desc = 'Delete', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'D', api.fs.trash, { desc = 'Trash', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'E', api.tree.expand_all, { desc = 'Expand All', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'e', api.fs.rename_basename, { desc = 'Rename: Basename', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', ']e', api.node.navigate.diagnostics.next, { desc = 'Next Diagnostic', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '[e', api.node.navigate.diagnostics.prev, { desc = 'Prev Diagnostic', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'F', api.live_filter.clear, { desc = 'Clean Filter', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'f', api.live_filter.start, { desc = 'Filter', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'g?', api.tree.toggle_help, { desc = 'Help', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'gy', api.fs.copy.absolute_path, { desc = 'Copy Absolute Path', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'H', api.tree.toggle_hidden_filter, { desc = 'Toggle Dotfiles', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'I', api.tree.toggle_gitignore_filter, { desc = 'Toggle Git Ignore', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'J', api.node.navigate.sibling.last, { desc = 'Last Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'K', api.node.navigate.sibling.first, { desc = 'First Sibling', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'm', api.marks.toggle, { desc = 'Toggle Bookmark', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'o', api.node.open.edit, { desc = 'Open', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'O', api.node.open.no_window_picker, { desc = 'Open: No Window Picker', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'p', api.fs.paste, { desc = 'Paste', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'P', api.node.navigate.parent, { desc = 'Parent Directory', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'q', api.tree.close, { desc = 'Close', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'r', api.fs.rename, { desc = 'Rename', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'R', api.tree.reload, { desc = 'Refresh', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 's', api.node.run.system, { desc = 'Run System', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'S', api.tree.search_node, { desc = 'Search', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'U', api.tree.toggle_custom_filter, { desc = 'Toggle Hidden', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'W', api.tree.collapse_all, { desc = 'Collapse', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'x', api.fs.cut, { desc = 'Cut', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'y', api.fs.copy.filename, { desc = 'Copy Name', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', 'Y', api.fs.copy.relative_path, { desc = 'Copy Relative Path', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '<2-LeftMouse>', api.node.open.edit, { desc = 'Open', buffer = bufnr, noremap = true, silent = true, nowait = true }) - vim.keymap.set('n', '<2-RightMouse>', api.tree.change_root_to_node, { desc = 'CD', buffer = bufnr, noremap = true, silent = true, nowait = true }) + local opts = function(desc) + return { desc = 'nvim-tree: ' .. desc, buffer = bufnr, noremap = true, silent = true, nowait = true } + end + + vim.keymap.set('n', '', api.tree.change_root_to_node, opts('CD')) + vim.keymap.set('n', '', api.node.open.replace_tree_buffer, opts('Open: In Place')) + vim.keymap.set('n', '', api.node.show_info_popup, opts('Info')) + vim.keymap.set('n', '', api.fs.rename_sub, opts('Rename: Omit Filename')) + vim.keymap.set('n', '', api.node.open.tab, opts('Open: New Tab')) + vim.keymap.set('n', '', api.node.open.vertical, opts('Open: Vertical Split')) + vim.keymap.set('n', '', api.node.open.horizontal, opts('Open: Horizontal Split')) + vim.keymap.set('n', '', api.node.navigate.parent_close, opts('Close Directory')) + vim.keymap.set('n', '', api.node.open.edit, opts('Open')) + vim.keymap.set('n', '', api.node.open.preview, opts('Open Preview')) + vim.keymap.set('n', '>', api.node.navigate.sibling.next, opts('Next Sibling')) + vim.keymap.set('n', '<', api.node.navigate.sibling.prev, opts('Previous Sibling')) + vim.keymap.set('n', '.', api.node.run.cmd, opts('Run Command')) + vim.keymap.set('n', '-', api.tree.change_root_to_parent, opts('Up')) + vim.keymap.set('n', 'a', api.fs.create, opts('Create')) + vim.keymap.set('n', 'bmv', api.marks.bulk.move, opts('Move Bookmarked')) + vim.keymap.set('n', 'B', api.tree.toggle_no_buffer_filter, opts('Toggle No Buffer')) + vim.keymap.set('n', 'c', api.fs.copy.node, opts('Copy')) + vim.keymap.set('n', 'C', api.tree.toggle_git_clean_filter, opts('Toggle Git Clean')) + vim.keymap.set('n', '[c', api.node.navigate.git.prev, opts('Prev Git')) + vim.keymap.set('n', ']c', api.node.navigate.git.next, opts('Next Git')) + vim.keymap.set('n', 'd', api.fs.remove, opts('Delete')) + vim.keymap.set('n', 'D', api.fs.trash, opts('Trash')) + vim.keymap.set('n', 'E', api.tree.expand_all, opts('Expand All')) + vim.keymap.set('n', 'e', api.fs.rename_basename, opts('Rename: Basename')) + vim.keymap.set('n', ']e', api.node.navigate.diagnostics.next, opts('Next Diagnostic')) + vim.keymap.set('n', '[e', api.node.navigate.diagnostics.prev, opts('Prev Diagnostic')) + vim.keymap.set('n', 'F', api.live_filter.clear, opts('Clean Filter')) + vim.keymap.set('n', 'f', api.live_filter.start, opts('Filter')) + vim.keymap.set('n', 'g?', api.tree.toggle_help, opts('Help')) + vim.keymap.set('n', 'gy', api.fs.copy.absolute_path, opts('Copy Absolute Path')) + vim.keymap.set('n', 'H', api.tree.toggle_hidden_filter, opts('Toggle Dotfiles')) + vim.keymap.set('n', 'I', api.tree.toggle_gitignore_filter, opts('Toggle Git Ignore')) + vim.keymap.set('n', 'J', api.node.navigate.sibling.last, opts('Last Sibling')) + vim.keymap.set('n', 'K', api.node.navigate.sibling.first, opts('First Sibling')) + vim.keymap.set('n', 'm', api.marks.toggle, opts('Toggle Bookmark')) + vim.keymap.set('n', 'o', api.node.open.edit, opts('Open')) + vim.keymap.set('n', 'O', api.node.open.no_window_picker, opts('Open: No Window Picker')) + vim.keymap.set('n', 'p', api.fs.paste, opts('Paste')) + vim.keymap.set('n', 'P', api.node.navigate.parent, opts('Parent Directory')) + vim.keymap.set('n', 'q', api.tree.close, opts('Close')) + vim.keymap.set('n', 'r', api.fs.rename, opts('Rename')) + vim.keymap.set('n', 'R', api.tree.reload, opts('Refresh')) + vim.keymap.set('n', 's', api.node.run.system, opts('Run System')) + vim.keymap.set('n', 'S', api.tree.search_node, opts('Search')) + vim.keymap.set('n', 'U', api.tree.toggle_custom_filter, opts('Toggle Hidden')) + vim.keymap.set('n', 'W', api.tree.collapse_all, opts('Collapse')) + vim.keymap.set('n', 'x', api.fs.cut, opts('Cut')) + vim.keymap.set('n', 'y', api.fs.copy.filename, opts('Copy Name')) + vim.keymap.set('n', 'Y', api.fs.copy.relative_path, opts('Copy Relative Path')) + vim.keymap.set('n', '<2-LeftMouse>', api.node.open.edit, opts('Open')) + vim.keymap.set('n', '<2-RightMouse>', api.tree.change_root_to_node, opts('CD')) -- END_DEFAULT_ON_ATTACH end -- stylua: ignore end diff --git a/lua/nvim-tree/renderer/help.lua b/lua/nvim-tree/renderer/help.lua index ad50e4c8635..8a9f4ded788 100644 --- a/lua/nvim-tree/renderer/help.lua +++ b/lua/nvim-tree/renderer/help.lua @@ -20,6 +20,15 @@ local function tidy_lhs(lhs) return lhs end +--- Remove prefix 'nvim-tree: ' +--- Hardcoded to keep default_on_attach simple +--- @param desc string +--- @return string +--- @return number +local function tidy_desc(desc) + return desc:gsub("^nvim%-tree: ", "") +end + -- sort lhs roughly as per :help index local PAT_MOUSE = "^<.*Mouse" local PAT_CTRL = "^ Date: Mon, 27 Feb 2023 13:48:35 +1100 Subject: [PATCH 40/42] add opts helper function for on_attach, prefixing 'nvim-tree: ' --- lua/nvim-tree/keymap-legacy.lua | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/lua/nvim-tree/keymap-legacy.lua b/lua/nvim-tree/keymap-legacy.lua index 3d7fa4e9912..000ccbd56ab 100644 --- a/lua/nvim-tree/keymap-legacy.lua +++ b/lua/nvim-tree/keymap-legacy.lua @@ -258,12 +258,7 @@ local function generate_on_attach_lua(list, unmapped_keys, remove_defaults) lua = lua .. string.format([[ vim.keymap.set('%s', '%s', function()]], m.mode or "n", k) .. "\n" lua = lua .. [[ local node = api.tree.get_node_under_cursor()]] .. "\n" lua = lua .. [[ -- your code goes here]] .. "\n" - lua = lua - .. string.format( - [[ end, opts('%s'))]], - m.action - ) - .. "\n\n" + lua = lua .. string.format([[ end, opts('%s'))]], m.action) .. "\n\n" end end end From e68f2e816c92b6593211d5de16de574a945c1ec6 Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Mon, 27 Feb 2023 14:08:49 +1100 Subject: [PATCH 41/42] more comments in generated on_attach --- lua/nvim-tree/keymap-legacy.lua | 61 +++++++++++++++++++++++++++------ 1 file changed, 51 insertions(+), 10 deletions(-) diff --git a/lua/nvim-tree/keymap-legacy.lua b/lua/nvim-tree/keymap-legacy.lua index 000ccbd56ab..be6727ed7bd 100644 --- a/lua/nvim-tree/keymap-legacy.lua +++ b/lua/nvim-tree/keymap-legacy.lua @@ -22,9 +22,17 @@ local M = { local BEGIN_ON_ATTACH = [[ -- -- This function has been generated from your --- view.mappings.list --- view.mappings.custom_only --- remove_keymaps +-- view.mappings.list +-- view.mappings.custom_only +-- remove_keymaps +-- +-- You should add this function to your configuration and set on_attach = on_attach in the nvim-tree setup call. +-- +-- Although care was taken to ensure correctness and completeness, your review is required. +-- +-- Please check for the following issues in auto generated content: +-- "Mappings removed" is as you expect +-- "Mappings migrated" are correct -- -- Please see https://github.com/nvim-tree/nvim-tree.lua/wiki/Migrating-To-on_attach for assistance in migrating. -- @@ -32,18 +40,51 @@ local BEGIN_ON_ATTACH = [[ local api = require('nvim-tree.api') local on_attach = function(bufnr) + + local opts = function(desc) + return { desc = 'nvim-tree: ' .. desc, buffer = bufnr, noremap = true, silent = true, nowait = true } + end ]] local END_ON_ATTACH = [[ end ]] +local REMOVAL_COMMENT_ON_ATTACH = [[ + + + -- Mappings removed via: + -- remove_keymaps + -- OR + -- view.mappings.list..action = "" + -- + -- The dummy set before del is done for safety, in case a default mapping does not exist. + -- + -- You might tidy things by removing these along with their default mapping. +]] + +local CUSTOM_COMMENT_ON_ATTACH = [[ + + + -- Mappings migrated from view.mappings.list + -- + -- You will need to insert "your code goes here" for any mappings with a custom action_cb +]] + +local NO_DEFAULTS_COMMENT_ON_ATTACH = [[ + + + -- Default mappings not inserted as: + -- remove_keymaps = true + -- OR + -- view.mappings.custom_only = true +]] + local DEFAULT_ON_ATTACH = [[ - -- BEGIN_DEFAULT_ON_ATTACH - local opts = function(desc) - return { desc = 'nvim-tree: ' .. desc, buffer = bufnr, noremap = true, silent = true, nowait = true } - end + -- Default mappings. Feel free to modify or remove as you wish. + -- + -- BEGIN_DEFAULT_ON_ATTACH vim.keymap.set('n', '', api.tree.change_root_to_node, opts('CD')) vim.keymap.set('n', '', api.node.open.replace_tree_buffer, opts('Open: In Place')) vim.keymap.set('n', '', api.node.show_info_popup, opts('Info')) @@ -224,12 +265,12 @@ local function generate_on_attach_lua(list, unmapped_keys, remove_defaults) if remove_defaults then -- no defaults - lua = lua .. "\n -- no defaults: remove_keymaps = true OR view.mappings.custom_only = true\n" + lua = lua .. NO_DEFAULTS_COMMENT_ON_ATTACH else -- defaults with explicit removals lua = lua .. "\n" .. DEFAULT_ON_ATTACH if #unmapped_keys > 0 then - lua = lua .. '\n -- view.mappings.list..action = "", remove_keymaps\n' + lua = lua .. REMOVAL_COMMENT_ON_ATTACH end for _, key in ipairs(unmapped_keys) do lua = lua .. string.format([[ vim.keymap.set('n', '%s', '', { buffer = bufnr })]], key) .. "\n" @@ -239,7 +280,7 @@ local function generate_on_attach_lua(list, unmapped_keys, remove_defaults) -- list if #list > 0 then - lua = lua .. "\n -- view.mappings.list\n" + lua = lua .. CUSTOM_COMMENT_ON_ATTACH end for _, m in ipairs(list) do local keys = type(m.key) == "table" and m.key or { m.key } From 9791804195845a28c6b5641f00f186eb456024de Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Mon, 27 Feb 2023 14:19:03 +1100 Subject: [PATCH 42/42] update release date --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 67fb96bb141..b0b535c2940 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ Take a look at the [wiki](https://github.com/nvim-tree/nvim-tree.lua/wiki) for S Existing `*_on_setup*` mechanisms have been removed in favour of [Open At Startup](https://github.com/nvim-tree/nvim-tree.lua/wiki/Open-At-Startup) -## New Mapping Method 2023-03-01 +## New Mapping Method 2023-02-27 [:help nvim-tree.view.mappings](doc/nvim-tree-lua.txt) have been deprecated in favour of [:help nvim-tree.on_attach](doc/nvim-tree-lua.txt). Please visit [Migrating To on_attach](https://github.com/nvim-tree/nvim-tree.lua/wiki/Migrating-To-on_attach) to transition.