From bcbe0347d8b5542b8a3361af8506f6dcf5bca02e Mon Sep 17 00:00:00 2001 From: yetone Date: Sun, 31 Aug 2025 21:33:57 +0800 Subject: [PATCH] feat: supports full view in multi-window mode (#2660) --- lua/avante/sidebar.lua | 25 ++++++++++++++++++++++--- lua/avante/utils/init.lua | 5 +++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/lua/avante/sidebar.lua b/lua/avante/sidebar.lua index 74bb946..503c0dc 100644 --- a/lua/avante/sidebar.lua +++ b/lua/avante/sidebar.lua @@ -61,6 +61,7 @@ Sidebar.__index = Sidebar ---@field id integer ---@field augroup integer ---@field code avante.CodeState +---@field win_width_store table ---@field containers { result?: NuiSplit, todos?: NuiSplit, selected_code?: NuiSplit, selected_files?: NuiSplit, input?: NuiSplit } ---@field file_selector FileSelector ---@field chat_history avante.ChatHistory | nil @@ -83,6 +84,7 @@ function Sidebar:new(id) return setmetatable({ id = id, code = { bufnr = 0, winid = 0, selection = nil, old_winhl = nil }, + win_width_store = {}, winids = { result_container = 0, todos_container = 0, @@ -139,6 +141,7 @@ function Sidebar:reset() self:delete_containers() + self.win_width_store = {} self.code = { bufnr = 0, winid = 0, selection = nil } self.scroll = true self.old_result_lines = {} @@ -1507,12 +1510,28 @@ function Sidebar:render_logo() end function Sidebar:toggle_code_window() + local winids = api.nvim_tabpage_list_wins(self.id) + local container_winids = vim.tbl_map(function(container) return container.winid end, self.containers) local win_width = api.nvim_win_get_width(self.code.winid) if win_width == 0 then - api.nvim_win_set_width(self.code.winid, self.code.win_width) + for _, winid in ipairs(winids) do + if not vim.tbl_contains(container_winids, winid) and api.nvim_win_is_valid(winid) then + local old_width = self.win_width_store[winid] + if old_width ~= nil then api.nvim_win_set_width(winid, old_width) end + end + end else - self.code.win_width = win_width - api.nvim_win_set_width(self.code.winid, 0) + for _, winid in ipairs(winids) do + if not vim.tbl_contains(container_winids, winid) and api.nvim_win_is_valid(winid) then + if Utils.is_floating_window(winid) then + api.nvim_win_close(winid, true) + else + local width = api.nvim_win_get_width(winid) + self.win_width_store[winid] = width + api.nvim_win_set_width(winid, 0) + end + end + end end end diff --git a/lua/avante/utils/init.lua b/lua/avante/utils/init.lua index 529aaeb..ae164d1 100644 --- a/lua/avante/utils/init.lua +++ b/lua/avante/utils/init.lua @@ -1716,4 +1716,9 @@ function M.get_unified_diff(text1, text2, opts) return vim.diff(text1, text2, opts) end +function M.is_floating_window(win_id) + local config = vim.api.nvim_win_get_config(win_id or 0) + return config.relative ~= "" +end + return M