Merge pull request #7052 from ckelsel/vim-8.0.0044

vim-patch:8.0.0044
This commit is contained in:
James McCoy 2017-08-16 15:35:22 -04:00 committed by GitHub
commit cea1248f7d
4 changed files with 54 additions and 44 deletions

View File

@ -1033,10 +1033,7 @@ void ex_diffsplit(exarg_T *eap)
if (bufref_valid(&old_curbuf)) { if (bufref_valid(&old_curbuf)) {
// Move the cursor position to that of the old window. // Move the cursor position to that of the old window.
curwin->w_cursor.lnum = diff_get_corresponding_line( curwin->w_cursor.lnum = diff_get_corresponding_line(
old_curbuf.br_buf, old_curbuf.br_buf, old_curwin->w_cursor.lnum);
old_curwin->w_cursor.lnum,
curbuf,
curwin->w_cursor.lnum);
} }
} }
// Now that lines are folded scroll to show the cursor at the same // Now that lines are folded scroll to show the cursor at the same
@ -2463,25 +2460,17 @@ int diff_move_to(int dir, long count)
return OK; return OK;
} }
/// Finds the corresponding line in a diff. /// Return the line number in the current window that is closest to "lnum1" in
/// /// "buf1" in diff mode.
/// @param buf1 static linenr_T diff_get_corresponding_line_int(buf_T *buf1, linenr_T lnum1)
/// @param lnum1
/// @param buf2
/// @param lnum3
///
/// @return The corresponding line.
linenr_T diff_get_corresponding_line(buf_T *buf1, linenr_T lnum1, buf_T *buf2,
linenr_T lnum3)
{ {
int idx1; int idx1;
int idx2; int idx2;
diff_T *dp; diff_T *dp;
int baseline = 0; int baseline = 0;
linenr_T lnum2;
idx1 = diff_buf_idx(buf1); idx1 = diff_buf_idx(buf1);
idx2 = diff_buf_idx(buf2); idx2 = diff_buf_idx(curbuf);
if ((idx1 == DB_COUNT) if ((idx1 == DB_COUNT)
|| (idx2 == DB_COUNT) || (idx2 == DB_COUNT)
@ -2501,15 +2490,9 @@ linenr_T diff_get_corresponding_line(buf_T *buf1, linenr_T lnum1, buf_T *buf2,
for (dp = curtab->tp_first_diff; dp != NULL; dp = dp->df_next) { for (dp = curtab->tp_first_diff; dp != NULL; dp = dp->df_next) {
if (dp->df_lnum[idx1] > lnum1) { if (dp->df_lnum[idx1] > lnum1) {
lnum2 = lnum1 - baseline; return lnum1 - baseline;
}
// don't end up past the end of the file if ((dp->df_lnum[idx1] + dp->df_count[idx1]) > lnum1) {
if (lnum2 > buf2->b_ml.ml_line_count) {
lnum2 = buf2->b_ml.ml_line_count;
}
return lnum2;
} else if ((dp->df_lnum[idx1] + dp->df_count[idx1]) > lnum1) {
// Inside the diffblock // Inside the diffblock
baseline = lnum1 - dp->df_lnum[idx1]; baseline = lnum1 - dp->df_lnum[idx1];
@ -2518,30 +2501,42 @@ linenr_T diff_get_corresponding_line(buf_T *buf1, linenr_T lnum1, buf_T *buf2,
} }
return dp->df_lnum[idx2] + baseline; return dp->df_lnum[idx2] + baseline;
} else if ((dp->df_lnum[idx1] == lnum1) }
&& (dp->df_count[idx1] == 0) if ((dp->df_lnum[idx1] == lnum1)
&& (dp->df_lnum[idx2] <= lnum3) && (dp->df_count[idx1] == 0)
&& ((dp->df_lnum[idx2] + dp->df_count[idx2]) > lnum3)) { && (dp->df_lnum[idx2] <= curwin->w_cursor.lnum)
&& ((dp->df_lnum[idx2] + dp->df_count[idx2])
> curwin->w_cursor.lnum)) {
// Special case: if the cursor is just after a zero-count // Special case: if the cursor is just after a zero-count
// block (i.e. all filler) and the target cursor is already // block (i.e. all filler) and the target cursor is already
// inside the corresponding block, leave the target cursor // inside the corresponding block, leave the target cursor
// unmoved. This makes repeated CTRL-W W operations work // unmoved. This makes repeated CTRL-W W operations work
// as expected. // as expected.
return lnum3; return curwin->w_cursor.lnum;
} }
baseline = (dp->df_lnum[idx1] + dp->df_count[idx1]) baseline = (dp->df_lnum[idx1] + dp->df_count[idx1])
- (dp->df_lnum[idx2] + dp->df_count[idx2]); - (dp->df_lnum[idx2] + dp->df_count[idx2]);
} }
// If we get here then the cursor is after the last diff // If we get here then the cursor is after the last diff
lnum2 = lnum1 - baseline; return lnum1 - baseline;
}
/// Finds the corresponding line in a diff.
///
/// @param buf1
/// @param lnum1
///
/// @return The corresponding line.
linenr_T diff_get_corresponding_line(buf_T *buf1, linenr_T lnum1)
{
linenr_T lnum = diff_get_corresponding_line_int(buf1, lnum1);
// don't end up past the end of the file // don't end up past the end of the file
if (lnum2 > buf2->b_ml.ml_line_count) { if (lnum > curbuf->b_ml.ml_line_count) {
lnum2 = buf2->b_ml.ml_line_count; return curbuf->b_ml.ml_line_count;
} }
return lnum;
return lnum2;
} }
/// For line "lnum" in the current window find the equivalent lnum in window /// For line "lnum" in the current window find the equivalent lnum in window

View File

@ -2147,14 +2147,12 @@ void do_check_cursorbind(void)
curbuf = curwin->w_buffer; curbuf = curwin->w_buffer;
/* skip original window and windows with 'noscrollbind' */ /* skip original window and windows with 'noscrollbind' */
if (curwin != old_curwin && curwin->w_p_crb) { if (curwin != old_curwin && curwin->w_p_crb) {
if (curwin->w_p_diff) if (curwin->w_p_diff) {
curwin->w_cursor.lnum curwin->w_cursor.lnum =
= diff_get_corresponding_line(old_curbuf, diff_get_corresponding_line(old_curbuf, line);
line, } else {
curbuf,
curwin->w_cursor.lnum);
else
curwin->w_cursor.lnum = line; curwin->w_cursor.lnum = line;
}
curwin->w_cursor.col = col; curwin->w_cursor.col = col;
curwin->w_cursor.coladd = coladd; curwin->w_cursor.coladd = coladd;
curwin->w_curswant = curswant; curwin->w_curswant = curswant;

View File

@ -218,3 +218,20 @@ func Test_diffoff()
bwipe! bwipe!
bwipe! bwipe!
endfunc endfunc
func Test_setting_cursor()
new Xtest1
put =range(1,90)
wq
new Xtest2
put =range(1,100)
wq
tabe Xtest2
$
diffsp Xtest1
tabclose
call delete('Xtest1')
call delete('Xtest2')
endfunc

View File

@ -908,7 +908,7 @@ static const int included_patches[] = {
47, 47,
46, 46,
// 45 NA // 45 NA
// 44, 44,
43, 43,
42, 42,
41, 41,