0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

patch 8.0.0421: diff mode wrong when adding line at end of buffer

Problem:    Diff mode is displayed wrong when adding a line at the end of a
            buffer.
Solution:   Adjust marks in diff mode. (James McCoy, closes #1329)
This commit is contained in:
Bram Moolenaar 2017-03-05 18:03:04 +01:00
parent 2c7292dc5b
commit f58a8475e1
4 changed files with 41 additions and 7 deletions

View File

@ -1427,8 +1427,12 @@ open_line(
/* Postpone calling changed_lines(), because it would mess up folding /* Postpone calling changed_lines(), because it would mess up folding
* with markers. * with markers.
* Skip mark_adjust when adding a line after the last one, there can't * Skip mark_adjust when adding a line after the last one, there can't
* be marks there. */ * be marks there. But still needed in diff mode. */
if (curwin->w_cursor.lnum + 1 < curbuf->b_ml.ml_line_count) if (curwin->w_cursor.lnum + 1 < curbuf->b_ml.ml_line_count
#ifdef FEAT_DIFF
|| curwin->w_p_diff
#endif
)
mark_adjust(curwin->w_cursor.lnum + 1, (linenr_T)MAXLNUM, 1L, 0L); mark_adjust(curwin->w_cursor.lnum + 1, (linenr_T)MAXLNUM, 1L, 0L);
did_append = TRUE; did_append = TRUE;
} }
@ -2863,8 +2867,12 @@ appended_lines(linenr_T lnum, long count)
appended_lines_mark(linenr_T lnum, long count) appended_lines_mark(linenr_T lnum, long count)
{ {
/* Skip mark_adjust when adding a line after the last one, there can't /* Skip mark_adjust when adding a line after the last one, there can't
* be marks there. */ * be marks there. But it's still needed in diff mode. */
if (lnum + count < curbuf->b_ml.ml_line_count) if (lnum + count < curbuf->b_ml.ml_line_count
#ifdef FEAT_DIFF
|| curwin->w_p_diff
#endif
)
mark_adjust(lnum + 1, (linenr_T)MAXLNUM, count, 0L); mark_adjust(lnum + 1, (linenr_T)MAXLNUM, count, 0L);
changed_lines(lnum + 1, 0, lnum + 1, count); changed_lines(lnum + 1, 0, lnum + 1, count);
} }

View File

@ -3927,9 +3927,13 @@ error:
curbuf->b_op_start.lnum++; curbuf->b_op_start.lnum++;
} }
/* Skip mark_adjust when adding lines after the last one, there /* Skip mark_adjust when adding lines after the last one, there
* can't be marks there. */ * can't be marks there. But still needed in diff mode. */
if (curbuf->b_op_start.lnum + (y_type == MCHAR) - 1 + nr_lines if (curbuf->b_op_start.lnum + (y_type == MCHAR) - 1 + nr_lines
< curbuf->b_ml.ml_line_count) < curbuf->b_ml.ml_line_count
#ifdef FEAT_DIFF
|| curwin->w_p_diff
#endif
)
mark_adjust(curbuf->b_op_start.lnum + (y_type == MCHAR), mark_adjust(curbuf->b_op_start.lnum + (y_type == MCHAR),
(linenr_T)MAXLNUM, nr_lines, 0L); (linenr_T)MAXLNUM, nr_lines, 0L);
@ -6311,7 +6315,7 @@ write_viminfo_registers(FILE *fp)
/* /*
* Routine to export any final X selection we had to the environment * Routine to export any final X selection we had to the environment
* so that the text is still available after vim has exited. X selections * so that the text is still available after Vim has exited. X selections
* only exist while the owning application exists, so we write to the * only exist while the owning application exists, so we write to the
* permanent (while X runs) store CUT_BUFFER0. * permanent (while X runs) store CUT_BUFFER0.
* Dump the CLIPBOARD selection if we own it (it's logically the more * Dump the CLIPBOARD selection if we own it (it's logically the more

View File

@ -347,3 +347,23 @@ func Test_diff_nomodifiable()
call assert_fails('norm do', 'E21:') call assert_fails('norm do', 'E21:')
%bwipe! %bwipe!
endfunc endfunc
func Test_diff_lastline()
enew!
only!
call setline(1, ['This is a ', 'line with five ', 'rows'])
diffthis
botright vert new
call setline(1, ['This is', 'a line with ', 'four rows'])
diffthis
1
call feedkeys("Je a\<CR>", 'tx')
call feedkeys("Je a\<CR>", 'tx')
let w1lines = winline()
wincmd w
$
let w2lines = winline()
call assert_equal(w2lines, w1lines)
bwipe!
bwipe!
endfunc

View File

@ -764,6 +764,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
421,
/**/ /**/
420, 420,
/**/ /**/