mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
commit
cea1248f7d
@ -1033,10 +1033,7 @@ void ex_diffsplit(exarg_T *eap)
|
||||
if (bufref_valid(&old_curbuf)) {
|
||||
// Move the cursor position to that of the old window.
|
||||
curwin->w_cursor.lnum = diff_get_corresponding_line(
|
||||
old_curbuf.br_buf,
|
||||
old_curwin->w_cursor.lnum,
|
||||
curbuf,
|
||||
curwin->w_cursor.lnum);
|
||||
old_curbuf.br_buf, old_curwin->w_cursor.lnum);
|
||||
}
|
||||
}
|
||||
// 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;
|
||||
}
|
||||
|
||||
/// Finds the corresponding line in a diff.
|
||||
///
|
||||
/// @param buf1
|
||||
/// @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)
|
||||
/// Return the line number in the current window that is closest to "lnum1" in
|
||||
/// "buf1" in diff mode.
|
||||
static linenr_T diff_get_corresponding_line_int(buf_T *buf1, linenr_T lnum1)
|
||||
{
|
||||
int idx1;
|
||||
int idx2;
|
||||
diff_T *dp;
|
||||
int baseline = 0;
|
||||
linenr_T lnum2;
|
||||
|
||||
idx1 = diff_buf_idx(buf1);
|
||||
idx2 = diff_buf_idx(buf2);
|
||||
idx2 = diff_buf_idx(curbuf);
|
||||
|
||||
if ((idx1 == 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) {
|
||||
if (dp->df_lnum[idx1] > lnum1) {
|
||||
lnum2 = lnum1 - baseline;
|
||||
|
||||
// don't end up past the end of the file
|
||||
if (lnum2 > buf2->b_ml.ml_line_count) {
|
||||
lnum2 = buf2->b_ml.ml_line_count;
|
||||
return lnum1 - baseline;
|
||||
}
|
||||
|
||||
return lnum2;
|
||||
} else if ((dp->df_lnum[idx1] + dp->df_count[idx1]) > lnum1) {
|
||||
if ((dp->df_lnum[idx1] + dp->df_count[idx1]) > lnum1) {
|
||||
// Inside the diffblock
|
||||
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;
|
||||
} else if ((dp->df_lnum[idx1] == lnum1)
|
||||
}
|
||||
if ((dp->df_lnum[idx1] == lnum1)
|
||||
&& (dp->df_count[idx1] == 0)
|
||||
&& (dp->df_lnum[idx2] <= lnum3)
|
||||
&& ((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
|
||||
// block (i.e. all filler) and the target cursor is already
|
||||
// inside the corresponding block, leave the target cursor
|
||||
// unmoved. This makes repeated CTRL-W W operations work
|
||||
// as expected.
|
||||
return lnum3;
|
||||
return curwin->w_cursor.lnum;
|
||||
}
|
||||
baseline = (dp->df_lnum[idx1] + dp->df_count[idx1])
|
||||
- (dp->df_lnum[idx2] + dp->df_count[idx2]);
|
||||
}
|
||||
|
||||
// If we get here then the cursor is after the last diff
|
||||
lnum2 = lnum1 - baseline;
|
||||
|
||||
// don't end up past the end of the file
|
||||
if (lnum2 > buf2->b_ml.ml_line_count) {
|
||||
lnum2 = buf2->b_ml.ml_line_count;
|
||||
return lnum1 - baseline;
|
||||
}
|
||||
|
||||
return lnum2;
|
||||
/// 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
|
||||
if (lnum > curbuf->b_ml.ml_line_count) {
|
||||
return curbuf->b_ml.ml_line_count;
|
||||
}
|
||||
return lnum;
|
||||
}
|
||||
|
||||
/// For line "lnum" in the current window find the equivalent lnum in window
|
||||
|
@ -2147,14 +2147,12 @@ void do_check_cursorbind(void)
|
||||
curbuf = curwin->w_buffer;
|
||||
/* skip original window and windows with 'noscrollbind' */
|
||||
if (curwin != old_curwin && curwin->w_p_crb) {
|
||||
if (curwin->w_p_diff)
|
||||
curwin->w_cursor.lnum
|
||||
= diff_get_corresponding_line(old_curbuf,
|
||||
line,
|
||||
curbuf,
|
||||
curwin->w_cursor.lnum);
|
||||
else
|
||||
if (curwin->w_p_diff) {
|
||||
curwin->w_cursor.lnum =
|
||||
diff_get_corresponding_line(old_curbuf, line);
|
||||
} else {
|
||||
curwin->w_cursor.lnum = line;
|
||||
}
|
||||
curwin->w_cursor.col = col;
|
||||
curwin->w_cursor.coladd = coladd;
|
||||
curwin->w_curswant = curswant;
|
||||
|
@ -218,3 +218,20 @@ func Test_diffoff()
|
||||
bwipe!
|
||||
bwipe!
|
||||
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
|
||||
|
@ -908,7 +908,7 @@ static const int included_patches[] = {
|
||||
47,
|
||||
46,
|
||||
// 45 NA
|
||||
// 44,
|
||||
44,
|
||||
43,
|
||||
42,
|
||||
41,
|
||||
|
Loading…
Reference in New Issue
Block a user