Skip to content

Commit f1c2d6d

Browse files
authored
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.*
1 parent 16f2806 commit f1c2d6d

File tree

4 files changed

+200
-36
lines changed

4 files changed

+200
-36
lines changed

doc/nvim-tree-lua.txt

Lines changed: 112 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1238,27 +1238,118 @@ that injects the node from the cursor position in the tree when calling
12381238
the function. It will use the node you pass as an argument in priority if it
12391239
exists.
12401240

1241-
- api.tree: *nvim-tree.api.tree*
1242-
- open `(path?: string)`
1243-
- close
1244-
- toggle `(find_file?: bool, no_focus?: bool, path?: string)`
1245-
- focus
1246-
- reload
1247-
- change_root `(path: string)`
1248-
- change_root_to_node
1249-
- change_root_to_parent
1250-
- get_node_under_cursor
1251-
- get_nodes
1252-
- find_file `(filename: string)`
1253-
- search_node
1254-
- collapse_all `(keep_buffers?: bool)`
1255-
- expand_all
1256-
- toggle_gitignore_filter
1257-
- toggle_git_clean_filter
1258-
- toggle_no_buffer_filter
1259-
- toggle_custom_filter
1260-
- toggle_hidden_filter
1261-
- toggle_help
1241+
api.tree.open({opts}) *nvim-tree.api.tree.open()*
1242+
Open the tree, focusing it if already open.
1243+
1244+
Parameters: ~
1245+
{opts} (table) optional parameters
1246+
1247+
Options: ~
1248+
{path} (string) root directory for the tree
1249+
• {current_window} (boolean) open the tree in the current window
1250+
1251+
api.tree.toggle({opts}) *nvim-tree.api.tree.toggle()*
1252+
Open or close the tree.
1253+
1254+
Parameters: ~
1255+
{opts} (table) optional parameters
1256+
1257+
Options: ~
1258+
{path} (string) root directory for the tree
1259+
• {current_window} (boolean) open the tree in the current window
1260+
{focus} (boolean) focus the tree when opening
1261+
• {find_file} (boolean) find the current buffer
1262+
• {update_root} (boolean) see |nvim-tree.update_focused_file.update_root|
1263+
1264+
api.tree.close() *nvim-tree.api.tree.close()*
1265+
Close the tree, affecting all tabs as per |nvim-tree.tab.sync.close|
1266+
1267+
api.tree.close_in_this_tab() *nvim-tree.api.tree.close_in_this_tab()*
1268+
Close the tree in this tab only.
1269+
1270+
api.tree.close_in_all_tabs() *nvim-tree.api.tree.close_in_all_tabs()*
1271+
Close the tree in all tabs.
1272+
1273+
api.tree.focus() *nvim-tree.api.tree.focus()*
1274+
Focus the tree, opening it if necessary.
1275+
1276+
api.tree.reload() *nvim-tree.api.tree.focus()*
1277+
Refresh the tree. Does nothing if closed.
1278+
1279+
api.tree.change_root({path}) *nvim-tree.api.tree.change_root()*
1280+
Change the tree's root to a path.
1281+
1282+
Parameters: ~
1283+
{path} (string) absolute or relative path
1284+
1285+
*nvim-tree.api.tree.change_root_to_node()*
1286+
api.tree.change_root_to_node({node})
1287+
Change the tree's root to a folder node or the parent of a file node.
1288+
1289+
Parameters: ~
1290+
{node} (Node) folder or file
1291+
1292+
*nvim-tree.api.tree.change_root_to_parent()*
1293+
api.tree.change_root_to_parent({node})
1294+
Change the tree's root to the parent of a node.
1295+
1296+
Parameters: ~
1297+
{node} (Node) folder or file
1298+
1299+
1300+
api.tree.get_node_under_cursor() *nvim-tree.api.tree.get_node_under_cursor()*
1301+
Retrieve the currently focused node.
1302+
1303+
Return: ~
1304+
node or nil if tree is not visible
1305+
1306+
api.tree.get_nodes() *nvim-tree.api.tree.get_nodes()*
1307+
Retrieve a hierarchical list of all the nodes. This is a cloned list for
1308+
reference purposes only and should not be passed into other API functions.
1309+
1310+
Return: ~
1311+
table of nodes
1312+
1313+
api.tree.find_file({path}) *nvim-tree.api.tree.find_file()*
1314+
Find and focus a file or folder in the tree.
1315+
1316+
Parameters: ~
1317+
{path} (string) absolute path
1318+
1319+
api.tree.search_node() *nvim-tree.api.tree.search_node()*
1320+
Open the search dialogue as per the search_node action.
1321+
1322+
api.tree.collapse_all({keep_buffers}) *nvim-tree.api.tree.collapse_all()*
1323+
Collapse the tree.
1324+
1325+
Parameters: ~
1326+
• {keep_buffers} (boolean) do not collapse nodes with open buffers.
1327+
1328+
api.tree.expand_all({keep_buffers}) *nvim-tree.api.tree.expand_all()*
1329+
Expand all nodes in the tree.
1330+
1331+
*nvim-tree.api.tree.toggle_gitignore_filter()*
1332+
api.tree.toggle_gitignore_filter()
1333+
Toggle |nvim-tree.git.ignore| filter.
1334+
1335+
*nvim-tree.api.tree.toggle_git_clean_filter()*
1336+
api.tree.toggle_git_clean_filter()
1337+
Toggle |nvim-tree.filters.git_clean| filter.
1338+
1339+
*nvim-tree.api.tree.toggle_no_buffer_filter()*
1340+
api.tree.toggle_no_buffer_filter()
1341+
Toggle |nvim-tree.filters.no_buffer| filter.
1342+
1343+
*nvim-tree.api.tree.toggle_custom_filter()*
1344+
api.tree.toggle_custom_filter()
1345+
Toggle |nvim-tree.filters.custom| filter.
1346+
1347+
*nvim-tree.api.tree.toggle_hidden_filter()*
1348+
api.tree.toggle_hidden_filter()
1349+
Toggle |nvim-tree.filters.dotfiles| filter.
1350+
1351+
api.tree.toggle_help() *nvim-tree.api.tree.toggle_help()*
1352+
Toggle help view.
12621353

