Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: use regular floating win instead of nui.input #191

Merged
merged 1 commit into from
Aug 24, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 10 additions & 4 deletions lua/avante/floating_window.lua
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ api.nvim_set_hl(namespace, "FloatBorder", { link = "Normal" })
---@field on_mount_handlers table | nil
---@field on_unmount_handlers table | nil
---@field augroup integer | nil
---@field keep_floating_style boolean | nil
local FloatingWindow = {}
FloatingWindow.__index = FloatingWindow

Expand All @@ -29,6 +30,7 @@ setmetatable(FloatingWindow, {
---@field buf_options? table<string, any>
---@field win_options? table<string, any>
---@field float_options? table<string, any>
---@field keep_floating_style? boolean

---@param opts FloatingWindowOptions
---@return FloatingWindow
Expand All @@ -43,6 +45,7 @@ function FloatingWindow.new(opts)
instance.on_mount_handlers = {}
instance.on_unmount_handlers = {}
instance.augroup = nil
instance.keep_floating_style = opts.keep_floating_style or false
return instance
end

Expand All @@ -55,8 +58,8 @@ function FloatingWindow.from_split_win(split_winid, opts)

local calc_floating_win_size = function(width, height)
return {
width = math.max(width - 2, 0),
height = math.max(height - 3, 0),
width = math.max(width - 2, 1),
height = math.max(height - 3, 1),
}
end

Expand All @@ -81,6 +84,7 @@ function FloatingWindow.from_split_win(split_winid, opts)
buf_options = buf_opts_,
win_options = win_opts_,
float_options = float_opts_,
keep_floating_style = opts.keep_floating_style,
})

floating_win:on_mount(function(winid)
Expand Down Expand Up @@ -178,7 +182,9 @@ function FloatingWindow:mount()
api.nvim_set_option_value(option, value, { win = self.winid })
end

api.nvim_win_set_hl_ns(self.winid, namespace)
if not self.keep_floating_style then
api.nvim_win_set_hl_ns(self.winid, namespace)
end

for _, handler in ipairs(self.on_mount_handlers) do
handler(self.winid, self.bufnr)
Expand Down Expand Up @@ -220,7 +226,7 @@ function FloatingWindow:on(event, handler, options)
})
end

---@param mode string check `:h :map-modes`
---@param mode string|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>
Expand Down
6 changes: 6 additions & 0 deletions lua/avante/highlights.lua
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ local M = {
REVERSED_NORMAL = "AvanteReversedNormal",
}

M.input_ns = api.nvim_create_namespace("avante_input")

M.setup = function()
local normal = api.nvim_get_hl(0, { name = "Normal" })
api.nvim_set_hl(0, M.REVERSED_NORMAL, { fg = normal.bg })
Expand All @@ -19,6 +21,10 @@ M.setup = function()
api.nvim_set_hl(0, M.REVERSED_SUBTITLE, { fg = "#56b6c2" })
api.nvim_set_hl(0, M.THRIDTITLE, { fg = "#ABB2BF", bg = "#353B45" })
api.nvim_set_hl(0, M.REVERSED_THRIDTITLE, { fg = "#353B45" })

local normal_float = api.nvim_get_hl(0, { name = "NormalFloat" })
api.nvim_set_hl(M.input_ns, "NormalFloat", { fg = normal_float.fg, bg = normal_float.bg })
api.nvim_set_hl(M.input_ns, "FloatBorder", { fg = normal.fg, bg = normal.bg })
end

return M
132 changes: 26 additions & 106 deletions lua/avante/sidebar.lua
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ local fn = vim.fn

local Path = require("plenary.path")
local Split = require("nui.split")
local Input = require("nui.input")
local event = require("nui.utils.autocmd").event

local Config = require("avante.config")
Expand Down Expand Up @@ -637,85 +636,13 @@ function Sidebar:on_mount()
end,
})

local input_container_win_width = api.nvim_win_get_width(self.input_container.winid)
local input_container_win_height = api.nvim_win_get_height(self.input_container.winid)

api.nvim_create_autocmd("WinResized", {
group = self.augroup,
callback = function()
if
not self.input.winid
or not self.input_container.winid
or not api.nvim_win_is_valid(self.input.winid)
or not api.nvim_win_is_valid(self.input_container.winid)
then
return
end

local current_input_container_win_width = api.nvim_win_get_width(self.input_container.winid)
local current_input_container_win_height = api.nvim_win_get_height(self.input_container.winid)

if
current_input_container_win_width == input_container_win_width
and current_input_container_win_height == input_container_win_height
then
return
end

input_container_win_width = current_input_container_win_width
input_container_win_height = current_input_container_win_height

local old_floating_win_options = api.nvim_win_get_config(self.input.winid)
local new_floating_win_options = vim.tbl_deep_extend("force", old_floating_win_options, {
width = current_input_container_win_width - 2,
})
api.nvim_win_set_config(self.input.winid, new_floating_win_options)
end,
})

local input_win_width = api.nvim_win_get_width(self.input.winid)
local input_win_height = api.nvim_win_get_height(self.input.winid)

