vim-patch:9.2.0914: diff: undo after :diffget into an empty buffer leaves a line behind (#41181)

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:  vim/vim#20950
closes: vim/vim#20951

c44f35ca1a

Co-authored-by: Hirohito Higashi <h.east.727@gmail.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
zeertzjq
2026-08-06 07:17:17 +08:00
committed by GitHub
parent 88c13ee43c
commit a19dcb3108
2 changed files with 22 additions and 1 deletions

View File

@@ -3822,9 +3822,12 @@ static void diffgetput(const int addr_count, const int idx_cur, const int idx_fr
bool did_free = false;
linenr_T lnum = dp->df_lnum[idx_to];
linenr_T 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 && buf_is_empty(curbuf) ? 1 : 0);
if ((dp->df_lnum[idx_cur] + dp->df_count[idx_cur] > 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.
linenr_T start_skip = 0;
linenr_T end_skip = 0;

View File

@@ -253,6 +253,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