chore: scroll to end (#137)
This commit is contained in:
parent
76c7972fb1
commit
f95feebd39
@ -347,7 +347,7 @@ function Sidebar:do_render_header(winid, bufnr, header_text, hl, reverse_hl)
|
|||||||
|
|
||||||
local prefix_padding_text = string.rep(" ", prefix_padding)
|
local prefix_padding_text = string.rep(" ", prefix_padding)
|
||||||
local suffix_padding_text = string.rep(" ", suffix_padding)
|
local suffix_padding_text = string.rep(" ", suffix_padding)
|
||||||
api.nvim_set_option_value("modifiable", true, { buf = bufnr })
|
Utils.unlock_buf(bufnr)
|
||||||
api.nvim_buf_set_lines(bufnr, 0, -1, false, { prefix_padding_text .. header_text .. suffix_padding_text })
|
api.nvim_buf_set_lines(bufnr, 0, -1, false, { prefix_padding_text .. header_text .. suffix_padding_text })
|
||||||
api.nvim_buf_add_highlight(bufnr, -1, "WinSeparator", 0, 0, #prefix_padding_text)
|
api.nvim_buf_add_highlight(bufnr, -1, "WinSeparator", 0, 0, #prefix_padding_text)
|
||||||
api.nvim_buf_add_highlight(bufnr, -1, reverse_hl, 0, #prefix_padding_text, #prefix_padding_text)
|
api.nvim_buf_add_highlight(bufnr, -1, reverse_hl, 0, #prefix_padding_text, #prefix_padding_text)
|
||||||
@ -361,7 +361,7 @@ function Sidebar:do_render_header(winid, bufnr, header_text, hl, reverse_hl)
|
|||||||
#prefix_padding_text + #header_text
|
#prefix_padding_text + #header_text
|
||||||
)
|
)
|
||||||
api.nvim_buf_add_highlight(bufnr, -1, "WinSeparator", 0, #prefix_padding_text + #header_text, -1)
|
api.nvim_buf_add_highlight(bufnr, -1, "WinSeparator", 0, #prefix_padding_text + #header_text, -1)
|
||||||
api.nvim_set_option_value("modifiable", false, { buf = bufnr })
|
Utils.lock_buf(bufnr)
|
||||||
end
|
end
|
||||||
|
|
||||||
function Sidebar:render_header()
|
function Sidebar:render_header()
|
||||||
@ -515,10 +515,10 @@ function Sidebar:on_mount()
|
|||||||
local selected_code_buf = self.selected_code.bufnr
|
local selected_code_buf = self.selected_code.bufnr
|
||||||
if selected_code_buf ~= nil then
|
if selected_code_buf ~= nil then
|
||||||
if self.code.selection ~= nil then
|
if self.code.selection ~= nil then
|
||||||
api.nvim_set_option_value("modifiable", true, { buf = selected_code_buf })
|
Utils.unlock_buf(selected_code_buf)
|
||||||
local lines = vim.split(self.code.selection.content, "\n")
|
local lines = vim.split(self.code.selection.content, "\n")
|
||||||
api.nvim_buf_set_lines(selected_code_buf, 0, -1, false, lines)
|
api.nvim_buf_set_lines(selected_code_buf, 0, -1, false, lines)
|
||||||
api.nvim_set_option_value("modifiable", false, { buf = selected_code_buf })
|
Utils.lock_buf(selected_code_buf)
|
||||||
end
|
end
|
||||||
api.nvim_set_option_value("filetype", filetype, { buf = selected_code_buf })
|
api.nvim_set_option_value("filetype", filetype, { buf = selected_code_buf })
|
||||||
end
|
end
|
||||||
@ -817,11 +817,11 @@ function Sidebar:update_content(content, opts)
|
|||||||
end
|
end
|
||||||
scroll_to_bottom()
|
scroll_to_bottom()
|
||||||
local lines = vim.split(content, "\n")
|
local lines = vim.split(content, "\n")
|
||||||
api.nvim_set_option_value("modifiable", true, { buf = self.result.bufnr })
|
Utils.unlock_buf(self.result.bufnr)
|
||||||
api.nvim_buf_call(self.result.bufnr, function()
|
api.nvim_buf_call(self.result.bufnr, function()
|
||||||
api.nvim_put(lines, "c", true, true)
|
api.nvim_put(lines, "c", true, true)
|
||||||
end)
|
end)
|
||||||
api.nvim_set_option_value("modifiable", false, { buf = self.result.bufnr })
|
Utils.lock_buf(self.result.bufnr)
|
||||||
api.nvim_set_option_value("filetype", "Avante", { buf = self.result.bufnr })
|
api.nvim_set_option_value("filetype", "Avante", { buf = self.result.bufnr })
|
||||||
if opts.scroll then
|
if opts.scroll then
|
||||||
scroll_to_bottom()
|
scroll_to_bottom()
|
||||||
@ -836,11 +836,9 @@ function Sidebar:update_content(content, opts)
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
local lines = vim.split(content, "\n")
|
local lines = vim.split(content, "\n")
|
||||||
local n_lines = #lines
|
Utils.unlock_buf(self.result.bufnr)
|
||||||
local last_line_length = lines[n_lines]
|
|
||||||
api.nvim_set_option_value("modifiable", true, { buf = self.result.bufnr })
|
|
||||||
api.nvim_buf_set_lines(self.result.bufnr, 0, -1, false, lines)
|
api.nvim_buf_set_lines(self.result.bufnr, 0, -1, false, lines)
|
||||||
api.nvim_set_option_value("modifiable", false, { buf = self.result.bufnr })
|
Utils.lock_buf(self.result.bufnr)
|
||||||
api.nvim_set_option_value("filetype", "Avante", { buf = self.result.bufnr })
|
api.nvim_set_option_value("filetype", "Avante", { buf = self.result.bufnr })
|
||||||
if opts.focus and not self:is_focused_on_result() then
|
if opts.focus and not self:is_focused_on_result() then
|
||||||
xpcall(function()
|
xpcall(function()
|
||||||
@ -852,11 +850,7 @@ function Sidebar:update_content(content, opts)
|
|||||||
end
|
end
|
||||||
|
|
||||||
if opts.scroll then
|
if opts.scroll then
|
||||||
xpcall(function()
|
Utils.buf_scroll_to_end(self.result.bufnr)
|
||||||
api.nvim_win_set_cursor(self.result.winid, { n_lines, #last_line_length })
|
|
||||||
end, function(err)
|
|
||||||
return err
|
|
||||||
end)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if opts.callback ~= nil then
|
if opts.callback ~= nil then
|
||||||
|
@ -250,4 +250,50 @@ function M.get_win_options(winid, opt_name, key)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function M.unlock_buf(bufnr)
|
||||||
|
vim.bo[bufnr].modified = false
|
||||||
|
vim.bo[bufnr].modifiable = true
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.lock_buf(bufnr)
|
||||||
|
vim.bo[bufnr].modified = false
|
||||||
|
vim.bo[bufnr].modifiable = false
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param winnr? number
|
||||||
|
---@return nil
|
||||||
|
M.scroll_to_end = function(winnr)
|
||||||
|
winnr = winnr or 0
|
||||||
|
local bufnr = api.nvim_win_get_buf(winnr)
|
||||||
|
local lnum = api.nvim_buf_line_count(bufnr)
|
||||||
|
local last_line = api.nvim_buf_get_lines(bufnr, -2, -1, true)[1]
|
||||||
|
api.nvim_win_set_cursor(winnr, { lnum, api.nvim_strwidth(last_line) })
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param bufnr nil|integer
|
||||||
|
---@return nil
|
||||||
|
M.buf_scroll_to_end = function(bufnr)
|
||||||
|
for _, winnr in ipairs(M.buf_list_wins(bufnr or 0)) do
|
||||||
|
M.scroll_to_end(winnr)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param bufnr nil|integer
|
||||||
|
---@return integer[]
|
||||||
|
M.buf_list_wins = function(bufnr)
|
||||||
|
local wins = {}
|
||||||
|
|
||||||
|
if not bufnr or bufnr == 0 then
|
||||||
|
bufnr = api.nvim_get_current_buf()
|
||||||
|
end
|
||||||
|
|
||||||
|
for _, winnr in ipairs(api.nvim_list_wins()) do
|
||||||
|
if api.nvim_win_is_valid(winnr) and api.nvim_win_get_buf(winnr) == bufnr then
|
||||||
|
table.insert(wins, winnr)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return wins
|
||||||
|
end
|
||||||
|
|
||||||
return M
|
return M
|
||||||
|
Loading…
x
Reference in New Issue
Block a user