aboutsummaryrefslogtreecommitdiff
path: root/runtime/lua/vim
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/lua/vim')
-rw-r--r--runtime/lua/vim/lsp/util.lua54
1 files changed, 41 insertions, 13 deletions
diff --git a/runtime/lua/vim/lsp/util.lua b/runtime/lua/vim/lsp/util.lua
index 342fad33c2..48faddfce1 100644
--- a/runtime/lua/vim/lsp/util.lua
+++ b/runtime/lua/vim/lsp/util.lua
@@ -436,7 +436,7 @@ function M.apply_text_edits(text_edits, bufnr, offset_encoding)
-- Some LSP servers are depending on the VSCode behavior.
-- The VSCode will re-locate the cursor position after applying TextEdit so we also do it.
- local is_current_buf = api.nvim_get_current_buf() == bufnr
+ local is_current_buf = api.nvim_get_current_buf() == bufnr or bufnr == 0
local cursor = (function()
if not is_current_buf then
return {
@@ -464,7 +464,7 @@ function M.apply_text_edits(text_edits, bufnr, offset_encoding)
start_col = get_line_byte_from_position(bufnr, text_edit.range.start, offset_encoding),
end_row = text_edit.range['end'].line,
end_col = get_line_byte_from_position(bufnr, text_edit.range['end'], offset_encoding),
- text = split(text_edit.newText, '\n', true),
+ text = split(text_edit.newText, '\n', { plain = true }),
}
local max = api.nvim_buf_line_count(bufnr)
@@ -522,7 +522,7 @@ function M.apply_text_edits(text_edits, bufnr, offset_encoding)
if is_cursor_fixed then
local is_valid_cursor = true
is_valid_cursor = is_valid_cursor and cursor.row < max
- is_valid_cursor = is_valid_cursor and cursor.col <= #(get_line(bufnr, max - 1) or '')
+ is_valid_cursor = is_valid_cursor and cursor.col <= #(get_line(bufnr, cursor.row) or '')
if is_valid_cursor then
api.nvim_win_set_cursor(0, { cursor.row + 1, cursor.col })
end
@@ -743,6 +743,20 @@ local function bufwinid(bufnr)
end
end
+--- Get list of buffers for a directory
+---@private
+local function get_dir_bufs(path)
+ path = path:gsub('([^%w])', '%%%1')
+ local buffers = {}
+ for _, v in ipairs(vim.api.nvim_list_bufs()) do
+ local bufname = vim.api.nvim_buf_get_name(v):gsub('buffer://', '')
+ if bufname:find(path) then
+ table.insert(buffers, v)
+ end
+ end
+ return buffers
+end
+
--- Rename old_fname to new_fname
---
---@param opts (table)
@@ -755,12 +769,22 @@ function M.rename(old_fname, new_fname, opts)
vim.notify('Rename target already exists. Skipping rename.')
return
end
- local oldbuf = vim.fn.bufadd(old_fname)
- vim.fn.bufload(oldbuf)
- -- The there may be pending changes in the buffer
- if vim.fn.isdirectory(old_fname) == 0 then
- api.nvim_buf_call(oldbuf, function()
+ local oldbufs = {}
+ local win = nil
+
+ if vim.fn.isdirectory(old_fname) == 1 then
+ oldbufs = get_dir_bufs(old_fname)
+ else
+ local oldbuf = vim.fn.bufadd(old_fname)
+ table.insert(oldbufs, oldbuf)
+ win = bufwinid(oldbuf)
+ end
+
+ for _, b in ipairs(oldbufs) do
+ vim.fn.bufload(b)
+ -- The there may be pending changes in the buffer
+ api.nvim_buf_call(b, function()
vim.cmd('w!')
end)
end
@@ -768,12 +792,16 @@ function M.rename(old_fname, new_fname, opts)
local ok, err = os.rename(old_fname, new_fname)
assert(ok, err)
- local newbuf = vim.fn.bufadd(new_fname)
- local win = bufwinid(oldbuf)
- if win then
- api.nvim_win_set_buf(win, newbuf)
+ if vim.fn.isdirectory(new_fname) == 0 then
+ local newbuf = vim.fn.bufadd(new_fname)
+ if win then
+ api.nvim_win_set_buf(win, newbuf)
+ end
+ end
+
+ for _, b in ipairs(oldbufs) do
+ api.nvim_buf_delete(b, {})
end
- api.nvim_buf_delete(oldbuf, { force = true })
end
---@private