12631354
- api.fs: *nvim-tree.api.fs*
12641355
- create

lua/nvim-tree.lua

Lines changed: 46 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -70,13 +70,28 @@ end
7070
---@deprecated
7171
M.on_keypress = require("nvim-tree.actions.dispatch").dispatch
7272

73-
function M.open(cwd)
74-
cwd = cwd ~= "" and cwd or nil
73+
---Open the tree, focusing if already open.
74+
---@param opts ApiTreeOpenOpts|nil|string
75+
function M.open(opts)
76+
-- legacy arguments
77+
if type(opts) ~= "table" then
78+
opts = {
79+
path = opts,
80+
}
81+
end
82+
83+
opts = opts or {}
84+
85+
-- sanitise path
86+
if type(opts.path) ~= "string" or vim.fn.isdirectory(opts.path) == 0 then
87+
opts.path = nil
88+
end
89+
7590
if view.is_visible() then
7691
lib.set_target_win()
7792
view.focus()
7893
else
79-
lib.open(cwd)
94+
lib.open(opts)
8095
end
8196
end
8297

@@ -164,16 +179,35 @@ function M.find_file(with_open, bufnr, bang)
164179
find_file(with_open, bufnr, bang)
165180
end
166181

167-
function M.toggle(with_find_file, no_focus, cwd, bang)
182+
---Toggle the tree.
183+
---@param opts ApiTreeToggleOpts|nil|boolean
184+
function M.toggle(opts, no_focus, cwd, bang)
185+
-- legacy arguments
186+
if type(opts) ~= "table" then
187+
opts = {
188+
path = cwd,
189+
focus = not no_focus,
190+
find_file = opts,
191+
update_root = bang,
192+
}
193+
end
194+
195+
opts = opts or {}
196+
197+
-- sanitise path
198+
if type(opts.path) ~= "string" or vim.fn.isdirectory(opts.path) == 0 then
199+
opts.path = nil
200+
end
201+
168202
if view.is_visible() then
169203
view.close()
170204
else
171205
local previous_buf = vim.api.nvim_get_current_buf()
172-
M.open(cwd)
173-
if _config.update_focused_file.enable or with_find_file then
174-
find_file(false, previous_buf, bang)
206+
M.open { path = opts.path, current_window = opts.current_window }
207+
if _config.update_focused_file.enable or opts.find_file then
208+
find_file(false, previous_buf, opts.update_root)
175209
end
176-
if no_focus then
210+
if not opts.focus then
177211
vim.cmd "noautocmd wincmd p"
178212
end
179213
end
@@ -275,7 +309,7 @@ function M.on_enter(netrw_disabled)
275309
end
276310

277311
if should_open or should_hijack or existing_tree_wins[1] ~= nil then
278-
lib.open(cwd)
312+
lib.open { path = cwd }
279313

280314
if should_focus_other_window then
281315
vim.cmd "noautocmd wincmd p"
@@ -304,11 +338,11 @@ end
304338

