]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.2.0914: diff: undo after :diffget into an empty buffer leaves a line behind v9.2.0914
authorHirohito Higashi <h.east.727@gmail.com>
Wed, 5 Aug 2026 19:05:25 +0000 (19:05 +0000)
committerChristian Brabandt <cb@256bit.org>
Wed, 5 Aug 2026 19:08:35 +0000 (19:08 +0000)
Problem:  After :diffget into an empty buffer, undo does not restore the
          empty buffer, the last line stays behind (Narendran
          Gopalakrishnan)
Solution: Include the empty line of the empty buffer in the undo
          information, it is deleted once the first line was obtained
          (Hirohito Higashi).

fixes:  #20950
closes: #20951

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Hirohito Higashi <h.east.727@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
src/diff.c
src/testdir/test_diffmode.vim
src/version.c

index b38513693e4cc4655ffbf5216cd08a07a1de4a2e..4836922c910455192767464b523147f64629d38b 100644 (file)
@@ -4240,8 +4240,12 @@ ex_diffgetput(exarg_T *eap)
        dfree = NULL;
        lnum = dp->df_lnum[idx_to];
        count = dp->df_count[idx_to];
+       // The empty line of an empty buffer is deleted below, include it in
+       // the undo information, otherwise undo leaves a line behind.
+       linenr_T undo_bot = lnum + count + (count == 0 && BUFEMPTY() ? 1 : 0);
+
        if (dp->df_lnum[idx_cur] + dp->df_count[idx_cur] > eap->line1 + off
-               && u_save(lnum - 1, lnum + count) != FAIL)
+               && u_save(lnum - 1, undo_bot) != FAIL)
        {
            // Inside the specified range and saving for undo worked.
            start_skip = 0;
index 1a7840756531aa23e8b997fae678ec2d50959a08..7fc4a32483c77f5f29c7a67c7f0c7e00fc31fd17 100644 (file)
@@ -250,6 +250,24 @@ func Test_diffget_diffput()
   %bwipe!
 endfunc
 
+" Undo after getting lines into an empty buffer must leave it empty again
+func Test_diffget_undo_empty_buffer()
+  enew!
+  diffthis
+  new
+  call setline(1, ['1', '2'])
+  diffthis
+
+  wincmd p
+  normal do
+  call assert_equal(['1', '2'], getline(1, '$'))
+  undo
+  call assert_equal([''], getline(1, '$'))
+
+  windo diffoff
+  %bwipe!
+endfunc
+
 " Test putting two changes from one buffer to another
 func Test_diffput_two()
   new a
index a5145fff9f77409f951e0929ba3b25097c2d9d19..1931bc906f614235e31f576ce75b1279327894b6 100644 (file)
@@ -763,6 +763,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    914,
 /**/
     913,
 /**/