api.nvim_create_autocmd("WinResized", {
group = self.augroup,
callback = function()
if
not self.input.winid
or not self.input_container.winid
or not api.nvim_win_is_valid(self.input.winid)
or not api.nvim_win_is_valid(self.input_container.winid)
then
return
end

local current_input_win_width = api.nvim_win_get_width(self.input.winid)
local current_input_win_height = api.nvim_win_get_height(self.input.winid)

if current_input_win_width == input_win_width and current_input_win_height == input_win_height then
return
end

input_win_width = current_input_win_width
input_win_height = current_input_win_height

api.nvim_win_set_width(self.input_container.winid, input_win_width + 2)
end,
})

api.nvim_create_autocmd("WinClosed", {
group = self.augroup,
callback = function(args)
local closed_winid = tonumber(args.match)
if not self:is_focused_on(closed_winid) then
return
end
if closed_winid == self.winids.input then
-- Do not blame me for this hack: https://github.com/MunifTanjim/nui.nvim/blob/61574ce6e60c815b0a0c4b5655b8486ba58089a1/lua/nui/input/init.lua#L96-L99
---@diagnostic disable-next-line: undefined-field
if self.input._.pending_submit_value then
return
end
end
self:close()
end,
})
Expand Down Expand Up @@ -873,7 +800,6 @@ function Sidebar:resize()
api.nvim_win_set_width(comp.winid, new_layout.width)
end
end
self:create_input()
self:render_result_container()
self:render_input_container()
self:render_selected_code_container()
Expand Down Expand Up @@ -1129,7 +1055,6 @@ function Sidebar:get_commands()
---@diagnostic disable-next-line: unused-local
callback = function(args, cb)
local help_text = get_help_text(items)
self:create_input()
self:update_content(help_text, { focus = false, scroll = false })
if cb then
cb(args)
Expand All @@ -1142,7 +1067,6 @@ function Sidebar:get_commands()
callback = function(args, cb)
local chat_history = {}
save_chat_history(self, chat_history)
self:create_input()
self:update_content("Chat history cleared", { focus = false, scroll = false })
vim.defer_fn(function()
self:close()
Expand Down Expand Up @@ -1204,7 +1128,7 @@ function Sidebar:create_selected_code()
win_options = get_win_options(),
position = "bottom",
size = {
height = selected_code_size,
height = selected_code_size + 3,
},
})
self.selected_code_container:mount()
Expand Down Expand Up @@ -1288,7 +1212,6 @@ function Sidebar:create_input()
return
end
else
self:create_input()
self:update_content("Unknown command: " .. command, { focus = false, scroll = false })
return
end
Expand Down Expand Up @@ -1331,7 +1254,6 @@ function Sidebar:create_input()
})

vim.defer_fn(function()
self:create_input() -- Recreate input box
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)
end
Expand Down Expand Up @@ -1370,34 +1292,31 @@ function Sidebar:create_input()
return
end

local win_width = api.nvim_win_get_width(self.input_container.winid)

self.input = Input({
relative = {
type = "win",
winid = self.input_container.winid,
},
position = {
row = 2,
col = 1,
},
size = {
width = win_width - 2, -- Subtract the width of the input box borders
self.input = self:create_floating_window_for_split({
split_winid = self.input_container.winid,
buf_opts = {
modifiable = true,
},
}, {
disable_cursor_position_patch = true,
prompt = Config.windows.prompt.prefix,
default_value = " ",
on_submit = function(user_input)
user_input = Utils.trim_spaces(user_input)
if user_input == "" then
self:create_input()
return
end
handle_submit(user_input)
end,
keep_floating_style = true,
})

self.input:on_mount(function()
api.nvim_win_set_hl_ns(self.input.winid, Highlights.input_ns)
end)

local function on_submit()
local lines = api.nvim_buf_get_lines(self.input.bufnr, 0, -1, false)
local request = table.concat(lines, "\n")
if request == "" then
return
end
api.nvim_buf_set_lines(self.input.bufnr, 0, -1, false, {})
handle_submit(request)
end

self.input:map("n", "<CR>", on_submit)
self.input:map("i", "<C-s>", on_submit)

self.input:mount()

api.nvim_set_option_value("filetype", "AvanteInput", { buf = self.input.bufnr })
Expand Down Expand Up @@ -1437,7 +1356,7 @@ function Sidebar:get_selected_code_size()
if self.code.selection ~= nil then
local selected_code_lines = vim.split(self.code.selection.content, "\n")
selected_code_lines_count = #selected_code_lines
selected_code_size = math.min(selected_code_lines_count, selected_code_max_lines_count) + 3
selected_code_size = math.min(selected_code_lines_count, selected_code_max_lines_count)
end

return selected_code_size
Expand All @@ -1448,6 +1367,7 @@ end
---@field buf_opts table | nil
---@field win_opts table | nil
---@field float_opts table | nil
---@field keep_floating_style boolean | nil

---@param opts CreateFloatingWindowForSplitOptions
function Sidebar:create_floating_window_for_split(opts)
Expand Down Expand Up @@ -1492,7 +1412,7 @@ function Sidebar:render()
filetype = "Avante",
},
float_opts = {
height = math.max(0, sidebar_height - selected_code_size - 9),
height = math.max(1, sidebar_height - selected_code_size - 3 - 8),
},
})

Expand Down
1 change: 1 addition & 0 deletions lua/avante/utils/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,7 @@ function M.unlock_buf(bufnr)
end

function M.lock_buf(bufnr)
vim.cmd("stopinsert")
vim.bo[bufnr].modified = false
vim.bo[bufnr].modifiable = false
end
Expand Down