fix(api): nvim_buf_set_text resets changelist to 0 #39965

Problem: changed_lines got a hardcoded 0, so the changelist entry
and '. mark always recorded column 0 instead of where the edit
actually happened.

Solution: pass start_col instead. changelist now tracks the real
column.

(cherry picked from commit 7312df77bb)
This commit is contained in:
glepnir
2026-06-30 02:38:07 +08:00
committed by github-actions[bot]
parent 61765b97fe
commit e57c37d246
2 changed files with 6 additions and 1 deletions

View File

@@ -684,7 +684,8 @@ void nvim_buf_set_text(uint64_t channel_id, Buffer buf, Integer start_row, Integ
(int)new_len - 1, (colnr_T)last_item.size, new_byte,
kExtmarkUndo);
changed_lines(b, (linenr_T)start_row, 0, (linenr_T)end_row + 1, (linenr_T)extra, true);
changed_lines(b, (linenr_T)start_row, (colnr_T)start_col, (linenr_T)end_row + 1,
(linenr_T)extra, true);
FOR_ALL_TAB_WINDOWS(tp, win) {
if (win->w_buffer == b) {

View File

@@ -959,6 +959,10 @@ describe('api/buf', function()
eq('hello foo!', curbuf_depr('get_line', 0))
-- cursor should be moved left by two columns (replacement is shorter by 2 chars)
eq({ 1, 9 }, api.nvim_win_get_cursor(0))
-- changelist entry reflects the edit column #28618
local changes = fn.getchangelist()[1]
eq(6, changes[#changes].col)
end)
it('updates the cursor position in non-current window', function()