From 31041f6d65a0832fa189c0c13a7ee52f6eb4569e Mon Sep 17 00:00:00 2001 From: brook hong Date: Thu, 20 Mar 2025 03:10:54 +0800 Subject: [PATCH] feat: Allow Chat Sidebar to Replace the Main Window (No Split) (#1638) --- lua/avante/api.lua | 1 + lua/avante/sidebar.lua | 52 +++++++++++++++++++++++++++--------------- 2 files changed, 34 insertions(+), 19 deletions(-) diff --git a/lua/avante/api.lua b/lua/avante/api.lua index 6e8592a..a42dc8f 100644 --- a/lua/avante/api.lua +++ b/lua/avante/api.lua @@ -101,6 +101,7 @@ end ---@field floating? boolean whether to open a floating input to enter the question ---@field new_chat? boolean whether to open a new chat ---@field without_selection? boolean whether to open a new chat without selection +---@field no_split? boolean whether to open a new chat without split side bar ---@param opts? AskOptions function M.ask(opts) diff --git a/lua/avante/sidebar.lua b/lua/avante/sidebar.lua index 1bb15e8..8b1a641 100644 --- a/lua/avante/sidebar.lua +++ b/lua/avante/sidebar.lua @@ -140,12 +140,18 @@ end function Sidebar:close(opts) opts = vim.tbl_extend("force", { goto_code_win = true }, opts or {}) self:delete_autocmds() + + if opts.goto_code_win and self.code then + if self.code.winid and api.nvim_win_is_valid(self.code.winid) then + fn.win_gotoid(self.code.winid) + else + vim.cmd("vert sb" .. self.code.bufnr) + end + end + for _, comp in pairs(self) do if comp and type(comp) == "table" and comp.unmount then comp:unmount() end end - if opts.goto_code_win and self.code and self.code.winid and api.nvim_win_is_valid(self.code.winid) then - fn.win_gotoid(self.code.winid) - end vim.cmd("wincmd =") end @@ -2994,8 +3000,6 @@ function Sidebar:create_input_container(opts) if ev.data and ev.data.request then handle_submit(ev.data.request) end end, }) - - self:refresh_winids() end function Sidebar:get_selected_code_size() @@ -3040,11 +3044,13 @@ function Sidebar:get_result_container_width() end function Sidebar:adjust_result_container_layout() - local width = self:get_result_container_width() - local height = self:get_result_container_height() + if self.code.winid ~= nil and api.nvim_win_is_valid(self.code.winid) then + local width = self:get_result_container_width() + local height = self:get_result_container_height() - api.nvim_win_set_width(self.result_container.winid, width) - api.nvim_win_set_height(self.result_container.winid, height) + api.nvim_win_set_width(self.result_container.winid, width) + api.nvim_win_set_height(self.result_container.winid, height) + end end ---@param opts AskOptions @@ -3089,19 +3095,27 @@ function Sidebar:render(opts) self:update_content_with_history() - -- reset states when buffer is closed - api.nvim_buf_attach(self.code.bufnr, false, { - on_detach = function(_, _) - vim.schedule(function() - local bufnr = api.nvim_win_get_buf(self.code.winid) - self.code.bufnr = bufnr - self:reload_chat_history() - end) - end, - }) + if opts.no_split == true then + vim.cmd(fn.win_getid(self.code.winid) .. "wincmd q") + self.code.winid = nil + fn.win_gotoid(self.input_container.winid) + else + -- reset states when buffer is closed + api.nvim_buf_attach(self.code.bufnr, false, { + on_detach = function(_, _) + vim.schedule(function() + local bufnr = api.nvim_win_get_buf(self.code.winid) + self.code.bufnr = bufnr + self:reload_chat_history() + end) + end, + }) + end self:create_selected_code_container() + self:refresh_winids() + self:on_mount(opts) return self