diff --git a/doc/nvim-tree-lua.txt b/doc/nvim-tree-lua.txt index 3954f014..b1538b2e 100644 --- a/doc/nvim-tree-lua.txt +++ b/doc/nvim-tree-lua.txt @@ -1358,6 +1358,8 @@ tree.open({opts}) *nvim-tree-api.tree.open()* Options: ~ • {path} (string) root directory for the tree • {current_window} (boolean) open the tree in the current window + • {winid} (number) open the tree in the specified |winid|, + overrides {current_window} • {find_file} (boolean) find the current buffer • {update_root} (boolean) requires {find_file}, see |nvim-tree.update_focused_file.update_root| @@ -1371,6 +1373,8 @@ tree.toggle({opts}) *nvim-tree-api.tree.toggle()* Options: ~ • {path} (string) root directory for the tree • {current_window} (boolean) open the tree in the current window + • {winid} (number) open the tree in the specified |winid|, + overrides {current_window} • {find_file} (boolean) find the current buffer • {update_root} (boolean) requires {find_file}, see |nvim-tree.update_focused_file.update_root| @@ -1433,8 +1437,10 @@ tree.find_file({opts}) *nvim-tree-api.tree.find_file()* Options: ~ • {buf} (string|number) absolute/relative path OR bufnr to find - • {open} (boolean) open the tree + • {open} (boolean) open the tree if necessary • {current_window} (boolean) requires {open}, open in the current window + • {winid} (number) open the tree in the specified |winid|, + overrides {current_window} • {update_root} (boolean) see |nvim-tree.update_focused_file.update_root| • {focus} (boolean) focus the tree diff --git a/lua/nvim-tree.lua b/lua/nvim-tree.lua index 1bf8b95e..eac1ff08 100644 --- a/lua/nvim-tree.lua +++ b/lua/nvim-tree.lua @@ -96,7 +96,7 @@ function M.open_replacing_current_buffer(cwd) if not core.get_explorer() or cwd ~= core.get_cwd() then core.init(cwd) end - view.open_in_current_win { hijack_current_buf = false, resize = false } + view.open_in_win { hijack_current_buf = false, resize = false } require("nvim-tree.renderer").draw() require("nvim-tree.actions.finders.find-file").fn(bufname) end diff --git a/lua/nvim-tree/actions/tree/find-file.lua b/lua/nvim-tree/actions/tree/find-file.lua index c1745e49..0514b26c 100644 --- a/lua/nvim-tree/actions/tree/find-file.lua +++ b/lua/nvim-tree/actions/tree/find-file.lua @@ -48,7 +48,7 @@ function M.fn(opts) end elseif opts.open then -- open - lib.open { current_window = opts.current_window } + lib.open { current_window = opts.current_window, winid = opts.winid } if not opts.focus then vim.cmd "noautocmd wincmd p" end diff --git a/lua/nvim-tree/actions/tree/open.lua b/lua/nvim-tree/actions/tree/open.lua index c0d71754..23a5d89d 100644 --- a/lua/nvim-tree/actions/tree/open.lua +++ b/lua/nvim-tree/actions/tree/open.lua @@ -29,7 +29,7 @@ function M.fn(opts) view.focus() else -- open - lib.open { path = opts.path, current_window = opts.current_window } + lib.open { path = opts.path, current_window = opts.current_window, winid = opts.winid } end -- find file diff --git a/lua/nvim-tree/actions/tree/toggle.lua b/lua/nvim-tree/actions/tree/toggle.lua index e4b2b674..89ca2048 100644 --- a/lua/nvim-tree/actions/tree/toggle.lua +++ b/lua/nvim-tree/actions/tree/toggle.lua @@ -45,7 +45,7 @@ function M.fn(opts, no_focus, cwd, bang) view.close() else -- open - lib.open { path = opts.path, current_window = opts.current_window } + lib.open { path = opts.path, current_window = opts.current_window, winid = opts.winid } -- find file if M.config.update_focused_file.enable or opts.find_file then diff --git a/lua/nvim-tree/api.lua b/lua/nvim-tree/api.lua index 24b5d144..3905ec16 100644 --- a/lua/nvim-tree/api.lua +++ b/lua/nvim-tree/api.lua @@ -36,6 +36,7 @@ end ---@class ApiTreeOpenOpts ---@field path string|nil path ---@field current_window boolean|nil default false +---@field winid number|nil ---@field find_file boolean|nil default false ---@field update_root boolean|nil default false @@ -44,6 +45,7 @@ Api.tree.open = wrap(require("nvim-tree.actions.tree.open").fn) ---@class ApiTreeToggleOpts ---@field path string|nil ---@field current_window boolean|nil default false +---@field winid number|nil ---@field find_file boolean|nil default false ---@field update_root boolean|nil default false ---@field focus boolean|nil default true @@ -84,6 +86,7 @@ Api.tree.get_nodes = wrap(require("nvim-tree.lib").get_nodes) ---@field buf string|number|nil ---@field open boolean|nil default false ---@field current_window boolean|nil default false +---@field winid number|nil ---@field update_root boolean|nil default false ---@field focus boolean|nil default false diff --git a/lua/nvim-tree/lib.lua b/lua/nvim-tree/lib.lua index c82d06fd..d96c2107 100644 --- a/lua/nvim-tree/lib.lua +++ b/lua/nvim-tree/lib.lua @@ -7,6 +7,7 @@ local events = require "nvim-tree.events" ---@class LibOpenOpts ---@field path string|nil path ---@field current_window boolean|nil default false +---@field winid number|nil local M = { target_winid = nil, @@ -163,10 +164,13 @@ function M.open(opts) end if should_hijack_current_buf() then view.close_this_tab_only() - view.open_in_current_win() + view.open_in_win() + renderer.draw() + elseif opts.winid then + view.open_in_win { hijack_current_buf = false, resize = false, winid = opts.winid } renderer.draw() elseif opts.current_window then - view.open_in_current_win { hijack_current_buf = false, resize = false } + view.open_in_win { hijack_current_buf = false, resize = false } renderer.draw() else open_view_and_draw() diff --git a/lua/nvim-tree/view.lua b/lua/nvim-tree/view.lua index 2d6c6a6e..2cbaf9db 100644 --- a/lua/nvim-tree/view.lua +++ b/lua/nvim-tree/view.lua @@ -1,9 +1,14 @@ -local M = {} - local events = require "nvim-tree.events" local utils = require "nvim-tree.utils" local log = require "nvim-tree.log" +---@class OpenInWinOpts +---@field hijack_current_buf boolean|nil default true +---@field resize boolean|nil default true +---@field winid number|nil 0 or nil for current + +local M = {} + local DEFAULT_MIN_WIDTH = 30 local DEFAULT_MAX_WIDTH = -1 local DEFAULT_PADDING = 1 @@ -340,8 +345,13 @@ local function set_current_win() M.View.tabpages[current_tab].winnr = vim.api.nvim_get_current_win() end -function M.open_in_current_win(opts) +---Open the tree in the a window +---@param opts OpenInWinOpts|nil +function M.open_in_win(opts) opts = opts or { hijack_current_buf = true, resize = true } + if opts.winid and vim.api.nvim_win_is_valid(opts.winid) then + vim.api.nvim_set_current_win(opts.winid) + end create_buffer(opts.hijack_current_buf and vim.api.nvim_get_current_buf()) setup_tabpage(vim.api.nvim_get_current_tabpage()) set_current_win()