vim-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 vim/vim#1329)

f58a8475e1
This commit is contained in:
ckelsel 2018-01-15 20:08:37 +08:00
parent 28998cfd81
commit 808f504305
3 changed files with 27 additions and 6 deletions

View File

@ -749,8 +749,9 @@ 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
|| curwin->w_p_diff) {
mark_adjust(curwin->w_cursor.lnum + 1, (linenr_T)MAXLNUM, 1L, 0L, false); mark_adjust(curwin->w_cursor.lnum + 1, (linenr_T)MAXLNUM, 1L, 0L, false);
} }
did_append = true; did_append = true;
@ -1864,8 +1865,8 @@ void appended_lines(linenr_T lnum, long count)
void appended_lines_mark(linenr_T lnum, long count) void 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 || curwin->w_p_diff) {
mark_adjust(lnum + 1, (linenr_T)MAXLNUM, count, 0L, false); mark_adjust(lnum + 1, (linenr_T)MAXLNUM, count, 0L, false);
} }
changed_lines(lnum + 1, 0, lnum + 1, count); changed_lines(lnum + 1, 0, lnum + 1, count);

View File

@ -3177,9 +3177,9 @@ 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 == kMTCharWise) - 1 + nr_lines if (curbuf->b_op_start.lnum + (y_type == kMTCharWise) - 1 + nr_lines
< curbuf->b_ml.ml_line_count) { < curbuf->b_ml.ml_line_count || curwin->w_p_diff) {
mark_adjust(curbuf->b_op_start.lnum + (y_type == kMTCharWise), mark_adjust(curbuf->b_op_start.lnum + (y_type == kMTCharWise),
(linenr_T)MAXLNUM, nr_lines, 0L, false); (linenr_T)MAXLNUM, nr_lines, 0L, false);
} }

View File

@ -272,3 +272,23 @@ func Test_setting_cursor()
call delete('Xtest1') call delete('Xtest1')
call delete('Xtest2') call delete('Xtest2')
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