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)) {
|
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 (lnum2 > buf2->b_ml.ml_line_count) {
|
|
||||||
lnum2 = buf2->b_ml.ml_line_count;
|
|
||||||
}
|
}
|
||||||
|
if ((dp->df_lnum[idx1] + dp->df_count[idx1]) > lnum1) {
|
||||||
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)
|
}
|
||||||
|
if ((dp->df_lnum[idx1] == lnum1)
|
||||||
&& (dp->df_count[idx1] == 0)
|
&& (dp->df_count[idx1] == 0)
|
||||||
&& (dp->df_lnum[idx2] <= lnum3)
|
&& (dp->df_lnum[idx2] <= curwin->w_cursor.lnum)
|
||||||
&& ((dp->df_lnum[idx2] + dp->df_count[idx2]) > lnum3)) {
|
&& ((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;
|
||||||
|
|
||||||
// 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 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
|
/// 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;
|
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;
|
||||||
|
@ -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
|
||||||
|
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user