diff --git a/doc/nvim-tree-lua.txt b/doc/nvim-tree-lua.txt index 223ca8b5be6..81dc2385ba4 100644 --- a/doc/nvim-tree-lua.txt +++ b/doc/nvim-tree-lua.txt @@ -2765,6 +2765,13 @@ navigate.sibling.prev({node}) Parameters: ~ • {node} (`nvim_tree.api.Node?`) directory or file +open.drop({node}) *nvim_tree.api.node.open.drop()* + Switch to window with selected file if it exists, otherwise open, see + |:drop| + + Parameters: ~ + • {node} (`nvim_tree.api.Node?`) directory or file + open.edit({node}, {opts}) *nvim_tree.api.node.open.edit()* • file: open as per |nvim_tree.config.actions.open_file| • directory: expand or collapse @@ -2778,39 +2785,64 @@ open.edit({node}, {opts}) *nvim_tree.api.node.open.edit()* • {focus}? (`boolean`, default: false) Keep focus in the tree when opening the file. -open.horizontal({node}) *nvim_tree.api.node.open.horizontal()* +open.horizontal({node}, {opts}) *nvim_tree.api.node.open.horizontal()* Open file in a new horizontal split. Parameters: ~ • {node} (`nvim_tree.api.Node?`) file + • {opts} (`table?`) optional + • {quit_on_open}? (`boolean`, default: false) Quits the tree + when opening the file. + • {focus}? (`boolean`, default: false) Keep focus in the tree + when opening the file. *nvim_tree.api.node.open.horizontal_no_picker()* -open.horizontal_no_picker({node}) +open.horizontal_no_picker({node}, {opts}) Open file in a new horizontal split without using the window picker. Parameters: ~ • {node} (`nvim_tree.api.Node?`) file + • {opts} (`table?`) optional + • {quit_on_open}? (`boolean`, default: false) Quits the tree + when opening the file. + • {focus}? (`boolean`, default: false) Keep focus in the tree + when opening the file. *nvim_tree.api.node.open.no_window_picker()* -open.no_window_picker({node}) +open.no_window_picker({node}, {opts}) Open file without using the window picker. Parameters: ~ • {node} (`nvim_tree.api.Node?`) file + • {opts} (`table?`) optional + • {quit_on_open}? (`boolean`, default: false) Quits the tree + when opening the file. + • {focus}? (`boolean`, default: false) Keep focus in the tree + when opening the file. -open.preview({node}) *nvim_tree.api.node.open.preview()* +open.preview({node}, {opts}) *nvim_tree.api.node.open.preview()* Open file with |'bufhidden'| set to `delete`. Parameters: ~ • {node} (`nvim_tree.api.Node?`) directory or file + • {opts} (`table?`) optional + • {quit_on_open}? (`boolean`, default: false) Quits the tree + when opening the file. + • {focus}? (`boolean`, default: false) Keep focus in the tree + when opening the file. *nvim_tree.api.node.open.preview_no_picker()* -open.preview_no_picker({node}) +open.preview_no_picker({node}, {opts}) Open file with |'bufhidden'| set to `delete` without using the window picker. Parameters: ~ • {node} (`nvim_tree.api.Node?`) directory or file + • {opts} (`table?`) optional + • {quit_on_open}? (`boolean`, default: false) Quits the tree + when opening the file. + • {focus}? (`boolean`, default: false) Keep focus in the tree + when opening the file. *nvim_tree.api.node.open.replace_tree_buffer()* open.replace_tree_buffer({node}) @@ -2819,15 +2851,20 @@ open.replace_tree_buffer({node}) Parameters: ~ • {node} (`nvim_tree.api.Node?`) file -open.tab({node}) *nvim_tree.api.node.open.tab()* +open.tab({node}, {opts}) *nvim_tree.api.node.open.tab()* Open file in a new tab. Parameters: ~ • {node} (`nvim_tree.api.Node?`) directory or file + • {opts} (`table?`) optional + • {quit_on_open}? (`boolean`, default: false) Quits the tree + when opening the file. + • {focus}? (`boolean`, default: false) Keep focus in the tree + when opening the file. open.tab_drop({node}) *nvim_tree.api.node.open.tab_drop()* - Switch to tab containing window with selected file if it exists. Open file - in new tab otherwise. + Switch to tab containing window with selected file if it exists, otherwise + open in new tab, see |:drop| Parameters: ~ • {node} (`nvim_tree.api.Node?`) directory or file @@ -2840,18 +2877,28 @@ open.toggle_group_empty({node}) Parameters: ~ • {node} (`nvim_tree.api.Node?`) directory -open.vertical({node}) *nvim_tree.api.node.open.vertical()* +open.vertical({node}, {opts}) *nvim_tree.api.node.open.vertical()* Open file in a new vertical split. Parameters: ~ • {node} (`nvim_tree.api.Node?`) file + • {opts} (`table?`) optional + • {quit_on_open}? (`boolean`, default: false) Quits the tree + when opening the file. + • {focus}? (`boolean`, default: false) Keep focus in the tree + when opening the file. *nvim_tree.api.node.open.vertical_no_picker()* -open.vertical_no_picker({node}) +open.vertical_no_picker({node}, {opts}) Open file in a new vertical split without using the window picker. Parameters: ~ • {node} (`nvim_tree.api.Node?`) file + • {opts} (`table?`) optional + • {quit_on_open}? (`boolean`, default: false) Quits the tree + when opening the file. + • {focus}? (`boolean`, default: false) Keep focus in the tree + when opening the file. run.cmd({node}) *nvim_tree.api.node.run.cmd()* Enter |cmdline| with the full path of the node and the cursor at the start diff --git a/lua/nvim-tree/_meta/api/node.lua b/lua/nvim-tree/_meta/api/node.lua index 79788a7e645..7292ac4eeae 100644 --- a/lua/nvim-tree/_meta/api/node.lua +++ b/lua/nvim-tree/_meta/api/node.lua @@ -16,6 +16,12 @@ nvim_tree.api.node.open = {} ---@field focus? boolean +--- +---Switch to window with selected file if it exists, otherwise open, see [:drop] +--- +---@param node? nvim_tree.api.Node directory or file +function nvim_tree.api.node.open.drop(node) end + --- ---- file: open as per [nvim_tree.config.actions.open_file] ---- directory: expand or collapse @@ -29,31 +35,36 @@ function nvim_tree.api.node.open.edit(node, opts) end ---Open file in a new horizontal split. --- ---@param node? nvim_tree.api.Node file -function nvim_tree.api.node.open.horizontal(node) end +---@param opts? nvim_tree.api.node.open.Opts optional +function nvim_tree.api.node.open.horizontal(node, opts) end --- ---Open file in a new horizontal split without using the window picker. --- ---@param node? nvim_tree.api.Node file -function nvim_tree.api.node.open.horizontal_no_picker(node) end +---@param opts? nvim_tree.api.node.open.Opts optional +function nvim_tree.api.node.open.horizontal_no_picker(node, opts) end --- ---Open file without using the window picker. --- ---@param node? nvim_tree.api.Node file -function nvim_tree.api.node.open.no_window_picker(node) end +---@param opts? nvim_tree.api.node.open.Opts optional +function nvim_tree.api.node.open.no_window_picker(node, opts) end --- ---Open file with ['bufhidden'] set to `delete`. --- ---@param node? nvim_tree.api.Node directory or file -function nvim_tree.api.node.open.preview(node) end +---@param opts? nvim_tree.api.node.open.Opts optional +function nvim_tree.api.node.open.preview(node, opts) end --- ---Open file with ['bufhidden'] set to `delete` without using the window picker. --- ---@param node? nvim_tree.api.Node directory or file -function nvim_tree.api.node.open.preview_no_picker(node) end +---@param opts? nvim_tree.api.node.open.Opts optional +function nvim_tree.api.node.open.preview_no_picker(node, opts) end --- ---Open file in place: in the nvim-tree window. @@ -65,10 +76,11 @@ function nvim_tree.api.node.open.replace_tree_buffer(node) end ---Open file in a new tab. --- ---@param node? nvim_tree.api.Node directory or file -function nvim_tree.api.node.open.tab(node) end +---@param opts? nvim_tree.api.node.open.Opts optional +function nvim_tree.api.node.open.tab(node, opts) end --- ----Switch to tab containing window with selected file if it exists. Open file in new tab otherwise. +---Switch to tab containing window with selected file if it exists, otherwise open in new tab, see [:drop] --- ---@param node? nvim_tree.api.Node directory or file function nvim_tree.api.node.open.tab_drop(node) end @@ -83,13 +95,15 @@ function nvim_tree.api.node.open.toggle_group_empty(node) end ---Open file in a new vertical split. --- ---@param node? nvim_tree.api.Node file -function nvim_tree.api.node.open.vertical(node) end +---@param opts? nvim_tree.api.node.open.Opts optional +function nvim_tree.api.node.open.vertical(node, opts) end --- ---Open file in a new vertical split without using the window picker. --- ---@param node? nvim_tree.api.Node file -function nvim_tree.api.node.open.vertical_no_picker(node) end +---@param opts? nvim_tree.api.node.open.Opts optional +function nvim_tree.api.node.open.vertical_no_picker(node, opts) end --- ---@class nvim_tree.api.node.buffer.RemoveOpts diff --git a/lua/nvim-tree/actions/node/open-file.lua b/lua/nvim-tree/actions/node/open-file.lua index 35e83e05db6..afa3af96a69 100644 --- a/lua/nvim-tree/actions/node/open-file.lua +++ b/lua/nvim-tree/actions/node/open-file.lua @@ -10,10 +10,6 @@ local DirectoryNode = require("nvim-tree.node.directory") local FileLinkNode = require("nvim-tree.node.file-link") local RootNode = require("nvim-tree.node.root") ----@class NodeEditOpts ----@field quit_on_open boolean|nil default false ----@field focus boolean|nil default true - ---@alias NodeOpenFileMode ""|"change_dir"|"drop"|"edit"|"edit_in_place"|"edit_no_picker"|"preview"|"preview_no_picker"|"split"|"split_no_picker"|"tab_drop"|"tabnew"|"toggle_group_empty"|"vsplit"|"vsplit_no_picker" local M = {} @@ -416,7 +412,7 @@ end ---@param mode string ---@param node Node ----@param edit_opts NodeEditOpts? +---@param edit_opts nvim_tree.api.node.open.Opts? local function edit(mode, node, edit_opts) local file_link = node:as(FileLinkNode) local path = file_link and file_link.link_to or node.absolute_path @@ -432,7 +428,7 @@ local function edit(mode, node, edit_opts) end local mode_unsupported_focus = mode == "drop" or mode == "tab_drop" or mode == "edit_in_place" - local focus = edit_opts.focus == nil or edit_opts.focus == true + local focus = edit_opts.focus == nil or edit_opts.focus == false if not mode_unsupported_focus and not focus then -- if mode == "tabnew" a new tab will be opened and we need to focus back to the previous tab if mode == "tabnew" then @@ -445,7 +441,7 @@ end ---@param node Node ---@param mode NodeOpenFileMode ---@param toggle_group boolean? ----@param edit_opts NodeEditOpts? +---@param edit_opts nvim_tree.api.node.open.Opts? local function open_or_expand_or_dir_up(node, mode, toggle_group, edit_opts) local root = node:as(RootNode) local dir = node:as(DirectoryNode) @@ -468,18 +464,21 @@ function M.toggle_group_empty(node) end ---@param node Node -function M.preview(node) - open_or_expand_or_dir_up(node, "preview") +---@param opts nvim_tree.api.node.open.Opts? +function M.preview(node, opts) + open_or_expand_or_dir_up(node, "preview", false, opts) end ---@param node Node -function M.preview_no_picker(node) - open_or_expand_or_dir_up(node, "preview_no_picker") +---@param opts nvim_tree.api.node.open.Opts? +function M.preview_no_picker(node, opts) + open_or_expand_or_dir_up(node, "preview_no_picker", false, opts) end ---@param node Node -function M.edit(node) - open_or_expand_or_dir_up(node, "edit") +---@param opts nvim_tree.api.node.open.Opts? +function M.edit(node, opts) + open_or_expand_or_dir_up(node, "edit", false, opts) end ---@param node Node @@ -498,33 +497,39 @@ function M.replace_tree_buffer(node) end ---@param node Node -function M.no_window_picker(node) - open_or_expand_or_dir_up(node, "edit_no_picker") +---@param opts nvim_tree.api.node.open.Opts? +function M.no_window_picker(node, opts) + open_or_expand_or_dir_up(node, "edit_no_picker", false, opts) end ---@param node Node -function M.vertical(node) - open_or_expand_or_dir_up(node, "vsplit") +---@param opts nvim_tree.api.node.open.Opts? +function M.vertical(node, opts) + open_or_expand_or_dir_up(node, "vsplit", false, opts) end ---@param node Node -function M.vertical_no_picker(node) - open_or_expand_or_dir_up(node, "vsplit_no_picker") +---@param opts nvim_tree.api.node.open.Opts? +function M.vertical_no_picker(node, opts) + open_or_expand_or_dir_up(node, "vsplit_no_picker", false, opts) end ---@param node Node -function M.horizontal(node) - open_or_expand_or_dir_up(node, "split") +---@param opts nvim_tree.api.node.open.Opts? +function M.horizontal(node, opts) + open_or_expand_or_dir_up(node, "split", false, opts) end ---@param node Node -function M.horizontal_no_picker(node) - open_or_expand_or_dir_up(node, "split_no_picker") +---@param opts nvim_tree.api.node.open.Opts? +function M.horizontal_no_picker(node, opts) + open_or_expand_or_dir_up(node, "split_no_picker", false, opts) end ---@param node Node -function M.tab(node) - open_or_expand_or_dir_up(node, "tabnew") +---@param opts nvim_tree.api.node.open.Opts? +function M.tab(node, opts) + open_or_expand_or_dir_up(node, "tabnew", false, opts) end return M diff --git a/lua/nvim-tree/api/impl.lua b/lua/nvim-tree/api/impl.lua index 79e8c5c0e9f..f17fa4ee825 100644 --- a/lua/nvim-tree/api/impl.lua +++ b/lua/nvim-tree/api/impl.lua @@ -136,6 +136,11 @@ end ---Called explicitly after nvim-tree setup ---@param api table not properly typed to prevent LSP from referencing implementations function M.hydrate_post_setup(api) + -- Parameter naming conventions: + -- `e` explorer + -- `n` node + -- `o` opts + api.config.global = __(function() return require("nvim-tree.config").g_clone() end) api.config.user = __(function() return require("nvim-tree.config").u_clone() end) @@ -182,10 +187,10 @@ function M.hydrate_post_setup(api) api.marks.navigate.select = e_(function(e) e.marks:navigate_select() end) api.marks.toggle = ev(function(e, n) e.marks:toggle(n) end) - api.node.buffer.delete = _n(function(n, opts) require("nvim-tree.actions.node.buffer").delete(n, opts) end) - api.node.buffer.wipe = _n(function(n, opts) require("nvim-tree.actions.node.buffer").wipe(n, opts) end) - api.node.collapse = _n(function(n, opts) require("nvim-tree.actions.tree.collapse").node(n, opts) end) - api.node.expand = en(function(e, n, opts) e:expand_node(n, opts) end) + api.node.buffer.delete = _n(function(n, o) require("nvim-tree.actions.node.buffer").delete(n, o) end) + api.node.buffer.wipe = _n(function(n, o) require("nvim-tree.actions.node.buffer").wipe(n, o) end) + api.node.collapse = _n(function(n, o) require("nvim-tree.actions.tree.collapse").node(n, o) end) + api.node.expand = en(function(e, n, o) e:expand_node(n, o) end) api.node.navigate.diagnostics.next = __(function() require("nvim-tree.actions.moves.item").diagnostics_next() end) api.node.navigate.diagnostics.next_recursive = __(function() require("nvim-tree.actions.moves.item").diagnostics_next_recursive() end) api.node.navigate.diagnostics.prev = __(function() require("nvim-tree.actions.moves.item").diagnostics_prev() end) @@ -205,18 +210,21 @@ function M.hydrate_post_setup(api) api.node.navigate.sibling.next = _n(function(n) require("nvim-tree.actions.moves.sibling").next(n) end) api.node.navigate.sibling.prev = _n(function(n) require("nvim-tree.actions.moves.sibling").prev(n) end) api.node.open.drop = _n(function(n) require("nvim-tree.actions.node.open-file").drop(n) end) - api.node.open.edit = _n(function(n) require("nvim-tree.actions.node.open-file").edit(n) end) - api.node.open.horizontal = _n(function(n) require("nvim-tree.actions.node.open-file").horizontal(n) end) - api.node.open.horizontal_no_picker = _n(function(n) require("nvim-tree.actions.node.open-file").horizontal_no_picker(n) end) - api.node.open.no_window_picker = _n(function(n) require("nvim-tree.actions.node.open-file").no_window_picker(n) end) - api.node.open.preview = _n(function(n) require("nvim-tree.actions.node.open-file").preview(n) end) - api.node.open.preview_no_picker = _n(function(n) require("nvim-tree.actions.node.open-file").preview_no_picker(n) end) + api.node.open.edit = _n(function(n, o) require("nvim-tree.actions.node.open-file").edit(n, o) end) + api.node.open.horizontal = _n(function(n, o) require("nvim-tree.actions.node.open-file").horizontal(n, o) end) + api.node.open.horizontal_no_picker = _n(function(n, o) + require("nvim-tree.actions.node.open-file").horizontal_no_picker(n, + o) + end) + api.node.open.no_window_picker = _n(function(n, o) require("nvim-tree.actions.node.open-file").no_window_picker(n, o) end) + api.node.open.preview = _n(function(n, o) require("nvim-tree.actions.node.open-file").preview(n, o) end) + api.node.open.preview_no_picker = _n(function(n, o) require("nvim-tree.actions.node.open-file").preview_no_picker(n, o) end) api.node.open.replace_tree_buffer = _n(function(n) require("nvim-tree.actions.node.open-file").replace_tree_buffer(n) end) - api.node.open.tab = _n(function(n) require("nvim-tree.actions.node.open-file").tab(n) end) + api.node.open.tab = _n(function(n, o) require("nvim-tree.actions.node.open-file").tab(n, o) end) api.node.open.tab_drop = _n(function(n) require("nvim-tree.actions.node.open-file").tab_drop(n) end) api.node.open.toggle_group_empty = _n(function(n) require("nvim-tree.actions.node.open-file").toggle_group_empty(n) end) - api.node.open.vertical = _n(function(n) require("nvim-tree.actions.node.open-file").vertical(n) end) - api.node.open.vertical_no_picker = _n(function(n) require("nvim-tree.actions.node.open-file").vertical_no_picker(n) end) + api.node.open.vertical = _n(function(n, o) require("nvim-tree.actions.node.open-file").vertical(n, o) end) + api.node.open.vertical_no_picker = _n(function(n, o) require("nvim-tree.actions.node.open-file").vertical_no_picker(n, o) end) api.node.run.cmd = _n(function(n) require("nvim-tree.actions.node.run-command").run_file_command(n) end) api.node.run.system = _n(function(n) require("nvim-tree.actions.node.system-open").fn(n) end) api.node.show_info_popup = _n(function(n) require("nvim-tree.actions.node.file-popup").toggle_file_info(n) end) @@ -227,22 +235,22 @@ function M.hydrate_post_setup(api) api.tree.close = __(function() require("nvim-tree.view").close() end) api.tree.close_in_all_tabs = __(function() require("nvim-tree.view").close_all_tabs() end) api.tree.close_in_this_tab = __(function() require("nvim-tree.view").close_this_tab_only() end) - api.tree.collapse_all = __(function(opts) require("nvim-tree.actions.tree.collapse").all(opts) end) - api.tree.expand_all = en(function(e, n, opts) e:expand_all(n, opts) end) - api.tree.find_file = __(function(opts) require("nvim-tree.actions.tree.find-file").fn(opts) end) - api.tree.focus = __(function(opts) require("nvim-tree.actions.tree.open").fn(opts) end) + api.tree.collapse_all = __(function(o) require("nvim-tree.actions.tree.collapse").all(o) end) + api.tree.expand_all = en(function(e, n, o) e:expand_all(n, o) end) + api.tree.find_file = __(function(o) require("nvim-tree.actions.tree.find-file").fn(o) end) + api.tree.focus = __(function(o) require("nvim-tree.actions.tree.open").fn(o) end) api.tree.get_node_under_cursor = en(function(e) return e:get_node_at_cursor() end) api.tree.get_nodes = en(function(e) return e:get_nodes() end) api.tree.is_tree_buf = __(function(bufnr) return require("nvim-tree.utils").is_nvim_tree_buf(bufnr) end) - api.tree.is_visible = __(function(opts) return require("nvim-tree.view").is_visible(opts) end) - api.tree.open = __(function(opts) require("nvim-tree.actions.tree.open").fn(opts) end) + api.tree.is_visible = __(function(o) return require("nvim-tree.view").is_visible(o) end) + api.tree.open = __(function(o) require("nvim-tree.actions.tree.open").fn(o) end) api.tree.reload = e_(function(e) e:reload_explorer() end) api.tree.reload_git = e_(function(e) e:reload_git() end) - api.tree.resize = __(function(opts) require("nvim-tree.actions.tree.resize").fn(opts) end) + api.tree.resize = __(function(o) require("nvim-tree.actions.tree.resize").fn(o) end) api.tree.search_node = __(function() require("nvim-tree.actions.finders.search-node").fn() end) - api.tree.toggle = __(function(opts) require("nvim-tree.actions.tree.toggle").fn(opts) end) + api.tree.toggle = __(function(o) require("nvim-tree.actions.tree.toggle").fn(o) end) api.tree.toggle_help = __(function() require("nvim-tree.help").toggle() end) - api.tree.winid = __(function(opts) return require("nvim-tree.view").winid(opts) end) + api.tree.winid = __(function(o) return require("nvim-tree.view").winid(o) end) -- Map all legacy functions to implementations require("nvim-tree.legacy").map_api(api)