diff --git a/lua/avante/api.lua b/lua/avante/api.lua index b9d7384..fd818a4 100644 --- a/lua/avante/api.lua +++ b/lua/avante/api.lua @@ -141,7 +141,7 @@ function M.ask(opts) if opts.without_selection then sidebar.code.selection = nil sidebar.file_selector:reset() - if sidebar.selected_files_container then sidebar.selected_files_container:unmount() end + if sidebar.containers.selected_files then sidebar.containers.selected_files:unmount() end end if input == nil or input == "" then return true end vim.api.nvim_exec_autocmds("User", { pattern = "AvanteInputSubmitted", data = { request = input } }) @@ -192,7 +192,7 @@ function M.refresh(opts) if not sidebar:is_open() then return end local curbuf = vim.api.nvim_get_current_buf() - local focused = sidebar.result_container.bufnr == curbuf or sidebar.input_container.bufnr == curbuf + local focused = sidebar.containers.result.bufnr == curbuf or sidebar.containers.input.bufnr == curbuf if focused or not sidebar:is_open() then return end local listed = vim.api.nvim_get_option_value("buflisted", { buf = curbuf }) @@ -216,20 +216,20 @@ function M.focus(opts) local curwin = vim.api.nvim_get_current_win() if sidebar:is_open() then - if curbuf == sidebar.input_container.bufnr then + if curbuf == sidebar.containers.input.bufnr then if sidebar.code.winid and sidebar.code.winid ~= curwin then vim.api.nvim_set_current_win(sidebar.code.winid) end - elseif curbuf == sidebar.result_container.bufnr then + elseif curbuf == sidebar.containers.result.bufnr then if sidebar.code.winid and sidebar.code.winid ~= curwin then vim.api.nvim_set_current_win(sidebar.code.winid) end else - if sidebar.input_container.winid and sidebar.input_container.winid ~= curwin then - vim.api.nvim_set_current_win(sidebar.input_container.winid) + if sidebar.containers.input.winid and sidebar.containers.input.winid ~= curwin then + vim.api.nvim_set_current_win(sidebar.containers.input.winid) end end else if sidebar.code.winid then vim.api.nvim_set_current_win(sidebar.code.winid) end ---@cast opts SidebarOpenOptions sidebar:open(opts) - if sidebar.input_container.winid then vim.api.nvim_set_current_win(sidebar.input_container.winid) end + if sidebar.containers.input.winid then vim.api.nvim_set_current_win(sidebar.containers.input.winid) end end end diff --git a/lua/avante/llm_tools/helpers.lua b/lua/avante/llm_tools/helpers.lua index 8d89651..bd4e09b 100644 --- a/lua/avante/llm_tools/helpers.lua +++ b/lua/avante/llm_tools/helpers.lua @@ -48,12 +48,12 @@ function M.confirm(message, callback, confirm_opts, session_ctx, tool_name) end local Confirm = require("avante.ui.confirm") local sidebar = require("avante").get() - if not sidebar or not sidebar.input_container or not sidebar.input_container.winid then + if not sidebar or not sidebar.containers.input or not sidebar.containers.input.winid then Utils.error("Avante sidebar not found", { title = "Avante" }) callback(false) return end - confirm_opts = vim.tbl_deep_extend("force", { container_winid = sidebar.input_container.winid }, confirm_opts or {}) + confirm_opts = vim.tbl_deep_extend("force", { container_winid = sidebar.containers.input.winid }, confirm_opts or {}) if M.confirm_popup then M.confirm_popup:close() end M.confirm_popup = Confirm:new(message, function(type, reason) if type == "yes" then diff --git a/lua/avante/sidebar.lua b/lua/avante/sidebar.lua index 2333bda..9b7e51a 100644 --- a/lua/avante/sidebar.lua +++ b/lua/avante/sidebar.lua @@ -50,11 +50,7 @@ Sidebar.__index = Sidebar ---@field augroup integer ---@field code avante.CodeState ---@field winids table<"result_container" | "todos_container" | "selected_code_container" | "selected_files_container" | "input_container", integer> ----@field result_container NuiSplit | nil ----@field todos_container NuiSplit | nil ----@field selected_code_container NuiSplit | nil ----@field selected_files_container NuiSplit | nil ----@field input_container NuiSplit | nil +---@field containers { result?: NuiSplit, todos?: NuiSplit, selected_code?: NuiSplit, selected_files?: NuiSplit, input?: NuiSplit } ---@field file_selector FileSelector ---@field chat_history avante.ChatHistory | nil ---@field current_state avante.GenerateState | nil @@ -81,11 +77,7 @@ function Sidebar:new(id) selected_code_container = 0, input_container = 0, }, - result_container = nil, - todos_container = nil, - selected_code_container = nil, - selected_files_container = nil, - input_container = nil, + containers = {}, file_selector = FileSelector:new(id), is_generating = false, chat_history = nil, @@ -111,6 +103,13 @@ function Sidebar:delete_autocmds() self.augroup = nil end +function Sidebar:delete_containers() + for _, container in pairs(self.containers) do + container:unmount() + end + self.containers = {} +end + function Sidebar:reset() -- clean up event handlers if self.augroup then @@ -125,19 +124,11 @@ function Sidebar:reset() -- clean up file selector events if self.file_selector then self.file_selector:off("update") end - if self.result_container then self.result_container:unmount() end - if self.selected_code_container then self.selected_code_container:unmount() end - if self.selected_files_container then self.selected_files_container:unmount() end - if self.input_container then self.input_container:unmount() end + self:delete_containers() self.code = { bufnr = 0, winid = 0, selection = nil } self.winids = { result_container = 0, selected_files_container = 0, selected_code_container = 0, input_container = 0 } - self.result_container = nil - self.todos_container = nil - self.selected_code_container = nil - self.selected_files_container = nil - self.input_container = nil self.scroll = true self.old_result_lines = {} self.token_count = nil @@ -234,10 +225,10 @@ end ---@param opts? SidebarCloseOptions function Sidebar:close(opts) opts = vim.tbl_extend("force", { goto_code_win = true }, opts or {}) + self:delete_autocmds() - for _, comp in pairs(self) do - if comp and type(comp) == "table" and comp.unmount then comp:unmount() end - end + self:delete_containers() + self.old_result_lines = {} 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) @@ -256,20 +247,20 @@ end ---@return boolean function Sidebar:focus() if self:is_open() then - fn.win_gotoid(self.result_container.winid) + fn.win_gotoid(self.containers.result.winid) return true end return false end function Sidebar:focus_input() - if Utils.is_valid_container(self.input_container, true) then - api.nvim_set_current_win(self.input_container.winid) + if Utils.is_valid_container(self.containers.input, true) then + api.nvim_set_current_win(self.containers.input.winid) self:show_input_hint() end end -function Sidebar:is_open() return Utils.is_valid_container(self.result_container, true) end +function Sidebar:is_open() return Utils.is_valid_container(self.containers.result, true) end function Sidebar:in_code_win() return self.code.winid == api.nvim_get_current_win() end @@ -731,7 +722,7 @@ end function Sidebar:is_cursor_in_user_request_block() local block = self:get_current_user_request_block() if block == nil then return false end - local cursor_line = api.nvim_win_get_cursor(self.result_container.winid)[1] + local cursor_line = api.nvim_win_get_cursor(self.containers.result.winid)[1] return cursor_line >= block.start_line and cursor_line <= block.end_line end @@ -834,11 +825,11 @@ function Sidebar:edit_user_request() local block = self:get_current_user_request_block() if not block then return end - if Utils.is_valid_container(self.input_container) then + if Utils.is_valid_container(self.containers.input) then local lines = vim.split(block.content, "\n") - api.nvim_buf_set_lines(self.input_container.bufnr, 0, -1, false, lines) - api.nvim_set_current_win(self.input_container.winid) - api.nvim_win_set_cursor(self.input_container.winid, { 1, #lines > 0 and #lines[1] or 0 }) + api.nvim_buf_set_lines(self.containers.input.bufnr, 0, -1, false, lines) + api.nvim_set_current_win(self.containers.input.winid) + api.nvim_win_set_cursor(self.containers.input.winid, { 1, #lines > 0 and #lines[1] or 0 }) end end @@ -848,8 +839,8 @@ function Sidebar:apply(current_cursor) local all_snippets_map = extract_code_snippets_map(response) local selected_snippets_map = {} if current_cursor then - if self.result_container and self.result_container.winid then - local cursor_line = Utils.get_cursor_pos(self.result_container.winid) + if self.containers.result and self.containers.result.winid then + local cursor_line = Utils.get_cursor_pos(self.containers.result.winid) for filepath, snippets in pairs(all_snippets_map) do for _, snippet in ipairs(snippets) do if @@ -980,11 +971,11 @@ function Sidebar:render_header(winid, bufnr, header_text, hl, reverse_hl) end function Sidebar:render_result() - if not Utils.is_valid_container(self.result_container) then return end + if not Utils.is_valid_container(self.containers.result) then return end local header_text = Utils.icon("󰭻 ") .. "Avante" self:render_header( - self.result_container.winid, - self.result_container.bufnr, + self.containers.result.winid, + self.containers.result.bufnr, header_text, Highlights.TITLE, Highlights.REVERSED_TITLE @@ -994,7 +985,7 @@ end ---@param ask? boolean function Sidebar:render_input(ask) if ask == nil then ask = true end - if not Utils.is_valid_container(self.input_container) then return end + if not Utils.is_valid_container(self.containers.input) then return end local header_text = string.format( "%s%s (" .. Config.mappings.sidebar.switch_windows .. ": switch focus)", @@ -1013,8 +1004,8 @@ function Sidebar:render_input(ask) end self:render_header( - self.input_container.winid, - self.input_container.bufnr, + self.containers.input.winid, + self.containers.input.bufnr, header_text, Highlights.THIRD_TITLE, Highlights.REVERSED_THIRD_TITLE @@ -1022,7 +1013,7 @@ function Sidebar:render_input(ask) end function Sidebar:render_selected_code() - if not Utils.is_valid_container(self.selected_code_container) then return end + if not Utils.is_valid_container(self.containers.selected_code) then return end local selected_code_lines_count = 0 local selected_code_max_lines_count = 5 @@ -1041,8 +1032,8 @@ function Sidebar:render_selected_code() ) self:render_header( - self.selected_code_container.winid, - self.selected_code_container.bufnr, + self.containers.selected_code.winid, + self.containers.selected_code.bufnr, header_text, Highlights.SUBTITLE, Highlights.REVERSED_SUBTITLE @@ -1050,60 +1041,60 @@ function Sidebar:render_selected_code() end function Sidebar:bind_apply_key() - if self.result_container then + if self.containers.result then vim.keymap.set( "n", Config.mappings.sidebar.apply_cursor, function() self:apply(true) end, - { buffer = self.result_container.bufnr, noremap = true, silent = true } + { buffer = self.containers.result.bufnr, noremap = true, silent = true } ) end end function Sidebar:unbind_apply_key() - if self.result_container then - pcall(vim.keymap.del, "n", Config.mappings.sidebar.apply_cursor, { buffer = self.result_container.bufnr }) + if self.containers.result then + pcall(vim.keymap.del, "n", Config.mappings.sidebar.apply_cursor, { buffer = self.containers.result.bufnr }) end end function Sidebar:bind_retry_user_request_key() - if self.result_container then + if self.containers.result then vim.keymap.set( "n", Config.mappings.sidebar.retry_user_request, function() self:retry_user_request() end, - { buffer = self.result_container.bufnr, noremap = true, silent = true } + { buffer = self.containers.result.bufnr, noremap = true, silent = true } ) end end function Sidebar:unbind_retry_user_request_key() - if self.result_container then - pcall(vim.keymap.del, "n", Config.mappings.sidebar.retry_user_request, { buffer = self.result_container.bufnr }) + if self.containers.result then + pcall(vim.keymap.del, "n", Config.mappings.sidebar.retry_user_request, { buffer = self.containers.result.bufnr }) end end function Sidebar:bind_edit_user_request_key() - if self.result_container then + if self.containers.result then vim.keymap.set( "n", Config.mappings.sidebar.edit_user_request, function() self:edit_user_request() end, - { buffer = self.result_container.bufnr, noremap = true, silent = true } + { buffer = self.containers.result.bufnr, noremap = true, silent = true } ) end end function Sidebar:unbind_edit_user_request_key() - if self.result_container then - pcall(vim.keymap.del, "n", Config.mappings.sidebar.edit_user_request, { buffer = self.result_container.bufnr }) + if self.containers.result then + pcall(vim.keymap.del, "n", Config.mappings.sidebar.edit_user_request, { buffer = self.containers.result.bufnr }) end end function Sidebar:bind_sidebar_keys(codeblocks) ---@param direction "next" | "prev" local function jump_to_codeblock(direction) - local cursor_line = api.nvim_win_get_cursor(self.result_container.winid)[1] + local cursor_line = api.nvim_win_get_cursor(self.containers.result.winid)[1] ---@type AvanteCodeblock local target_block @@ -1126,7 +1117,7 @@ function Sidebar:bind_sidebar_keys(codeblocks) end if target_block then - api.nvim_win_set_cursor(self.result_container.winid, { target_block.start_line, 0 }) + api.nvim_win_set_cursor(self.containers.result.winid, { target_block.start_line, 0 }) vim.cmd("normal! zz") else Utils.error("No codeblock found") @@ -1136,7 +1127,7 @@ function Sidebar:bind_sidebar_keys(codeblocks) ---@param direction "next" | "prev" local function jump_to_prompt(direction) local current_request_block = self:get_current_user_request_block() - local current_line = Utils.get_cursor_pos(self.result_container.winid) + local current_line = Utils.get_cursor_pos(self.containers.result.winid) if not current_request_block then Utils.error("No prompt found") return @@ -1145,11 +1136,11 @@ function Sidebar:bind_sidebar_keys(codeblocks) (current_request_block.start_line > current_line and direction == "next") or (current_request_block.end_line < current_line and direction == "prev") then - api.nvim_win_set_cursor(self.result_container.winid, { current_request_block.start_line, 0 }) + api.nvim_win_set_cursor(self.containers.result.winid, { current_request_block.start_line, 0 }) return end local start_search_line = current_line - local result_lines = Utils.get_buf_lines(0, -1, self.result_container.bufnr) + local result_lines = Utils.get_buf_lines(0, -1, self.containers.result.bufnr) local end_search_line = direction == "next" and #result_lines or 1 local step = direction == "next" and 1 or -1 local query_pos ---@type integer|nil @@ -1169,46 +1160,46 @@ function Sidebar:bind_sidebar_keys(codeblocks) Utils.error("No prompt found") return end - api.nvim_win_set_cursor(self.result_container.winid, { current_request_block.start_line, 0 }) + api.nvim_win_set_cursor(self.containers.result.winid, { current_request_block.start_line, 0 }) end vim.keymap.set( "n", Config.mappings.sidebar.apply_all, function() self:apply(false) end, - { buffer = self.result_container.bufnr, noremap = true, silent = true } + { buffer = self.containers.result.bufnr, noremap = true, silent = true } ) vim.keymap.set( "n", Config.mappings.jump.next, function() jump_to_codeblock("next") end, - { buffer = self.result_container.bufnr, noremap = true, silent = true } + { buffer = self.containers.result.bufnr, noremap = true, silent = true } ) vim.keymap.set( "n", Config.mappings.jump.prev, function() jump_to_codeblock("prev") end, - { buffer = self.result_container.bufnr, noremap = true, silent = true } + { buffer = self.containers.result.bufnr, noremap = true, silent = true } ) vim.keymap.set( "n", Config.mappings.sidebar.next_prompt, function() jump_to_prompt("next") end, - { buffer = self.result_container.bufnr, noremap = true, silent = true } + { buffer = self.containers.result.bufnr, noremap = true, silent = true } ) vim.keymap.set( "n", Config.mappings.sidebar.prev_prompt, function() jump_to_prompt("prev") end, - { buffer = self.result_container.bufnr, noremap = true, silent = true } + { buffer = self.containers.result.bufnr, noremap = true, silent = true } ) end function Sidebar:unbind_sidebar_keys() - if Utils.is_valid_container(self.result_container) then - pcall(vim.keymap.del, "n", Config.mappings.sidebar.apply_all, { buffer = self.result_container.bufnr }) - pcall(vim.keymap.del, "n", Config.mappings.jump.next, { buffer = self.result_container.bufnr }) - pcall(vim.keymap.del, "n", Config.mappings.jump.prev, { buffer = self.result_container.bufnr }) + if Utils.is_valid_container(self.containers.result) then + pcall(vim.keymap.del, "n", Config.mappings.sidebar.apply_all, { buffer = self.containers.result.bufnr }) + pcall(vim.keymap.del, "n", Config.mappings.jump.next, { buffer = self.containers.result.bufnr }) + pcall(vim.keymap.del, "n", Config.mappings.jump.prev, { buffer = self.containers.result.bufnr }) end end @@ -1231,18 +1222,22 @@ function Sidebar:on_mount(opts) }) end - api.nvim_set_option_value("wrap", Config.windows.wrap, { win = self.result_container.winid }) + api.nvim_set_option_value("wrap", Config.windows.wrap, { win = self.containers.result.winid }) local current_apply_extmark_id = nil ---@param block AvanteCodeblock local function show_apply_button(block) if current_apply_extmark_id then - api.nvim_buf_del_extmark(self.result_container.bufnr, CODEBLOCK_KEYBINDING_NAMESPACE, current_apply_extmark_id) + api.nvim_buf_del_extmark(self.containers.result.bufnr, CODEBLOCK_KEYBINDING_NAMESPACE, current_apply_extmark_id) end - current_apply_extmark_id = - api.nvim_buf_set_extmark(self.result_container.bufnr, CODEBLOCK_KEYBINDING_NAMESPACE, block.start_line - 1, -1, { + current_apply_extmark_id = api.nvim_buf_set_extmark( + self.containers.result.bufnr, + CODEBLOCK_KEYBINDING_NAMESPACE, + block.start_line - 1, + -1, + { virt_text = { { string.format( @@ -1256,7 +1251,8 @@ function Sidebar:on_mount(opts) virt_text_pos = "right_align", hl_group = "AvanteInlineHint", priority = PRIORITY, - }) + } + ) end local current_user_request_block_extmark_id = nil @@ -1264,7 +1260,7 @@ function Sidebar:on_mount(opts) local function show_user_request_block_control_buttons() if current_user_request_block_extmark_id then api.nvim_buf_del_extmark( - self.result_container.bufnr, + self.containers.result.bufnr, USER_REQUEST_BLOCK_KEYBINDING_NAMESPACE, current_user_request_block_extmark_id ) @@ -1274,7 +1270,7 @@ function Sidebar:on_mount(opts) if not block then return end current_user_request_block_extmark_id = api.nvim_buf_set_extmark( - self.result_container.bufnr, + self.containers.result.bufnr, USER_REQUEST_BLOCK_KEYBINDING_NAMESPACE, block.start_line - 1, -1, @@ -1301,7 +1297,7 @@ function Sidebar:on_mount(opts) api.nvim_create_autocmd({ "CursorMoved", "CursorMovedI" }, { group = self.augroup, - buffer = self.result_container.bufnr, + buffer = self.containers.result.bufnr, callback = function(ev) local in_codeblock = is_cursor_in_codeblock(codeblocks) @@ -1329,7 +1325,7 @@ function Sidebar:on_mount(opts) if self.code.bufnr and api.nvim_buf_is_valid(self.code.bufnr) then api.nvim_create_autocmd({ "BufEnter", "BufWritePost" }, { group = self.augroup, - buffer = self.result_container.bufnr, + buffer = self.containers.result.bufnr, callback = function(ev) codeblocks = parse_codeblocks(ev.buf) self:bind_sidebar_keys(codeblocks) @@ -1340,8 +1336,8 @@ function Sidebar:on_mount(opts) group = self.augroup, pattern = VIEW_BUFFER_UPDATED_PATTERN, callback = function() - if not Utils.is_valid_container(self.result_container) then return end - codeblocks = parse_codeblocks(self.result_container.bufnr) + if not Utils.is_valid_container(self.containers.result) then return end + codeblocks = parse_codeblocks(self.containers.result.bufnr) self:bind_sidebar_keys(codeblocks) end, }) @@ -1349,7 +1345,7 @@ function Sidebar:on_mount(opts) api.nvim_create_autocmd("BufLeave", { group = self.augroup, - buffer = self.result_container.bufnr, + buffer = self.containers.result.bufnr, callback = function() self:unbind_sidebar_keys() end, }) @@ -1357,8 +1353,8 @@ function Sidebar:on_mount(opts) self:render_input(opts.ask) self:render_selected_code() - if self.selected_code_container ~= nil then - local selected_code_buf = self.selected_code_container.bufnr + if self.containers.selected_code ~= nil then + local selected_code_buf = self.containers.selected_code.bufnr if selected_code_buf ~= nil then if self.code.selection ~= nil then Utils.unlock_buf(selected_code_buf) @@ -1375,12 +1371,12 @@ function Sidebar:on_mount(opts) api.nvim_create_autocmd("BufEnter", { group = self.augroup, - buffer = self.result_container.bufnr, + buffer = self.containers.result.bufnr, callback = function() if Config.behaviour.auto_focus_sidebar then self:focus() - if Utils.is_valid_container(self.input_container, true) then - api.nvim_set_current_win(self.input_container.winid) + if Utils.is_valid_container(self.containers.input, true) then + api.nvim_set_current_win(self.containers.input.winid) vim.defer_fn(function() if Config.windows.ask.start_insert then vim.cmd("noautocmd startinsert!") end end, 300) @@ -1401,18 +1397,18 @@ function Sidebar:on_mount(opts) end, }) - for _, comp in pairs(self) do - if comp and type(comp) == "table" and comp.mount and comp.bufnr and api.nvim_buf_is_valid(comp.bufnr) then - Utils.mark_as_sidebar_buffer(comp.bufnr) + for _, container in pairs(self.containers) do + if container.mount and container.bufnr and api.nvim_buf_is_valid(container.bufnr) then + Utils.mark_as_sidebar_buffer(container.bufnr) end end end function Sidebar:refresh_winids() self.winids = {} - for key, comp in pairs(self) do - if comp and type(comp) == "table" and comp.winid and api.nvim_win_is_valid(comp.winid) then - self.winids[key] = comp.winid + for key, container in pairs(self.containers) do + if container.winid and api.nvim_win_is_valid(container.winid) then + self.winids[key .. "_container"] = container.winid end end @@ -1467,9 +1463,9 @@ function Sidebar:refresh_winids() end function Sidebar:resize() - for _, comp in pairs(self) do - if comp and type(comp) == "table" and comp.winid and api.nvim_win_is_valid(comp.winid) then - api.nvim_win_set_width(comp.winid, Config.get_window_width()) + for _, container in pairs(self.containers) do + if container.winid and api.nvim_win_is_valid(container.winid) then + api.nvim_win_set_width(container.winid, Config.get_window_width()) end end self:render_result() @@ -1507,7 +1503,7 @@ function Sidebar:initialize() end function Sidebar:is_focused_on_result() - return self:is_open() and self.result_container and self.result_container.winid == api.nvim_get_current_win() + return self:is_open() and self.containers.result and self.containers.result.winid == api.nvim_get_current_win() end function Sidebar:is_sidebar_winid(winid) @@ -1519,13 +1515,13 @@ end ---@return boolean function Sidebar:should_auto_scroll() - if not self.result_container or not self.result_container.winid then return false end - if not api.nvim_win_is_valid(self.result_container.winid) then return false end + if not self.containers.result or not self.containers.result.winid then return false end + if not api.nvim_win_is_valid(self.containers.result.winid) then return false end - local win_height = api.nvim_win_get_height(self.result_container.winid) - local total_lines = api.nvim_buf_line_count(self.result_container.bufnr) + local win_height = api.nvim_win_get_height(self.containers.result.winid) + local total_lines = api.nvim_buf_line_count(self.containers.result.bufnr) - local topline = vim.fn.line("w0", self.result_container.winid) + local topline = vim.fn.line("w0", self.containers.result.winid) local last_visible_line = topline + win_height - 1 @@ -1542,10 +1538,10 @@ end, 50) ---@param content string concatenated content of the buffer ---@param opts? {focus?: boolean, scroll?: boolean, backspace?: integer, callback?: fun(): nil} whether to focus the result view function Sidebar:update_content(content, opts) - if not self.result_container or not self.result_container.bufnr then return end + if not self.containers.result or not self.containers.result.bufnr then return end -- 提前验证容器有效性,避免后续无效操作 - if not Utils.is_valid_container(self.result_container) then return end + if not Utils.is_valid_container(self.containers.result) then return end local should_auto_scroll = self:should_auto_scroll() @@ -1574,12 +1570,12 @@ function Sidebar:update_content(content, opts) -- 使用 vim.schedule 而不是 vim.defer_fn(0),性能更好 -- 再次检查容器有效性 - if not Utils.is_valid_container(self.result_container) then return end + if not Utils.is_valid_container(self.containers.result) then return end self:clear_state() -- 批量更新操作 - local bufnr = self.result_container.bufnr + local bufnr = self.containers.result.bufnr Utils.unlock_buf(bufnr) Utils.update_buffer_lines(RESULT_BUF_HL_NAMESPACE, bufnr, self.old_result_lines, history_lines) @@ -1593,7 +1589,7 @@ function Sidebar:update_content(content, opts) -- 处理焦点和滚动 if opts.focus and not self:is_focused_on_result() then - xpcall(function() api.nvim_set_current_win(self.result_container.winid) end, function(err) + xpcall(function() api.nvim_set_current_win(self.containers.result.winid) end, function(err) Utils.debug("Failed to set current win:", err) return err end) @@ -1840,7 +1836,7 @@ end function Sidebar:get_content_between_separators(position) local separator = RESP_SEPARATOR local cursor_line = position or Utils.get_cursor_pos() - local lines = Utils.get_buf_lines(0, -1, self.result_container.bufnr) + local lines = Utils.get_buf_lines(0, -1, self.containers.result.bufnr) local start_line, end_line for i = cursor_line, 1, -1 do @@ -1895,7 +1891,7 @@ end function Sidebar:clear_state() if self.state_extmark_id then - pcall(api.nvim_buf_del_extmark, self.result_container.bufnr, STATE_NAMESPACE, self.state_extmark_id) + pcall(api.nvim_buf_del_extmark, self.containers.result.bufnr, STATE_NAMESPACE, self.state_extmark_id) end self.state_extmark_id = nil self.state_spinner_idx = 1 @@ -1903,11 +1899,11 @@ function Sidebar:clear_state() end function Sidebar:render_state() - if not Utils.is_valid_container(self.result_container) then return end + if not Utils.is_valid_container(self.containers.result) then return end if not self.current_state then return end - local lines = vim.api.nvim_buf_get_lines(self.result_container.bufnr, 0, -1, false) + local lines = vim.api.nvim_buf_get_lines(self.containers.result.bufnr, 0, -1, false) if self.state_extmark_id then - api.nvim_buf_del_extmark(self.result_container.bufnr, STATE_NAMESPACE, self.state_extmark_id) + api.nvim_buf_del_extmark(self.containers.result.bufnr, STATE_NAMESPACE, self.state_extmark_id) end local spinner_chars = self.state_spinner_chars if self.current_state == "thinking" then spinner_chars = self.thinking_spinner_chars end @@ -1935,14 +1931,14 @@ function Sidebar:render_state() virt_line = " " .. spinner_char .. " " .. self.current_state .. " " end - local win_width = api.nvim_win_get_width(self.result_container.winid) + local win_width = api.nvim_win_get_width(self.containers.result.winid) local padding = math.floor((win_width - vim.fn.strdisplaywidth(virt_line)) / 2) local centered_virt_lines = { { { string.rep(" ", padding) }, { virt_line, hl } }, } local line_num = math.max(0, #lines - 2) - self.state_extmark_id = api.nvim_buf_set_extmark(self.result_container.bufnr, STATE_NAMESPACE, line_num, 0, { + self.state_extmark_id = api.nvim_buf_set_extmark(self.containers.result.bufnr, STATE_NAMESPACE, line_num, 0, { virt_lines = centered_virt_lines, hl_eol = true, hl_mode = "combine", @@ -1959,7 +1955,7 @@ You are a responsible senior development engineer, and you are about to leave yo self:new_chat(args, cb) self.code.selection = nil self.file_selector:reset() - if self.selected_files_container then self.selected_files_container:unmount() end + if self.containers.selected_files then self.containers.selected_files:unmount() end vim.api.nvim_exec_autocmds("User", { pattern = "AvanteInputSubmitted", data = { request = user_input } }) end @@ -2109,19 +2105,19 @@ function Sidebar:add_chat_history(messages, options) end function Sidebar:create_selected_code_container() - if self.selected_code_container ~= nil then - self.selected_code_container:unmount() - self.selected_code_container = nil + if self.containers.selected_code ~= nil then + self.containers.selected_code:unmount() + self.containers.selected_code = nil end local height = self:get_selected_code_container_height() if self.code.selection ~= nil then - self.selected_code_container = Split({ + self.containers.selected_code = Split({ enter = false, relative = { type = "win", - winid = self.input_container.winid, + winid = self.containers.input.winid, }, buf_options = buf_options, win_options = vim.tbl_deep_extend("force", base_win_options, {}), @@ -2130,7 +2126,7 @@ function Sidebar:create_selected_code_container() }, position = "top", }) - self.selected_code_container:mount() + self.containers.selected_code:mount() self:adjust_layout() end end @@ -2146,8 +2142,8 @@ function Sidebar:close_input_hint() end function Sidebar:get_input_float_window_row() - local win_height = api.nvim_win_get_height(self.input_container.winid) - local winline = Utils.winline(self.input_container.winid) + local win_height = api.nvim_win_get_height(self.containers.input.winid) + local winline = Utils.winline(self.containers.input.winid) if winline >= win_height - 1 then return 0 end return winline end @@ -2158,7 +2154,7 @@ function Sidebar:show_input_hint() local hint_text = (fn.mode() ~= "i" and Config.mappings.submit.normal or Config.mappings.submit.insert) .. ": submit" if Config.behaviour.enable_token_counting then - local input_value = table.concat(api.nvim_buf_get_lines(self.input_container.bufnr, 0, -1, false), "\n") + local input_value = table.concat(api.nvim_buf_get_lines(self.containers.input.bufnr, 0, -1, false), "\n") if self.token_count == nil then self:initialize_token_count() end local tokens = self.token_count + Utils.tokens.calculate_tokens(input_value) hint_text = "Tokens: " .. tostring(tokens) .. "; " .. hint_text @@ -2169,13 +2165,13 @@ function Sidebar:show_input_hint() api.nvim_buf_set_extmark(buf, INPUT_HINT_NAMESPACE, 0, 0, { hl_group = "AvantePopupHint", end_col = #hint_text }) -- Get the current window size - local win_width = api.nvim_win_get_width(self.input_container.winid) + local win_width = api.nvim_win_get_width(self.containers.input.winid) local width = #hint_text -- Create the floating window self.input_hint_window = api.nvim_open_win(buf, false, { relative = "win", - win = self.input_container.winid, + win = self.containers.input.winid, width = width, height = 1, row = self:get_input_float_window_row(), @@ -2188,15 +2184,15 @@ function Sidebar:show_input_hint() end function Sidebar:close_selected_files_hint() - if self.selected_files_container and api.nvim_win_is_valid(self.selected_files_container.winid) then - pcall(api.nvim_buf_clear_namespace, self.selected_files_container.bufnr, SELECTED_FILES_HINT_NAMESPACE, 0, -1) + if self.containers.selected_files and api.nvim_win_is_valid(self.containers.selected_files.winid) then + pcall(api.nvim_buf_clear_namespace, self.containers.selected_files.bufnr, SELECTED_FILES_HINT_NAMESPACE, 0, -1) end end function Sidebar:show_selected_files_hint() self:close_selected_files_hint() - local cursor_pos = api.nvim_win_get_cursor(self.selected_files_container.winid) + local cursor_pos = api.nvim_win_get_cursor(self.containers.selected_files.winid) local line_number = cursor_pos[1] local col_number = cursor_pos[2] @@ -2210,7 +2206,7 @@ function Sidebar:show_selected_files_hint() end api.nvim_buf_set_extmark( - self.selected_files_container.bufnr, + self.containers.selected_files.bufnr, SELECTED_FILES_HINT_NAMESPACE, line_number - 1, col_number, @@ -2384,7 +2380,7 @@ function Sidebar:initialize_token_count() end function Sidebar:create_input_container() - if self.input_container then self.input_container:unmount() end + if self.containers.input then self.containers.input:unmount() end if not self.code.bufnr or not api.nvim_buf_is_valid(self.code.bufnr) then return end @@ -2468,9 +2464,9 @@ function Sidebar:create_input_container() vim.cmd("normal! G") end - vim.keymap.set("n", "j", on_j, { buffer = self.result_container.bufnr }) - vim.keymap.set("n", "k", on_k, { buffer = self.result_container.bufnr }) - vim.keymap.set("n", "G", on_G, { buffer = self.result_container.bufnr }) + vim.keymap.set("n", "j", on_j, { buffer = self.containers.result.bufnr }) + vim.keymap.set("n", "k", on_k, { buffer = self.containers.result.bufnr }) + vim.keymap.set("n", "G", on_G, { buffer = self.containers.result.bufnr }) ---@type AvanteLLMStartCallback local function on_start(_) end @@ -2538,9 +2534,9 @@ function Sidebar:create_input_container() pcall(function() ---remove keymaps - vim.keymap.del("n", "j", { buffer = self.result_container.bufnr }) - vim.keymap.del("n", "k", { buffer = self.result_container.bufnr }) - vim.keymap.del("n", "G", { buffer = self.result_container.bufnr }) + vim.keymap.del("n", "j", { buffer = self.containers.result.bufnr }) + vim.keymap.del("n", "k", { buffer = self.containers.result.bufnr }) + vim.keymap.del("n", "G", { buffer = self.containers.result.bufnr }) end) if stop_opts.error ~= nil then @@ -2565,8 +2561,10 @@ function Sidebar:create_input_container() }) vim.defer_fn(function() - if Utils.is_valid_container(self.result_container, true) and Config.behaviour.jump_result_buffer_on_finish then - api.nvim_set_current_win(self.result_container.winid) + if + Utils.is_valid_container(self.containers.result, true) and Config.behaviour.jump_result_buffer_on_finish + then + api.nvim_set_current_win(self.containers.result.winid) end if Config.behaviour.auto_apply_diff_after_generation then self:apply(false) end end, 0) @@ -2653,15 +2651,15 @@ function Sidebar:create_input_container() return { width = "40%", - height = math.max(1, api.nvim_win_get_height(self.result_container.winid) - selected_code_container_height), + height = math.max(1, api.nvim_win_get_height(self.containers.result.winid) - selected_code_container_height), } end - self.input_container = Split({ + self.containers.input = Split({ enter = false, relative = { type = "win", - winid = self.result_container.winid, + winid = self.containers.result.winid, }, buf_options = { swapfile = false, @@ -2677,18 +2675,18 @@ function Sidebar:create_input_container() Utils.warn("Sending message to fast!, API key is not yet set", { title = "Avante" }) return end - if not Utils.is_valid_container(self.input_container) then return end - local lines = api.nvim_buf_get_lines(self.input_container.bufnr, 0, -1, false) + if not Utils.is_valid_container(self.containers.input) then return end + local lines = api.nvim_buf_get_lines(self.containers.input.bufnr, 0, -1, false) local request = table.concat(lines, "\n") if request == "" then return end - api.nvim_buf_set_lines(self.input_container.bufnr, 0, -1, false, {}) - api.nvim_win_set_cursor(self.input_container.winid, { 1, 0 }) + api.nvim_buf_set_lines(self.containers.input.bufnr, 0, -1, false, {}) + api.nvim_win_set_cursor(self.containers.input.winid, { 1, 0 }) handle_submit(request) end self.handle_submit = handle_submit - self.input_container:mount() + self.containers.input:mount() local function place_sign_at_first_line(bufnr) local group = "avante_input_prompt_group" @@ -2698,67 +2696,67 @@ function Sidebar:create_input_container() fn.sign_place(0, group, "AvanteInputPromptSign", bufnr, { lnum = 1 }) end - place_sign_at_first_line(self.input_container.bufnr) + place_sign_at_first_line(self.containers.input.bufnr) if Utils.in_visual_mode() then -- Exit visual mode vim.cmd("noautocmd stopinsert") end - self.input_container:map("n", Config.mappings.submit.normal, on_submit) - self.input_container:map("i", Config.mappings.submit.insert, on_submit) - self.input_container:map("n", Config.prompt_logger.next_prompt.normal, PromptLogger.on_log_retrieve(-1)) - self.input_container:map("i", Config.prompt_logger.next_prompt.insert, PromptLogger.on_log_retrieve(-1)) - self.input_container:map("n", Config.prompt_logger.prev_prompt.normal, PromptLogger.on_log_retrieve(1)) - self.input_container:map("i", Config.prompt_logger.prev_prompt.insert, PromptLogger.on_log_retrieve(1)) + self.containers.input:map("n", Config.mappings.submit.normal, on_submit) + self.containers.input:map("i", Config.mappings.submit.insert, on_submit) + self.containers.input:map("n", Config.prompt_logger.next_prompt.normal, PromptLogger.on_log_retrieve(-1)) + self.containers.input:map("i", Config.prompt_logger.next_prompt.insert, PromptLogger.on_log_retrieve(-1)) + self.containers.input:map("n", Config.prompt_logger.prev_prompt.normal, PromptLogger.on_log_retrieve(1)) + self.containers.input:map("i", Config.prompt_logger.prev_prompt.insert, PromptLogger.on_log_retrieve(1)) if Config.mappings.sidebar.close_from_input ~= nil then if Config.mappings.sidebar.close_from_input.normal ~= nil then - self.input_container:map("n", Config.mappings.sidebar.close_from_input.normal, function() self:shutdown() end) + self.containers.input:map("n", Config.mappings.sidebar.close_from_input.normal, function() self:shutdown() end) end if Config.mappings.sidebar.close_from_input.insert ~= nil then - self.input_container:map("i", Config.mappings.sidebar.close_from_input.insert, function() self:shutdown() end) + self.containers.input:map("i", Config.mappings.sidebar.close_from_input.insert, function() self:shutdown() end) end end - api.nvim_set_option_value("filetype", "AvanteInput", { buf = self.input_container.bufnr }) + api.nvim_set_option_value("filetype", "AvanteInput", { buf = self.containers.input.bufnr }) -- Setup completion api.nvim_create_autocmd("InsertEnter", { group = self.augroup, - buffer = self.input_container.bufnr, + buffer = self.containers.input.bufnr, once = true, desc = "Setup the completion of helpers in the input buffer", callback = function() end, }) local debounced_show_input_hint = Utils.debounce(function() - if vim.api.nvim_win_is_valid(self.input_container.winid) then self:show_input_hint() end + if vim.api.nvim_win_is_valid(self.containers.input.winid) then self:show_input_hint() end end, 200) api.nvim_create_autocmd({ "TextChanged", "TextChangedI", "VimResized" }, { group = self.augroup, - buffer = self.input_container.bufnr, + buffer = self.containers.input.bufnr, callback = function() debounced_show_input_hint() - place_sign_at_first_line(self.input_container.bufnr) + place_sign_at_first_line(self.containers.input.bufnr) end, }) api.nvim_create_autocmd("QuitPre", { group = self.augroup, - buffer = self.input_container.bufnr, + buffer = self.containers.input.bufnr, callback = function() self:close_input_hint() end, }) api.nvim_create_autocmd("WinClosed", { group = self.augroup, - pattern = tostring(self.input_container.winid), + pattern = tostring(self.containers.input.winid), callback = function() self:close_input_hint() end, }) api.nvim_create_autocmd("BufEnter", { group = self.augroup, - buffer = self.input_container.bufnr, + buffer = self.containers.input.bufnr, callback = function() if Config.windows.ask.start_insert then vim.cmd("noautocmd startinsert!") end end, @@ -2766,7 +2764,7 @@ function Sidebar:create_input_container() api.nvim_create_autocmd("BufLeave", { group = self.augroup, - buffer = self.input_container.bufnr, + buffer = self.containers.input.bufnr, callback = function() vim.cmd("noautocmd stopinsert") self:close_input_hint() @@ -2776,7 +2774,7 @@ function Sidebar:create_input_container() -- Update hint on mode change as submit key sequence may be different api.nvim_create_autocmd("ModeChanged", { group = self.augroup, - buffer = self.input_container.bufnr, + buffer = self.containers.input.bufnr, callback = function() self:show_input_hint() end, }) @@ -2784,7 +2782,7 @@ function Sidebar:create_input_container() group = self.augroup, callback = function() local cur_win = api.nvim_get_current_win() - if self.input_container and cur_win == self.input_container.winid then + if self.containers.input and cur_win == self.containers.input.winid then self:show_input_hint() else self:close_input_hint() @@ -2805,15 +2803,15 @@ end ---@param value string function Sidebar:set_input_value(value) - if not self.input_container then return end + if not self.containers.input then return end if not value then return end - api.nvim_buf_set_lines(self.input_container.bufnr, 0, -1, false, vim.split(value, "\n")) + api.nvim_buf_set_lines(self.containers.input.bufnr, 0, -1, false, vim.split(value, "\n")) end ---@return string function Sidebar:get_input_value() - if not self.input_container then return "" end - local lines = api.nvim_buf_get_lines(self.input_container.bufnr, 0, -1, false) + if not self.containers.input then return "" end + local lines = api.nvim_buf_get_lines(self.containers.input.bufnr, 0, -1, false) return table.concat(lines, "\n") end @@ -2864,8 +2862,8 @@ function Sidebar:adjust_result_container_layout() 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.containers.result.winid, width) + api.nvim_win_set_height(self.containers.result.winid, height) end ---@param opts AskOptions @@ -2876,7 +2874,7 @@ function Sidebar:render(opts) return (opts and opts.win and opts.win.position) and opts.win.position or calculate_config_window_position() end - self.result_container = Split({ + self.containers.result = Split({ enter = false, relative = "editor", position = get_position(), @@ -2897,15 +2895,16 @@ function Sidebar:render(opts) }, }) - self.result_container:mount() + self.containers.result:mount() - self.augroup = api.nvim_create_augroup("avante_sidebar_" .. self.id .. self.result_container.winid, { clear = true }) + self.augroup = + api.nvim_create_augroup("avante_sidebar_" .. self.id .. self.containers.result.winid, { clear = true }) - self.result_container:on(event.BufWinEnter, function() - xpcall(function() api.nvim_buf_set_name(self.result_container.bufnr, RESULT_BUF_NAME) end, function(_) end) + self.containers.result:on(event.BufWinEnter, function() + xpcall(function() api.nvim_buf_set_name(self.containers.result.bufnr, RESULT_BUF_NAME) end, function(_) end) end) - self.result_container:map("n", Config.mappings.sidebar.close, function() self:shutdown() end) + self.containers.result:map("n", Config.mappings.sidebar.close, function() self:shutdown() end) self:create_input_container() @@ -2944,28 +2943,28 @@ function Sidebar:get_selected_files_container_height() end function Sidebar:adjust_selected_files_container_layout() - if not Utils.is_valid_container(self.selected_files_container, true) then return end + if not Utils.is_valid_container(self.containers.selected_files, true) then return end local win_height = self:get_selected_files_container_height() - api.nvim_win_set_height(self.selected_files_container.winid, win_height) + api.nvim_win_set_height(self.containers.selected_files.winid, win_height) end function Sidebar:adjust_selected_code_container_layout() - if not Utils.is_valid_container(self.selected_code_container, true) then return end + if not Utils.is_valid_container(self.containers.selected_code, true) then return end local win_height = self:get_selected_code_container_height() - api.nvim_win_set_height(self.selected_code_container.winid, win_height) + api.nvim_win_set_height(self.containers.selected_code.winid, win_height) end function Sidebar:adjust_todos_container_layout() - if not Utils.is_valid_container(self.todos_container, true) then return end + if not Utils.is_valid_container(self.containers.todos, true) then return end local win_height = self:get_todos_container_height() - api.nvim_win_set_height(self.todos_container.winid, win_height) + api.nvim_win_set_height(self.containers.todos.winid, win_height) end function Sidebar:create_selected_files_container() - if self.selected_files_container then self.selected_files_container:unmount() end + if self.containers.selected_files then self.containers.selected_files:unmount() end local selected_filepaths = self.file_selector:get_selected_filepaths() if #selected_filepaths == 0 then @@ -2974,11 +2973,11 @@ function Sidebar:create_selected_files_container() return end - self.selected_files_container = Split({ + self.containers.selected_files = Split({ enter = false, relative = { type = "win", - winid = self.input_container.winid, + winid = self.containers.input.winid, }, buf_options = vim.tbl_deep_extend("force", buf_options, { modifiable = false, @@ -2996,23 +2995,23 @@ function Sidebar:create_selected_files_container() }, }) - self.selected_files_container:mount() + self.containers.selected_files:mount() local function render() local selected_filepaths_ = self.file_selector:get_selected_filepaths() if #selected_filepaths_ == 0 then - if Utils.is_valid_container(self.selected_files_container) then - self.selected_files_container:unmount() + if Utils.is_valid_container(self.containers.selected_files) then + self.containers.selected_files:unmount() self:refresh_winids() end return end - if not Utils.is_valid_container(self.selected_files_container, true) then + if not Utils.is_valid_container(self.containers.selected_files, true) then self:create_selected_files_container() self:refresh_winids() - if not Utils.is_valid_container(self.selected_files_container, true) then + if not Utils.is_valid_container(self.containers.selected_files, true) then Utils.warn("Failed to create or find selected files container window.") return end @@ -3031,7 +3030,7 @@ function Sidebar:create_selected_files_container() end local selected_files_count = #lines_to_set ---@type integer - local selected_files_buf = api.nvim_win_get_buf(self.selected_files_container.winid) + local selected_files_buf = api.nvim_win_get_buf(self.containers.selected_files.winid) Utils.unlock_buf(selected_files_buf) api.nvim_buf_clear_namespace(selected_files_buf, SELECTED_FILES_ICON_NAMESPACE, 0, -1) api.nvim_buf_set_lines(selected_files_buf, 0, -1, true, lines_to_set) @@ -3048,9 +3047,9 @@ function Sidebar:create_selected_files_container() Utils.lock_buf(selected_files_buf) local win_height = self:get_selected_files_container_height() - api.nvim_win_set_height(self.selected_files_container.winid, win_height) + api.nvim_win_set_height(self.containers.selected_files.winid, win_height) self:render_header( - self.selected_files_container.winid, + self.containers.selected_files.winid, selected_files_buf, string.format( "%sSelected (%d file%s)", @@ -3069,12 +3068,12 @@ function Sidebar:create_selected_files_container() local function remove_file(line_number) self.file_selector:remove_selected_filepaths_with_index(line_number) end -- Set up keybinding to remove files - self.selected_files_container:map("n", Config.mappings.sidebar.remove_file, function() - local line_number = api.nvim_win_get_cursor(self.selected_files_container.winid)[1] + self.containers.selected_files:map("n", Config.mappings.sidebar.remove_file, function() + local line_number = api.nvim_win_get_cursor(self.containers.selected_files.winid)[1] remove_file(line_number) end, { noremap = true, silent = true }) - self.selected_files_container:map("x", Config.mappings.sidebar.remove_file, function() + self.containers.selected_files:map("x", Config.mappings.sidebar.remove_file, function() vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes("", true, false, true), "n", false) local start_line = math.min(vim.fn.line("v"), vim.fn.line(".")) local end_line = math.max(vim.fn.line("v"), vim.fn.line(".")) @@ -3083,7 +3082,7 @@ function Sidebar:create_selected_files_container() end end, { noremap = true, silent = true }) - self.selected_files_container:map( + self.containers.selected_files:map( "n", Config.mappings.sidebar.add_file, function() self.file_selector:open() end, @@ -3091,10 +3090,10 @@ function Sidebar:create_selected_files_container() ) -- Set up autocmd to show hint on cursor move - self.selected_files_container:on({ event.CursorMoved }, function() self:show_selected_files_hint() end, {}) + self.containers.selected_files:on({ event.CursorMoved }, function() self:show_selected_files_hint() end, {}) -- Clear hint when leaving the window - self.selected_files_container:on(event.BufLeave, function() self:close_selected_files_hint() end, {}) + self.containers.selected_files:on(event.BufLeave, function() self:close_selected_files_hint() end, {}) render() end @@ -3102,18 +3101,18 @@ end function Sidebar:create_todos_container() local history = Path.history.load(self.code.bufnr) if not history or not history.todos or #history.todos == 0 then - if self.todos_container then self.todos_container:unmount() end - self.todos_container = nil + if self.containers.todos then self.containers.todos:unmount() end + self.containers.todos = nil self:adjust_layout() self:refresh_winids() return end - if not Utils.is_valid_container(self.todos_container, true) then - self.todos_container = Split({ + if not Utils.is_valid_container(self.containers.todos, true) then + self.containers.todos = Split({ enter = false, relative = { type = "win", - winid = self.input_container.winid, + winid = self.containers.input.winid, }, buf_options = vim.tbl_deep_extend("force", buf_options, { modifiable = false, @@ -3130,7 +3129,7 @@ function Sidebar:create_todos_container() height = 3, }, }) - self.todos_container:mount() + self.containers.todos:mount() end local done_count = 0 local total_count = #history.todos @@ -3149,13 +3148,13 @@ function Sidebar:create_todos_container() table.insert(todos_content_lines, line) end if focused_idx > #todos_content_lines then focused_idx = #todos_content_lines end - local todos_buf = api.nvim_win_get_buf(self.todos_container.winid) + local todos_buf = api.nvim_win_get_buf(self.containers.todos.winid) Utils.unlock_buf(todos_buf) api.nvim_buf_set_lines(todos_buf, 0, -1, false, todos_content_lines) - api.nvim_win_set_cursor(self.todos_container.winid, { focused_idx, 0 }) + api.nvim_win_set_cursor(self.containers.todos.winid, { focused_idx, 0 }) Utils.lock_buf(todos_buf) self:render_header( - self.todos_container.winid, + self.containers.todos.winid, todos_buf, Utils.icon(" ") .. "Todos" .. " (" .. done_count .. "/" .. total_count .. ")", Highlights.SUBTITLE, diff --git a/lua/cmp_avante/commands.lua b/lua/cmp_avante/commands.lua index 2c48c05..dfe99a3 100644 --- a/lua/cmp_avante/commands.lua +++ b/lua/cmp_avante/commands.lua @@ -51,7 +51,7 @@ function CommandsSource:execute(item, callback) local sidebar = require("avante").get() command.callback(sidebar, nil, function() - local bufnr = sidebar.input_container.bufnr ---@type integer + local bufnr = sidebar.containers.input.bufnr ---@type integer local content = table.concat(api.nvim_buf_get_lines(bufnr, 0, -1, false), "\n") vim.defer_fn(function()