From: Jaehwang Jung Date: Tue, 21 Apr 2026 19:21:24 +0000 (+0000) Subject: patch 9.2.0384: stale Insstart after cursor move breaks undo X-Git-Tag: v9.2.0384^0 X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=d4fb31762ea0b9de6fffb529c4ffee509621f74c;p=thirdparty%2Fvim.git patch 9.2.0384: stale Insstart after cursor move breaks undo Problem: A command executed from Insert mode can sync undo and move the cursor before the next edit. stop_arrow() saved the new cursor line for undo, but left Insstart at the previous insertion point. A line-start backspace could then delete lines above the saved line without saving the joined range, leaving a pending undo entry whose bottom resolved above its top and raising E340. Solution: Update Insstart and Insstart_textlen after the pending undo save so the next edit starts from the command-updated cursor position (Jaehwang Jung). closes: #20031 AI-assisted: Codex Signed-off-by: Jaehwang Jung Signed-off-by: Christian Brabandt --- diff --git a/src/edit.c b/src/edit.c index 60cae0e15c..f15cc55f32 100644 --- a/src/edit.c +++ b/src/edit.c @@ -2502,7 +2502,12 @@ stop_arrow(void) else if (ins_need_undo) { if (u_save_cursor() == OK) + { + // A command or event may have moved the cursor after syncing undo. + Insstart = curwin->w_cursor; + Insstart_textlen = (colnr_T)linetabsize_str(ml_get_curline()); ins_need_undo = FALSE; + } } #ifdef FEAT_FOLDING diff --git a/src/testdir/test_undo.vim b/src/testdir/test_undo.vim index ad724aa04d..97b77f423d 100644 --- a/src/testdir/test_undo.vim +++ b/src/testdir/test_undo.vim @@ -924,5 +924,19 @@ func Test_restore_cursor_position_after_undo() bw! endfunc +func Test_undo_line_backspace_after_insert_cmd_cursor_movement() + new + setlocal backspace=eol undolevels=100 + call setline(1, ['', '', 'abc', 'def']) + call cursor(4, 1) + + let v:errmsg = '' + call feedkeys("i\setlocal undolevels=101 | call cursor(3, 1)\" + \ .. "\\\u", 'xt') + + call assert_equal('', v:errmsg) + call assert_equal(['', '', 'abc', 'def'], getline(1, '$')) + bwipe! +endfunc " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 895c22e9c0..2a8b84404f 100644 --- a/src/version.c +++ b/src/version.c @@ -729,6 +729,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 384, /**/ 383, /**/