feat(api): api.tree.open/toggle: add current_window option (#1935)

* feat(api): api.tree.open: add current_window option

* feat(api): api.tree.toggle: add current_window option

* feat(api): api.tree.toggle: add current_window option

* doc: api.tree.*

* doc: api.tree.*
This commit is contained in:
Alexander Courtis
2023-01-24 08:30:49 +11:00
committed by GitHub
parent 16f2806d59
commit f1c2d6d372
4 changed files with 200 additions and 36 deletions

View File

@@ -1238,27 +1238,118 @@ that injects the node from the cursor position in the tree when calling
the function. It will use the node you pass as an argument in priority if it the function. It will use the node you pass as an argument in priority if it
exists. exists.
- api.tree: *nvim-tree.api.tree* api.tree.open({opts}) *nvim-tree.api.tree.open()*
- open `(path?: string)` Open the tree, focusing it if already open.
- close
- toggle `(find_file?: bool, no_focus?: bool, path?: string)` Parameters: ~
- focus • {opts} (table) optional parameters
- reload
- change_root `(path: string)` Options: ~
- change_root_to_node • {path} (string) root directory for the tree
- change_root_to_parent • {current_window} (boolean) open the tree in the current window
- get_node_under_cursor
- get_nodes api.tree.toggle({opts}) *nvim-tree.api.tree.toggle()*
- find_file `(filename: string)` Open or close the tree.
- search_node
- collapse_all `(keep_buffers?: bool)` Parameters: ~
- expand_all • {opts} (table) optional parameters
- toggle_gitignore_filter
- toggle_git_clean_filter Options: ~
- toggle_no_buffer_filter • {path} (string) root directory for the tree
- toggle_custom_filter • {current_window} (boolean) open the tree in the current window
- toggle_hidden_filter • {focus} (boolean) focus the tree when opening
- toggle_help • {find_file} (boolean) find the current buffer
• {update_root} (boolean) see |nvim-tree.update_focused_file.update_root|
api.tree.close() *nvim-tree.api.tree.close()*
Close the tree, affecting all tabs as per |nvim-tree.tab.sync.close|
api.tree.close_in_this_tab() *nvim-tree.api.tree.close_in_this_tab()*
Close the tree in this tab only.
api.tree.close_in_all_tabs() *nvim-tree.api.tree.close_in_all_tabs()*
Close the tree in all tabs.
api.tree.focus() *nvim-tree.api.tree.focus()*
Focus the tree, opening it if necessary.
api.tree.reload() *nvim-tree.api.tree.focus()*
Refresh the tree. Does nothing if closed.
api.tree.change_root({path}) *nvim-tree.api.tree.change_root()*
Change the tree's root to a path.
Parameters: ~
• {path} (string) absolute or relative path
*nvim-tree.api.tree.change_root_to_node()*
api.tree.change_root_to_node({node})
Change the tree's root to a folder node or the parent of a file node.
Parameters: ~
• {node} (Node) folder or file
*nvim-tree.api.tree.change_root_to_parent()*
api.tree.change_root_to_parent({node})
Change the tree's root to the parent of a node.
Parameters: ~
• {node} (Node) folder or file
api.tree.get_node_under_cursor() *nvim-tree.api.tree.get_node_under_cursor()*
Retrieve the currently focused node.
Return: ~
node or nil if tree is not visible
api.tree.get_nodes() *nvim-tree.api.tree.get_nodes()*
Retrieve a hierarchical list of all the nodes. This is a cloned list for
reference purposes only and should not be passed into other API functions.
Return: ~
table of nodes
api.tree.find_file({path}) *nvim-tree.api.tree.find_file()*
Find and focus a file or folder in the tree.
Parameters: ~
• {path} (string) absolute path
api.tree.search_node() *nvim-tree.api.tree.search_node()*
Open the search dialogue as per the search_node action.
api.tree.collapse_all({keep_buffers}) *nvim-tree.api.tree.collapse_all()*
Collapse the tree.
Parameters: ~
• {keep_buffers} (boolean) do not collapse nodes with open buffers.
api.tree.expand_all({keep_buffers}) *nvim-tree.api.tree.expand_all()*
Expand all nodes in the tree.
*nvim-tree.api.tree.toggle_gitignore_filter()*
api.tree.toggle_gitignore_filter()
Toggle |nvim-tree.git.ignore| filter.
*nvim-tree.api.tree.toggle_git_clean_filter()*
api.tree.toggle_git_clean_filter()
Toggle |nvim-tree.filters.git_clean| filter.
*nvim-tree.api.tree.toggle_no_buffer_filter()*
api.tree.toggle_no_buffer_filter()
Toggle |nvim-tree.filters.no_buffer| filter.
*nvim-tree.api.tree.toggle_custom_filter()*
api.tree.toggle_custom_filter()
Toggle |nvim-tree.filters.custom| filter.
*nvim-tree.api.tree.toggle_hidden_filter()*
api.tree.toggle_hidden_filter()
Toggle |nvim-tree.filters.dotfiles| filter.
api.tree.toggle_help() *nvim-tree.api.tree.toggle_help()*
Toggle help view.
- api.fs: *nvim-tree.api.fs* - api.fs: *nvim-tree.api.fs*
- create - create

View File

@@ -70,13 +70,28 @@ end
---@deprecated ---@deprecated
M.on_keypress = require("nvim-tree.actions.dispatch").dispatch M.on_keypress = require("nvim-tree.actions.dispatch").dispatch
function M.open(cwd) ---Open the tree, focusing if already open.
cwd = cwd ~= "" and cwd or nil ---@param opts ApiTreeOpenOpts|nil|string
function M.open(opts)
-- legacy arguments
if type(opts) ~= "table" then
opts = {
path = opts,
}
end
opts = opts or {}
-- sanitise path
if type(opts.path) ~= "string" or vim.fn.isdirectory(opts.path) == 0 then
opts.path = nil
end
if view.is_visible() then if view.is_visible() then
lib.set_target_win() lib.set_target_win()
view.focus() view.focus()
else else
lib.open(cwd) lib.open(opts)
end end
end end
@@ -164,16 +179,35 @@ function M.find_file(with_open, bufnr, bang)
find_file(with_open, bufnr, bang) find_file(with_open, bufnr, bang)
end end
function M.toggle(with_find_file, no_focus, cwd, bang) ---Toggle the tree.
---@param opts ApiTreeToggleOpts|nil|boolean
function M.toggle(opts, no_focus, cwd, bang)
-- legacy arguments
if type(opts) ~= "table" then
opts = {
path = cwd,
focus = not no_focus,
find_file = opts,
update_root = bang,
}
end
opts = opts or {}
-- sanitise path
if type(opts.path) ~= "string" or vim.fn.isdirectory(opts.path) == 0 then
opts.path = nil
end
if view.is_visible() then if view.is_visible() then
view.close() view.close()
else else
local previous_buf = vim.api.nvim_get_current_buf() local previous_buf = vim.api.nvim_get_current_buf()
M.open(cwd) M.open { path = opts.path, current_window = opts.current_window }
if _config.update_focused_file.enable or with_find_file then if _config.update_focused_file.enable or opts.find_file then
find_file(false, previous_buf, bang) find_file(false, previous_buf, opts.update_root)
end end
if no_focus then if not opts.focus then
vim.cmd "noautocmd wincmd p" vim.cmd "noautocmd wincmd p"
end end
end end
@@ -275,7 +309,7 @@ function M.on_enter(netrw_disabled)
end end
if should_open or should_hijack or existing_tree_wins[1] ~= nil then if should_open or should_hijack or existing_tree_wins[1] ~= nil then
lib.open(cwd) lib.open { path = cwd }
if should_focus_other_window then if should_focus_other_window then
vim.cmd "noautocmd wincmd p" vim.cmd "noautocmd wincmd p"
@@ -304,11 +338,11 @@ end
local function setup_vim_commands() local function setup_vim_commands()
vim.api.nvim_create_user_command("NvimTreeOpen", function(res) vim.api.nvim_create_user_command("NvimTreeOpen", function(res)
M.open(res.args) M.open { path = res.args }
end, { nargs = "?", complete = "dir" }) end, { nargs = "?", complete = "dir" })
vim.api.nvim_create_user_command("NvimTreeClose", view.close, { bar = true }) vim.api.nvim_create_user_command("NvimTreeClose", view.close, { bar = true })
vim.api.nvim_create_user_command("NvimTreeToggle", function(res) vim.api.nvim_create_user_command("NvimTreeToggle", function(res)
M.toggle(false, false, res.args) M.toggle { find_file = false, focus = true, path = res.args, update_root = false }
end, { nargs = "?", complete = "dir" }) end, { nargs = "?", complete = "dir" })
vim.api.nvim_create_user_command("NvimTreeFocus", M.focus, { bar = true }) vim.api.nvim_create_user_command("NvimTreeFocus", M.focus, { bar = true })
vim.api.nvim_create_user_command("NvimTreeRefresh", reloaders.reload_explorer, { bar = true }) vim.api.nvim_create_user_command("NvimTreeRefresh", reloaders.reload_explorer, { bar = true })
@@ -317,7 +351,7 @@ local function setup_vim_commands()
find_file(true, nil, res.bang) find_file(true, nil, res.bang)
end, { bang = true, bar = true }) end, { bang = true, bar = true })
vim.api.nvim_create_user_command("NvimTreeFindFileToggle", function(res) vim.api.nvim_create_user_command("NvimTreeFindFileToggle", function(res)
M.toggle(true, false, res.args, res.bang) M.toggle { find_file = true, focus = false, path = res.args, update_root = res.bang }
end, { bang = true, nargs = "?", complete = "dir" }) end, { bang = true, nargs = "?", complete = "dir" })
vim.api.nvim_create_user_command("NvimTreeResize", function(res) vim.api.nvim_create_user_command("NvimTreeResize", function(res)
M.resize(res.args) M.resize(res.args)

View File

@@ -16,14 +16,33 @@ local function inject_node(f)
end end
end end
---@class ApiTreeOpenOpts
---@field path string|nil path
---@field current_window boolean|nil
Api.tree.open = require("nvim-tree").open Api.tree.open = require("nvim-tree").open
---@class ApiTreeToggleOpts
---@field path string|nil
---@field current_window boolean|nil
---@field focus boolean|nil
---@field find_file boolean|nil
---@field update_root boolean|nil
Api.tree.toggle = require("nvim-tree").toggle Api.tree.toggle = require("nvim-tree").toggle
Api.tree.close = require("nvim-tree.view").close Api.tree.close = require("nvim-tree.view").close
Api.tree.close_in_this_tab = require("nvim-tree.view").close_this_tab_only Api.tree.close_in_this_tab = require("nvim-tree.view").close_this_tab_only
Api.tree.close_in_all_tabs = require("nvim-tree.view").close_all_tabs Api.tree.close_in_all_tabs = require("nvim-tree.view").close_all_tabs
Api.tree.focus = require("nvim-tree").focus Api.tree.focus = require("nvim-tree").focus
Api.tree.reload = require("nvim-tree.actions.reloaders.reloaders").reload_explorer Api.tree.reload = require("nvim-tree.actions.reloaders.reloaders").reload_explorer
Api.tree.change_root = require("nvim-tree").change_dir Api.tree.change_root = require("nvim-tree").change_dir
Api.tree.change_root_to_node = inject_node(function(node) Api.tree.change_root_to_node = inject_node(function(node)
if node.name == ".." then if node.name == ".." then
require("nvim-tree.actions.root.change-dir").fn ".." require("nvim-tree.actions.root.change-dir").fn ".."
@@ -31,18 +50,31 @@ Api.tree.change_root_to_node = inject_node(function(node)
require("nvim-tree.actions.root.change-dir").fn(require("nvim-tree.lib").get_last_group_node(node).absolute_path) require("nvim-tree.actions.root.change-dir").fn(require("nvim-tree.lib").get_last_group_node(node).absolute_path)
end end
end) end)
Api.tree.change_root_to_parent = inject_node(require("nvim-tree.actions.root.dir-up").fn) Api.tree.change_root_to_parent = inject_node(require("nvim-tree.actions.root.dir-up").fn)
Api.tree.get_node_under_cursor = require("nvim-tree.lib").get_node_at_cursor Api.tree.get_node_under_cursor = require("nvim-tree.lib").get_node_at_cursor
Api.tree.get_nodes = require("nvim-tree.lib").get_nodes Api.tree.get_nodes = require("nvim-tree.lib").get_nodes
Api.tree.find_file = require("nvim-tree.actions.finders.find-file").fn Api.tree.find_file = require("nvim-tree.actions.finders.find-file").fn
Api.tree.search_node = require("nvim-tree.actions.finders.search-node").fn 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.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.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_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_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_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_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_hidden_filter = require("nvim-tree.actions.tree-modifiers.toggles").dotfiles
Api.tree.toggle_help = require("nvim-tree.actions.tree-modifiers.toggles").help Api.tree.toggle_help = require("nvim-tree.actions.tree-modifiers.toggles").help
Api.fs.create = inject_node(require("nvim-tree.actions.fs.create-file").fn) Api.fs.create = inject_node(require("nvim-tree.actions.fs.create-file").fn)

View File

@@ -150,15 +150,22 @@ function M.prompt(prompt_input, prompt_select, items_short, items_long, callback
end end
end end
function M.open(cwd) ---Open the tree, initialising as needed. Maybe hijack the current buffer.
---@param opts ApiTreeOpenOpts|string|nil legacy case opts is path string
function M.open(opts)
opts = opts or {}
M.set_target_win() M.set_target_win()
if not core.get_explorer() or cwd then if not core.get_explorer() or opts.path then
core.init(cwd or vim.loop.cwd()) core.init(opts.path or vim.loop.cwd())
end end
if should_hijack_current_buf() then if should_hijack_current_buf() then
view.close_this_tab_only() view.close_this_tab_only()
view.open_in_current_win() view.open_in_current_win()
renderer.draw() renderer.draw()
elseif opts.current_window then
view.open_in_current_win { hijack_current_buf = false, resize = false }
renderer.draw()
else else
open_view_and_draw() open_view_and_draw()
end end