refactor: reduce split windows (#143)
This commit is contained in:
		
							parent
							
								
									45a47075e5
								
							
						
					
					
						commit
						a08a5b8dc1
					
				
							
								
								
									
										93
									
								
								lua/avante/floating_window.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								lua/avante/floating_window.lua
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,93 @@
 | 
				
			|||||||
 | 
					---@class FloatingWindow
 | 
				
			||||||
 | 
					---@field enter boolean | nil
 | 
				
			||||||
 | 
					---@field winid integer | nil
 | 
				
			||||||
 | 
					---@field bufnr integer | nil
 | 
				
			||||||
 | 
					---@field buf_options table | nil
 | 
				
			||||||
 | 
					---@field win_options table | nil
 | 
				
			||||||
 | 
					---@field float_options table | nil
 | 
				
			||||||
 | 
					local FloatingWindow = {}
 | 
				
			||||||
 | 
					FloatingWindow.__index = FloatingWindow
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					setmetatable(FloatingWindow, {
 | 
				
			||||||
 | 
					  __call = function(cls, ...)
 | 
				
			||||||
 | 
					    return cls.new(...)
 | 
				
			||||||
 | 
					  end,
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					---@class opts
 | 
				
			||||||
 | 
					---@field enter? boolean
 | 
				
			||||||
 | 
					---@field buf_options? table<string, any>
 | 
				
			||||||
 | 
					---@field win_options? table<string, any>
 | 
				
			||||||
 | 
					---@field float_options? table<string, any>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					---@param opts opts
 | 
				
			||||||
 | 
					---@return FloatingWindow
 | 
				
			||||||
 | 
					function FloatingWindow.new(opts)
 | 
				
			||||||
 | 
					  local instance = setmetatable({}, FloatingWindow)
 | 
				
			||||||
 | 
					  instance.winid = nil
 | 
				
			||||||
 | 
					  instance.bufnr = nil
 | 
				
			||||||
 | 
					  instance.enter = opts.enter or true
 | 
				
			||||||
 | 
					  instance.buf_options = opts.buf_options or {}
 | 
				
			||||||
 | 
					  instance.win_options = opts.win_options or {}
 | 
				
			||||||
 | 
					  instance.float_options = opts.float_options or {}
 | 
				
			||||||
 | 
					  return instance
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					---@return nil
 | 
				
			||||||
 | 
					function FloatingWindow:mount()
 | 
				
			||||||
 | 
					  self.bufnr = vim.api.nvim_create_buf(false, true)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  for option, value in pairs(self.buf_options) do
 | 
				
			||||||
 | 
					    vim.api.nvim_set_option_value(option, value, { buf = self.bufnr })
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  self.winid = vim.api.nvim_open_win(self.bufnr, self.enter, self.float_options)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  for option, value in pairs(self.win_options) do
 | 
				
			||||||
 | 
					    vim.api.nvim_set_option_value(option, value, { win = self.winid })
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					---@return nil
 | 
				
			||||||
 | 
					function FloatingWindow:unmount()
 | 
				
			||||||
 | 
					  if self.bufnr and vim.api.nvim_buf_is_valid(self.bufnr) then
 | 
				
			||||||
 | 
					    vim.api.nvim_buf_delete(self.bufnr, { force = true })
 | 
				
			||||||
 | 
					    self.bufnr = nil
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if self.winid and vim.api.nvim_win_is_valid(self.winid) then
 | 
				
			||||||
 | 
					    vim.api.nvim_win_close(self.winid, true)
 | 
				
			||||||
 | 
					    self.winid = nil
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					---@param event string | string[]
 | 
				
			||||||
 | 
					---@param handler string | function
 | 
				
			||||||
 | 
					---@param options? table<"'once'" | "'nested'", boolean>
 | 
				
			||||||
 | 
					---@return nil
 | 
				
			||||||
 | 
					function FloatingWindow:on(event, handler, options)
 | 
				
			||||||
 | 
					  vim.api.nvim_create_autocmd(event, {
 | 
				
			||||||
 | 
					    buffer = self.bufnr,
 | 
				
			||||||
 | 
					    callback = handler,
 | 
				
			||||||
 | 
					    once = options and options["once"] or false,
 | 
				
			||||||
 | 
					    nested = options and options["nested"] or false,
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					---@param mode string check `:h :map-modes`
 | 
				
			||||||
 | 
					---@param key string|string[] key for the mapping
 | 
				
			||||||
 | 
					---@param handler string | fun(): nil handler for the mapping
 | 
				
			||||||
 | 
					---@param opts? table<"'expr'"|"'noremap'"|"'nowait'"|"'remap'"|"'script'"|"'silent'"|"'unique'", boolean>
 | 
				
			||||||
 | 
					---@return nil
 | 
				
			||||||
 | 
					function FloatingWindow:map(mode, key, handler, opts)
 | 
				
			||||||
 | 
					  local options = opts or {}
 | 
				
			||||||
 | 
					  if type(key) == "string" then
 | 
				
			||||||
 | 
					    vim.keymap.set(mode, key, handler, options)
 | 
				
			||||||
 | 
					    return
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					  for _, key_ in ipairs(key) do
 | 
				
			||||||
 | 
					    vim.keymap.set(mode, key_, handler, options)
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					return FloatingWindow
 | 
				
			||||||
@ -11,6 +11,7 @@ local Diff = require("avante.diff")
 | 
				
			|||||||
local Llm = require("avante.llm")
 | 
					local Llm = require("avante.llm")
 | 
				
			||||||
local Utils = require("avante.utils")
 | 
					local Utils = require("avante.utils")
 | 
				
			||||||
local Highlights = require("avante.highlights")
 | 
					local Highlights = require("avante.highlights")
 | 
				
			||||||
 | 
					local FloatingWindow = require("avante.floating_window")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
local RESULT_BUF_NAME = "AVANTE_RESULT"
 | 
					local RESULT_BUF_NAME = "AVANTE_RESULT"
 | 
				
			||||||
local VIEW_BUFFER_UPDATED_PATTERN = "AvanteViewBufferUpdated"
 | 
					local VIEW_BUFFER_UPDATED_PATTERN = "AvanteViewBufferUpdated"
 | 
				
			||||||
@ -29,27 +30,31 @@ local Sidebar = {}
 | 
				
			|||||||
---@field id integer
 | 
					---@field id integer
 | 
				
			||||||
---@field augroup integer
 | 
					---@field augroup integer
 | 
				
			||||||
---@field code avante.CodeState
 | 
					---@field code avante.CodeState
 | 
				
			||||||
---@field winids table<string, integer> this table stores the winids of the sidebar components (header, result, selected_code, input, input_placeholder), even though they are destroyed.
 | 
					---@field winids table<string, integer> this table stores the winids of the sidebar components (result_container, result, selected_code_container, selected_code, input_container, input), even though they are destroyed.
 | 
				
			||||||
---@field header NuiSplit | nil
 | 
					---@field result_container NuiSplit | nil
 | 
				
			||||||
---@field result NuiSplit | nil
 | 
					---@field result NuiSplit | nil
 | 
				
			||||||
---@field selected_code_header NuiSplit | nil
 | 
					---@field selected_code_container NuiSplit | nil
 | 
				
			||||||
---@field selected_code NuiSplit | nil
 | 
					---@field selected_code NuiSplit | nil
 | 
				
			||||||
---@field input_header NuiSplit | nil
 | 
					---@field input_container NuiSplit | nil
 | 
				
			||||||
---@field input NuiSplit | nil
 | 
					---@field input NuiSplit | nil
 | 
				
			||||||
---@field input_placeholder NuiSplit | nil
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
---@param id integer the tabpage id retrieved from vim.api.nvim_get_current_tabpage()
 | 
					---@param id integer the tabpage id retrieved from vim.api.nvim_get_current_tabpage()
 | 
				
			||||||
function Sidebar:new(id)
 | 
					function Sidebar:new(id)
 | 
				
			||||||
  return setmetatable({
 | 
					  return setmetatable({
 | 
				
			||||||
    id = id,
 | 
					    id = id,
 | 
				
			||||||
    code = { bufnr = 0, winid = 0, selection = nil },
 | 
					    code = { bufnr = 0, winid = 0, selection = nil },
 | 
				
			||||||
    winids = { header = 0, result = 0, selected_code_header = 0, selected_code = 0, input = 0, input_placeholder = 0 },
 | 
					    winids = {
 | 
				
			||||||
 | 
					      result_container = 0,
 | 
				
			||||||
 | 
					      result = 0,
 | 
				
			||||||
 | 
					      selected_code_container = 0,
 | 
				
			||||||
 | 
					      selected_code = 0,
 | 
				
			||||||
 | 
					      input = 0,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    result = nil,
 | 
					    result = nil,
 | 
				
			||||||
    selected_code_header = nil,
 | 
					    selected_code_container = nil,
 | 
				
			||||||
    selected_code = nil,
 | 
					    selected_code = nil,
 | 
				
			||||||
    input_header = nil,
 | 
					    input_container = nil,
 | 
				
			||||||
    input = nil,
 | 
					    input = nil,
 | 
				
			||||||
    input_placeholder = nil,
 | 
					 | 
				
			||||||
  }, { __index = self })
 | 
					  }, { __index = self })
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -68,14 +73,13 @@ end
 | 
				
			|||||||
function Sidebar:reset()
 | 
					function Sidebar:reset()
 | 
				
			||||||
  self:delete_autocmds()
 | 
					  self:delete_autocmds()
 | 
				
			||||||
  self.code = { bufnr = 0, winid = 0, selection = nil }
 | 
					  self.code = { bufnr = 0, winid = 0, selection = nil }
 | 
				
			||||||
  self.winids = { header = 0, result = 0, selected_code = 0, input = 0, input_placeholder = 0 }
 | 
					  self.winids = { result_container = 0, result = 0, selected_code = 0, input = 0 }
 | 
				
			||||||
  self.header = nil
 | 
					  self.result_container = nil
 | 
				
			||||||
  self.result = nil
 | 
					  self.result = nil
 | 
				
			||||||
  self.selected_code_header = nil
 | 
					  self.selected_code_container = nil
 | 
				
			||||||
  self.selected_code = nil
 | 
					  self.selected_code = nil
 | 
				
			||||||
  self.input_header = nil
 | 
					  self.input_container = nil
 | 
				
			||||||
  self.input = nil
 | 
					  self.input = nil
 | 
				
			||||||
  self.input_placeholder = nil
 | 
					 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function Sidebar:open()
 | 
					function Sidebar:open()
 | 
				
			||||||
@ -326,7 +330,7 @@ local function get_win_options()
 | 
				
			|||||||
  return base_win_options
 | 
					  return base_win_options
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function Sidebar:do_render_header(winid, bufnr, header_text, hl, reverse_hl)
 | 
					function Sidebar:render_header(winid, bufnr, header_text, hl, reverse_hl)
 | 
				
			||||||
  if not bufnr or not api.nvim_buf_is_valid(bufnr) then
 | 
					  if not bufnr or not api.nvim_buf_is_valid(bufnr) then
 | 
				
			||||||
    return
 | 
					    return
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
@ -380,16 +384,30 @@ function Sidebar:do_render_header(winid, bufnr, header_text, hl, reverse_hl)
 | 
				
			|||||||
  Utils.lock_buf(bufnr)
 | 
					  Utils.lock_buf(bufnr)
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function Sidebar:render_header()
 | 
					function Sidebar:render_result_container()
 | 
				
			||||||
  if not self.header or not self.header.bufnr or not api.nvim_buf_is_valid(self.header.bufnr) then
 | 
					  if
 | 
				
			||||||
 | 
					    not self.result_container
 | 
				
			||||||
 | 
					    or not self.result_container.bufnr
 | 
				
			||||||
 | 
					    or not api.nvim_buf_is_valid(self.result_container.bufnr)
 | 
				
			||||||
 | 
					  then
 | 
				
			||||||
    return
 | 
					    return
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
  local header_text = " Avante"
 | 
					  local header_text = " Avante"
 | 
				
			||||||
  self:do_render_header(self.header.winid, self.header.bufnr, header_text, Highlights.TITLE, Highlights.REVERSED_TITLE)
 | 
					  self:render_header(
 | 
				
			||||||
 | 
					    self.result_container.winid,
 | 
				
			||||||
 | 
					    self.result_container.bufnr,
 | 
				
			||||||
 | 
					    header_text,
 | 
				
			||||||
 | 
					    Highlights.TITLE,
 | 
				
			||||||
 | 
					    Highlights.REVERSED_TITLE
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function Sidebar:render_input_header()
 | 
					function Sidebar:render_input_container()
 | 
				
			||||||
  if not self.input_header or not self.input_header.bufnr or not api.nvim_buf_is_valid(self.input_header.bufnr) then
 | 
					  if
 | 
				
			||||||
 | 
					    not self.input_container
 | 
				
			||||||
 | 
					    or not self.input_container.bufnr
 | 
				
			||||||
 | 
					    or not api.nvim_buf_is_valid(self.input_container.bufnr)
 | 
				
			||||||
 | 
					  then
 | 
				
			||||||
    return
 | 
					    return
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -409,20 +427,20 @@ function Sidebar:render_input_header()
 | 
				
			|||||||
    )
 | 
					    )
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  self:do_render_header(
 | 
					  self:render_header(
 | 
				
			||||||
    self.input_header.winid,
 | 
					    self.input_container.winid,
 | 
				
			||||||
    self.input_header.bufnr,
 | 
					    self.input_container.bufnr,
 | 
				
			||||||
    header_text,
 | 
					    header_text,
 | 
				
			||||||
    Highlights.THRIDTITLE,
 | 
					    Highlights.THRIDTITLE,
 | 
				
			||||||
    Highlights.REVERSED_THRIDTITLE
 | 
					    Highlights.REVERSED_THRIDTITLE
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function Sidebar:render_selected_code_header()
 | 
					function Sidebar:render_selected_code_container()
 | 
				
			||||||
  if
 | 
					  if
 | 
				
			||||||
    not self.selected_code_header
 | 
					    not self.selected_code_container
 | 
				
			||||||
    or not self.selected_code_header.bufnr
 | 
					    or not self.selected_code_container.bufnr
 | 
				
			||||||
    or not api.nvim_buf_is_valid(self.selected_code_header.bufnr)
 | 
					    or not api.nvim_buf_is_valid(self.selected_code_container.bufnr)
 | 
				
			||||||
  then
 | 
					  then
 | 
				
			||||||
    return
 | 
					    return
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
@ -442,9 +460,9 @@ function Sidebar:render_selected_code_header()
 | 
				
			|||||||
      or ""
 | 
					      or ""
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  self:do_render_header(
 | 
					  self:render_header(
 | 
				
			||||||
    self.selected_code_header.winid,
 | 
					    self.selected_code_container.winid,
 | 
				
			||||||
    self.selected_code_header.bufnr,
 | 
					    self.selected_code_container.bufnr,
 | 
				
			||||||
    header_text,
 | 
					    header_text,
 | 
				
			||||||
    Highlights.SUBTITLE,
 | 
					    Highlights.SUBTITLE,
 | 
				
			||||||
    Highlights.REVERSED_SUBTITLE
 | 
					    Highlights.REVERSED_SUBTITLE
 | 
				
			||||||
@ -517,9 +535,9 @@ function Sidebar:on_mount()
 | 
				
			|||||||
    end,
 | 
					    end,
 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  self:render_header()
 | 
					  self:render_result_container()
 | 
				
			||||||
  self:render_input_header()
 | 
					  self:render_input_container()
 | 
				
			||||||
  self:render_selected_code_header()
 | 
					  self:render_selected_code_container()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  -- api.nvim_set_option_value("buftype", "nofile", { buf = self.input.bufnr })
 | 
					  -- api.nvim_set_option_value("buftype", "nofile", { buf = self.input.bufnr })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -552,18 +570,6 @@ function Sidebar:on_mount()
 | 
				
			|||||||
    end,
 | 
					    end,
 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  api.nvim_create_autocmd("BufEnter", {
 | 
					 | 
				
			||||||
    group = self.augroup,
 | 
					 | 
				
			||||||
    buffer = self.input_placeholder.bufnr,
 | 
					 | 
				
			||||||
    callback = function()
 | 
					 | 
				
			||||||
      self:focus()
 | 
					 | 
				
			||||||
      if self.input and self.input.winid and api.nvim_win_is_valid(self.input.winid) then
 | 
					 | 
				
			||||||
        api.nvim_set_current_win(self.input.winid)
 | 
					 | 
				
			||||||
      end
 | 
					 | 
				
			||||||
      return true
 | 
					 | 
				
			||||||
    end,
 | 
					 | 
				
			||||||
  })
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  api.nvim_create_autocmd("VimResized", {
 | 
					  api.nvim_create_autocmd("VimResized", {
 | 
				
			||||||
    group = self.augroup,
 | 
					    group = self.augroup,
 | 
				
			||||||
    callback = function()
 | 
					    callback = function()
 | 
				
			||||||
@ -601,40 +607,12 @@ function Sidebar:on_mount()
 | 
				
			|||||||
    end,
 | 
					    end,
 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  api.nvim_create_autocmd("WinEnter", {
 | 
					 | 
				
			||||||
    group = self.augroup,
 | 
					 | 
				
			||||||
    callback = function()
 | 
					 | 
				
			||||||
      local current_win_id = vim.api.nvim_get_current_win()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      if not self.input_placeholder or current_win_id ~= self.input_placeholder.winid then
 | 
					 | 
				
			||||||
        return
 | 
					 | 
				
			||||||
      end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      if previous_winid == self.input.winid then
 | 
					 | 
				
			||||||
        if self.selected_code and self.selected_code.winid and api.nvim_win_is_valid(self.selected_code.winid) then
 | 
					 | 
				
			||||||
          api.nvim_set_current_win(self.selected_code.winid)
 | 
					 | 
				
			||||||
          return
 | 
					 | 
				
			||||||
        end
 | 
					 | 
				
			||||||
        if self.result and self.result.winid and api.nvim_win_is_valid(self.result.winid) then
 | 
					 | 
				
			||||||
          api.nvim_set_current_win(self.result.winid)
 | 
					 | 
				
			||||||
          return
 | 
					 | 
				
			||||||
        end
 | 
					 | 
				
			||||||
        return
 | 
					 | 
				
			||||||
      end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      if self.input.winid and api.nvim_win_is_valid(self.input.winid) then
 | 
					 | 
				
			||||||
        api.nvim_set_current_win(self.input.winid)
 | 
					 | 
				
			||||||
        return
 | 
					 | 
				
			||||||
      end
 | 
					 | 
				
			||||||
    end,
 | 
					 | 
				
			||||||
  })
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  api.nvim_create_autocmd("WinEnter", {
 | 
					  api.nvim_create_autocmd("WinEnter", {
 | 
				
			||||||
    group = self.augroup,
 | 
					    group = self.augroup,
 | 
				
			||||||
    callback = function()
 | 
					    callback = function()
 | 
				
			||||||
      local current_win_id = api.nvim_get_current_win()
 | 
					      local current_win_id = api.nvim_get_current_win()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if not self.header or current_win_id ~= self.header.winid then
 | 
					      if not self.result_container or current_win_id ~= self.result_container.winid then
 | 
				
			||||||
        return
 | 
					        return
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -655,7 +633,7 @@ function Sidebar:on_mount()
 | 
				
			|||||||
    callback = function()
 | 
					    callback = function()
 | 
				
			||||||
      local current_win_id = api.nvim_get_current_win()
 | 
					      local current_win_id = api.nvim_get_current_win()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if not self.input_header or current_win_id ~= self.input_header.winid then
 | 
					      if not self.input_container or current_win_id ~= self.input_container.winid then
 | 
				
			||||||
        return
 | 
					        return
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -682,7 +660,7 @@ function Sidebar:on_mount()
 | 
				
			|||||||
    callback = function()
 | 
					    callback = function()
 | 
				
			||||||
      local current_win_id = api.nvim_get_current_win()
 | 
					      local current_win_id = api.nvim_get_current_win()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if not self.selected_code_header or current_win_id ~= self.selected_code_header.winid then
 | 
					      if not self.selected_code_container or current_win_id ~= self.selected_code_container.winid then
 | 
				
			||||||
        return
 | 
					        return
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -722,14 +700,10 @@ function Sidebar:refresh_winids()
 | 
				
			|||||||
  if self.winids.input then
 | 
					  if self.winids.input then
 | 
				
			||||||
    table.insert(winids, self.winids.input)
 | 
					    table.insert(winids, self.winids.input)
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
  local current_winid = api.nvim_get_current_win()
 | 
					 | 
				
			||||||
  local current_idx = Utils.tbl_indexof(winids, current_winid)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  local function switch_windows()
 | 
					  local function switch_windows()
 | 
				
			||||||
    if current_idx == nil then
 | 
					    local current_winid = api.nvim_get_current_win()
 | 
				
			||||||
      current_winid = api.nvim_get_current_win()
 | 
					    local current_idx = Utils.tbl_indexof(winids, current_winid) or 1
 | 
				
			||||||
      current_idx = Utils.tbl_indexof(winids, current_winid) or 1
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
    if current_idx == #winids then
 | 
					    if current_idx == #winids then
 | 
				
			||||||
      current_idx = 1
 | 
					      current_idx = 1
 | 
				
			||||||
      api.nvim_set_current_win(winids[current_idx])
 | 
					      api.nvim_set_current_win(winids[current_idx])
 | 
				
			||||||
@ -740,10 +714,8 @@ function Sidebar:refresh_winids()
 | 
				
			|||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  local function reverse_switch_windows()
 | 
					  local function reverse_switch_windows()
 | 
				
			||||||
    if current_idx == nil then
 | 
					    local current_winid = api.nvim_get_current_win()
 | 
				
			||||||
      current_winid = api.nvim_get_current_win()
 | 
					    local current_idx = Utils.tbl_indexof(winids, current_winid) or 1
 | 
				
			||||||
      current_idx = Utils.tbl_indexof(winids, current_winid) or 1
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
    if current_idx == 1 then
 | 
					    if current_idx == 1 then
 | 
				
			||||||
      current_idx = #winids
 | 
					      current_idx = #winids
 | 
				
			||||||
      api.nvim_set_current_win(winids[current_idx])
 | 
					      api.nvim_set_current_win(winids[current_idx])
 | 
				
			||||||
@ -772,9 +744,9 @@ function Sidebar:resize()
 | 
				
			|||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
  self:create_input()
 | 
					  self:create_input()
 | 
				
			||||||
  self:render_header()
 | 
					  self:render_result_container()
 | 
				
			||||||
  self:render_input_header()
 | 
					  self:render_input_container()
 | 
				
			||||||
  self:render_selected_code_header()
 | 
					  self:render_selected_code_container()
 | 
				
			||||||
  vim.defer_fn(function()
 | 
					  vim.defer_fn(function()
 | 
				
			||||||
    vim.cmd("AvanteRefresh")
 | 
					    vim.cmd("AvanteRefresh")
 | 
				
			||||||
  end, 200)
 | 
					  end, 200)
 | 
				
			||||||
@ -1008,9 +980,9 @@ end
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
function Sidebar:create_input()
 | 
					function Sidebar:create_input()
 | 
				
			||||||
  if
 | 
					  if
 | 
				
			||||||
    self.input_placeholder == nil
 | 
					    not self.input_container
 | 
				
			||||||
    or self.input_placeholder.winid == nil
 | 
					    or not self.input_container.winid
 | 
				
			||||||
    or not api.nvim_win_is_valid(self.input_placeholder.winid)
 | 
					    or not api.nvim_win_is_valid(self.input_container.winid)
 | 
				
			||||||
  then
 | 
					  then
 | 
				
			||||||
    return
 | 
					    return
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
@ -1121,19 +1093,19 @@ function Sidebar:create_input()
 | 
				
			|||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  local win_width = api.nvim_win_get_width(self.input_placeholder.winid)
 | 
					  local win_width = api.nvim_win_get_width(self.input_container.winid)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  self.input = Input({
 | 
					  self.input = Input({
 | 
				
			||||||
    relative = {
 | 
					    relative = {
 | 
				
			||||||
      type = "win",
 | 
					      type = "win",
 | 
				
			||||||
      winid = self.input_placeholder.winid,
 | 
					      winid = self.input_container.winid,
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    position = {
 | 
					    position = {
 | 
				
			||||||
      row = 0,
 | 
					      row = 2,
 | 
				
			||||||
      col = 1,
 | 
					      col = 1,
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    size = {
 | 
					    size = {
 | 
				
			||||||
      height = 1,
 | 
					      height = 2,
 | 
				
			||||||
      width = win_width - 2, -- Subtract the width of the input box borders
 | 
					      width = win_width - 2, -- Subtract the width of the input box borders
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
  }, {
 | 
					  }, {
 | 
				
			||||||
@ -1162,33 +1134,79 @@ function Sidebar:get_selected_code_size()
 | 
				
			|||||||
  if self.code.selection ~= nil then
 | 
					  if self.code.selection ~= nil then
 | 
				
			||||||
    local selected_code_lines = vim.split(self.code.selection.content, "\n")
 | 
					    local selected_code_lines = vim.split(self.code.selection.content, "\n")
 | 
				
			||||||
    selected_code_lines_count = #selected_code_lines
 | 
					    selected_code_lines_count = #selected_code_lines
 | 
				
			||||||
    selected_code_size = math.min(selected_code_lines_count, selected_code_max_lines_count) + 2
 | 
					    selected_code_size = math.min(selected_code_lines_count, selected_code_max_lines_count) + 3
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return selected_code_size
 | 
					  return selected_code_size
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local function create_floating_window_for_split(split_winid, buf_opts, win_opts, float_opts)
 | 
				
			||||||
 | 
					  local height = vim.api.nvim_win_get_height(split_winid)
 | 
				
			||||||
 | 
					  local width = vim.api.nvim_win_get_width(split_winid)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  local float_opts_ = vim.tbl_deep_extend("force", {
 | 
				
			||||||
 | 
					    relative = "win",
 | 
				
			||||||
 | 
					    win = split_winid,
 | 
				
			||||||
 | 
					    width = math.max(width - 2, 0),
 | 
				
			||||||
 | 
					    height = math.max(height - 3, 0),
 | 
				
			||||||
 | 
					    row = 1,
 | 
				
			||||||
 | 
					    col = 0,
 | 
				
			||||||
 | 
					    style = "minimal",
 | 
				
			||||||
 | 
					    border = { " ", " ", " ", " ", " ", " ", " ", " " },
 | 
				
			||||||
 | 
					  }, float_opts or {})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  local win_opts_ = vim.tbl_deep_extend("force", get_win_options(), {
 | 
				
			||||||
 | 
					    winhighlight = "NormalFloat:Normal,FloatBorder:Normal",
 | 
				
			||||||
 | 
					  }, win_opts or {})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  local buf_opts_ = vim.tbl_deep_extend("force", buf_options, buf_opts or {})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  local floating_win = FloatingWindow({
 | 
				
			||||||
 | 
					    buf_options = buf_opts_,
 | 
				
			||||||
 | 
					    win_options = win_opts_,
 | 
				
			||||||
 | 
					    float_options = float_opts_,
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return floating_win
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function Sidebar:render()
 | 
					function Sidebar:render()
 | 
				
			||||||
  local chat_history = load_chat_history(self)
 | 
					  local chat_history = load_chat_history(self)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  local result_buf = api.nvim_create_buf(false, true)
 | 
					  local sidebar_height = api.nvim_win_get_height(self.code.winid)
 | 
				
			||||||
 | 
					  local selected_code_size = self:get_selected_code_size()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  api.nvim_set_option_value("filetype", "Avante", { buf = result_buf })
 | 
					  self.result_container = Split({
 | 
				
			||||||
  api.nvim_set_option_value("bufhidden", "wipe", { buf = result_buf })
 | 
					 | 
				
			||||||
  api.nvim_set_option_value("modifiable", false, { buf = result_buf })
 | 
					 | 
				
			||||||
  api.nvim_set_option_value("swapfile", false, { buf = result_buf })
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  self.result = Split({
 | 
					 | 
				
			||||||
    relative = "editor",
 | 
					    relative = "editor",
 | 
				
			||||||
    position = "right",
 | 
					    position = "right",
 | 
				
			||||||
    buf = result_buf,
 | 
					    buf_options = buf_options,
 | 
				
			||||||
    win_options = get_win_options(),
 | 
					    win_options = get_win_options(),
 | 
				
			||||||
    size = string.format("%d%%", Config.windows.width),
 | 
					    size = {
 | 
				
			||||||
 | 
					      height = math.max(0, sidebar_height - selected_code_size - 8),
 | 
				
			||||||
 | 
					      width = string.format("%d%%", Config.windows.width),
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  self.result_container:mount()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  self.result = create_floating_window_for_split(
 | 
				
			||||||
 | 
					    self.result_container.winid,
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      modifiable = false,
 | 
				
			||||||
 | 
					      swapfile = false,
 | 
				
			||||||
 | 
					      buftype = "nofile",
 | 
				
			||||||
 | 
					      bufhidden = "wipe",
 | 
				
			||||||
 | 
					      filetype = "Avante",
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    nil,
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      height = math.max(0, sidebar_height - selected_code_size - 8),
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  self.result:on(event.BufWinEnter, function()
 | 
					  self.result:on(event.BufWinEnter, function()
 | 
				
			||||||
    xpcall(function()
 | 
					    xpcall(function()
 | 
				
			||||||
      api.nvim_buf_set_name(result_buf, RESULT_BUF_NAME)
 | 
					      api.nvim_buf_set_name(self.result.bufnr, RESULT_BUF_NAME)
 | 
				
			||||||
    end, function(_) end)
 | 
					    end, function(_) end)
 | 
				
			||||||
  end)
 | 
					  end)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1204,47 +1222,21 @@ function Sidebar:render()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  self.result:mount()
 | 
					  self.result:mount()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  self.header = Split({
 | 
					  self.input_container = Split({
 | 
				
			||||||
    enter = false,
 | 
					    enter = false,
 | 
				
			||||||
    relative = {
 | 
					    relative = {
 | 
				
			||||||
      type = "win",
 | 
					      type = "win",
 | 
				
			||||||
      winid = self.result.winid,
 | 
					      winid = self.result_container.winid,
 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    buf_options = buf_options,
 | 
					 | 
				
			||||||
    win_options = get_win_options(),
 | 
					 | 
				
			||||||
    position = "top",
 | 
					 | 
				
			||||||
    size = 1,
 | 
					 | 
				
			||||||
  })
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  self.header:mount()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  self.input_placeholder = Split({
 | 
					 | 
				
			||||||
    enter = false,
 | 
					 | 
				
			||||||
    relative = {
 | 
					 | 
				
			||||||
      type = "win",
 | 
					 | 
				
			||||||
      winid = self.result.winid,
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    buf_options = buf_options,
 | 
					    buf_options = buf_options,
 | 
				
			||||||
    win_options = get_win_options(),
 | 
					    win_options = get_win_options(),
 | 
				
			||||||
    position = "bottom",
 | 
					    position = "bottom",
 | 
				
			||||||
    size = 2,
 | 
					    size = {
 | 
				
			||||||
  })
 | 
					      height = 4,
 | 
				
			||||||
 | 
					 | 
				
			||||||
  self.input_placeholder:mount()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  self.input_header = Split({
 | 
					 | 
				
			||||||
    enter = false,
 | 
					 | 
				
			||||||
    relative = {
 | 
					 | 
				
			||||||
      type = "win",
 | 
					 | 
				
			||||||
      winid = self.result.winid,
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    buf_options = buf_options,
 | 
					 | 
				
			||||||
    win_options = get_win_options(),
 | 
					 | 
				
			||||||
    position = "bottom",
 | 
					 | 
				
			||||||
    size = 1,
 | 
					 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  self.input_header:mount()
 | 
					  self.input_container:mount()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  self:update_content_with_history(chat_history)
 | 
					  self:update_content_with_history(chat_history)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1258,30 +1250,22 @@ function Sidebar:render()
 | 
				
			|||||||
  self:create_input()
 | 
					  self:create_input()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if self.code.selection ~= nil then
 | 
					  if self.code.selection ~= nil then
 | 
				
			||||||
    self.selected_code = Split({
 | 
					    self.selected_code_container = Split({
 | 
				
			||||||
      enter = false,
 | 
					      enter = false,
 | 
				
			||||||
      relative = {
 | 
					      relative = {
 | 
				
			||||||
        type = "win",
 | 
					        type = "win",
 | 
				
			||||||
        winid = self.result.winid,
 | 
					        winid = self.result_container.winid,
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      buf_options = buf_options,
 | 
					      buf_options = buf_options,
 | 
				
			||||||
      win_options = get_win_options(),
 | 
					      win_options = get_win_options(),
 | 
				
			||||||
      position = "bottom",
 | 
					      position = "bottom",
 | 
				
			||||||
      size = self:get_selected_code_size(),
 | 
					      size = {
 | 
				
			||||||
 | 
					        height = selected_code_size,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					    self.selected_code_container:mount()
 | 
				
			||||||
 | 
					    self.selected_code = create_floating_window_for_split(self.selected_code_container.winid)
 | 
				
			||||||
    self.selected_code:mount()
 | 
					    self.selected_code:mount()
 | 
				
			||||||
    self.selected_code_header = Split({
 | 
					 | 
				
			||||||
      enter = false,
 | 
					 | 
				
			||||||
      relative = {
 | 
					 | 
				
			||||||
        type = "win",
 | 
					 | 
				
			||||||
        winid = self.result.winid,
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      buf_options = buf_options,
 | 
					 | 
				
			||||||
      win_options = get_win_options(),
 | 
					 | 
				
			||||||
      position = "bottom",
 | 
					 | 
				
			||||||
      size = 1,
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
    self.selected_code_header:mount()
 | 
					 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  self:on_mount()
 | 
					  self:on_mount()
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user