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
* with markers.
* Skip mark_adjust when adding a line after the last one, there can't
* be marks there. */
if (curwin->w_cursor.lnum + 1 < curbuf->b_ml.ml_line_count)
* be marks there. But still needed in diff mode. */
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);
did_append = TRUE;
}
@ -2863,8 +2867,12 @@ appended_lines(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
* be marks there. */
if (lnum + count < curbuf->b_ml.ml_line_count)
* be marks there. But it's still needed in diff mode. */
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);
changed_lines(lnum + 1, 0, lnum + 1, count);
}

View File

@ -3927,9 +3927,13 @@ error:
curbuf->b_op_start.lnum++;
}
/* 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
< 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),
(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
* 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
* permanent (while X runs) store CUT_BUFFER0.
* 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:')
%bwipe!
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[] =
{ /* Add new patch number below this line */
/**/
421,
/**/
420,
/**/