From 64982d6010c3610e7f44190f4eb128d6f0f2b91a Mon Sep 17 00:00:00 2001 From: glepnir Date: Mon, 1 Jun 2026 20:43:56 +0000 Subject: [PATCH] patch 9.2.0585: line number wrong after undoing a deletion in quickfix buffer Problem: Deleting a quickfix line and undoing it leaves the entry pointing one line below where it should. Solution: Don't shift already cleared entries in qf_mark_adjust. closes: #20379 Signed-off-by: glepnir Signed-off-by: Christian Brabandt --- src/quickfix.c | 3 +++ src/testdir/test_quickfix.vim | 47 +++++++++++++++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 52 insertions(+) diff --git a/src/quickfix.c b/src/quickfix.c index 2470902fd1..0c7a9c9a52 100644 --- a/src/quickfix.c +++ b/src/quickfix.c @@ -4434,6 +4434,9 @@ qf_mark_adjust( if (qfp->qf_fnum == curbuf->b_fnum) { found_one = TRUE; + if (qfp->qf_cleared) + continue; + if (qfp->qf_lnum >= line1 && qfp->qf_lnum <= line2) { if (amount == MAXLNUM) diff --git a/src/testdir/test_quickfix.vim b/src/testdir/test_quickfix.vim index b0c4475ccd..6ffc1828a9 100644 --- a/src/testdir/test_quickfix.vim +++ b/src/testdir/test_quickfix.vim @@ -2334,6 +2334,53 @@ func Test_adjust_lnum() call Xadjust_qflnum('l') endfunc +func Xqf_undo_after_delete(cchar) + call s:setup_commands(a:cchar) + + enew | only + + let fname = 'Xqfundofile' . a:cchar + call s:create_test_file(fname) + exe 'edit ' . fname + + Xgetexpr [fname . ':5:Line5', + \ fname . ':10:Line10', + \ fname . ':15:Line15'] + + " Delete the line of the second error and undo the deletion. + 10delete + let l = g:Xgetlist() + call assert_equal(5, l[0].lnum) + call assert_equal(10, l[1].lnum) + call assert_equal(14, l[2].lnum) + + undo + call assert_equal('Line10', getline(10)) + let l = g:Xgetlist() + call assert_equal(5, l[0].lnum) + call assert_equal(10, l[1].lnum) + call assert_equal(15, l[2].lnum) + + " Redo and undo again to make sure the line number does not drift. + redo + call assert_equal(14, g:Xgetlist()[2].lnum) + undo + let l = g:Xgetlist() + call assert_equal(10, l[1].lnum) + call assert_equal(15, l[2].lnum) + + call g:Xsetlist([], 'f') + enew! + call delete(fname) +endfunc + +func Test_qf_undo_after_delete() + call setloclist(0, []) + call Xqf_undo_after_delete('c') + call setqflist([]) + call Xqf_undo_after_delete('l') +endfunc + " Tests for the :grep/:lgrep and :grepadd/:lgrepadd commands func s:test_xgrep(cchar) call s:setup_commands(a:cchar) diff --git a/src/version.c b/src/version.c index 208e7164d3..be7bb521b4 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 */ +/**/ + 585, /**/ 584, /**/