305339
local function setup_vim_commands()
306340
vim.api.nvim_create_user_command("NvimTreeOpen", function(res)
307-
M.open(res.args)
341+
M.open { path = res.args }
308342
end, { nargs = "?", complete = "dir" })
309343
vim.api.nvim_create_user_command("NvimTreeClose", view.close, { bar = true })
310344
vim.api.nvim_create_user_command("NvimTreeToggle", function(res)
311-
M.toggle(false, false, res.args)
345+
M.toggle { find_file = false, focus = true, path = res.args, update_root = false }
312346
end, { nargs = "?", complete = "dir" })
313347
vim.api.nvim_create_user_command("NvimTreeFocus", M.focus, { bar = true })
314348
vim.api.nvim_create_user_command("NvimTreeRefresh", reloaders.reload_explorer, { bar = true })
@@ -317,7 +351,7 @@ local function setup_vim_commands()
317351
find_file(true, nil, res.bang)
318352
end, { bang = true, bar = true })
319353
vim.api.nvim_create_user_command("NvimTreeFindFileToggle", function(res)
320-
M.toggle(true, false, res.args, res.bang)
354+
M.toggle { find_file = true, focus = false, path = res.args, update_root = res.bang }
321355
end, { bang = true, nargs = "?", complete = "dir" })
322356
vim.api.nvim_create_user_command("NvimTreeResize", function(res)
323357
M.resize(res.args)

lua/nvim-tree/api.lua

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,33 +16,65 @@ local function inject_node(f)
1616
end
1717
end
1818

19+
---@class ApiTreeOpenOpts
20+
---@field path string|nil path
21+
---@field current_window boolean|nil
22+
1923
Api.tree.open = require("nvim-tree").open
24+
25+
---@class ApiTreeToggleOpts
26+
---@field path string|nil
27+
---@field current_window boolean|nil
28+
---@field focus boolean|nil
29+
---@field find_file boolean|nil
30+
---@field update_root boolean|nil
31+
2032
Api.tree.toggle = require("nvim-tree").toggle
33+
2134
Api.tree.close = require("nvim-tree.view").close
35+
2236
Api.tree.close_in_this_tab = require("nvim-tree.view").close_this_tab_only
37+
2338
Api.tree.close_in_all_tabs = require("nvim-tree.view").close_all_tabs
39+
2440
Api.tree.focus = require("nvim-tree").focus
41+
2542
Api.tree.reload = require("nvim-tree.actions.reloaders.reloaders").reload_explorer
43+
2644
Api.tree.change_root = require("nvim-tree").change_dir
45+
2746
Api.tree.change_root_to_node = inject_node(function(node)
2847
if node.name == ".." then
2948
require("nvim-tree.actions.root.change-dir").fn ".."
3049
elseif node.nodes ~= nil then
3150
require("nvim-tree.actions.root.change-dir").fn(require("nvim-tree.lib").get_last_group_node(node).absolute_path)
3251
end
3352
end)
53+
3454
Api.tree.change_root_to_parent = inject_node(require("nvim-tree.actions.root.dir-up").fn)
55+
3556
Api.tree.get_node_under_cursor = require("nvim-tree.lib").get_node_at_cursor
57+
3658
Api.tree.get_nodes = require("nvim-tree.lib").get_nodes
59+
3760
Api.tree.find_file = require("nvim-tree.actions.finders.find-file").fn
61+
3862
Api.tree.search_node = require("nvim-tree.actions.finders.search-node").fn
63+
3964
Api.tree.collapse_all = require("nvim-tree.actions.tree-modifiers.collapse-all").fn
65+
4066
Api.tree.expand_all = inject_node(require("nvim-tree.actions.tree-modifiers.expand-all").fn)
67+
4168
Api.tree.toggle_gitignore_filter = require("nvim-tree.actions.tree-modifiers.toggles").git_ignored
69+
4270
Api.tree.toggle_git_clean_filter = require("nvim-tree.actions.tree-modifiers.toggles").git_clean
71+
4372
Api.tree.toggle_no_buffer_filter = require("nvim-tree.actions.tree-modifiers.toggles").no_buffer
73+
4474
Api.tree.toggle_custom_filter = require("nvim-tree.actions.tree-modifiers.toggles").custom
75+
4576
Api.tree.toggle_hidden_filter = require("nvim-tree.actions.tree-modifiers.toggles").dotfiles
77+
4678
Api.tree.toggle_help = require("nvim-tree.actions.tree-modifiers.toggles").help
4779

4880
Api.fs.create = inject_node(require("nvim-tree.actions.fs.create-file").fn)

lua/nvim-tree/lib.lua

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -150,15 +150,22 @@ function M.prompt(prompt_input, prompt_select, items_short, items_long, callback
150150
end
151151
end
152152

153-
function M.open(cwd)
153+
---Open the tree, initialising as needed. Maybe hijack the current buffer.
154+
---@param opts ApiTreeOpenOpts|string|nil legacy case opts is path string
155+
function M.open(opts)
156+
opts = opts or {}
157+
154158
M.set_target_win()
155-
if not core.get_explorer() or cwd then
156-
core.init(cwd or vim.loop.cwd())
159+
if not core.get_explorer() or opts.path then
160+
core.init(opts.path or vim.loop.cwd())
157161
end
158162
if should_hijack_current_buf() then
159163
view.close_this_tab_only()
160164
view.open_in_current_win()
161165
renderer.draw()
166+
elseif opts.current_window then
167+
view.open_in_current_win { hijack_current_buf = false, resize = false }
168+
renderer.draw()
162169
else
163170
open_view_and_draw()
164171
end

0 commit comments

Comments
 (0)