# HG changeset patch # User Christian Brabandt # Date 1472391905 -7200 # Node ID 942d40a92be67b0f40ace1b54c4652aedf70bb5c # Parent 7fd537428bcdbdf12c00a3bff1a6809491a92291 commit https://github.com/vim/vim/commit/46328f9a1cc8047d1e05095bc9f531038c5a4028 Author: Bram Moolenaar Date: Sun Aug 28 15:39:57 2016 +0200 patch 7.4.2279 Problem: Starting diff mode with the cursor in the last line might end up only showing one closed fold. (John Beckett) Solution: Scroll the window to show the same relative cursor position. diff --git a/src/diff.c b/src/diff.c --- a/src/diff.c +++ b/src/diff.c @@ -1075,6 +1075,10 @@ ex_diffsplit(exarg_T *eap) #ifdef FEAT_GUI need_mouse_correct = TRUE; #endif + /* Need to compute w_fraction when no redraw happened yet. */ + validate_cursor(); + set_fraction(curwin); + /* don't use a new tab page, each tab page has its own diffs */ cmdmod.tab = 0; @@ -1101,6 +1105,9 @@ ex_diffsplit(exarg_T *eap) curbuf, curwin->w_cursor.lnum); } + /* Now that lines are folded scroll to show the cursor at the same + * relative position. */ + scroll_to_fraction(curwin, curwin->w_height); } } } diff --git a/src/proto/window.pro b/src/proto/window.pro --- a/src/proto/window.pro +++ b/src/proto/window.pro @@ -56,6 +56,7 @@ void win_drag_status_line(win_T *dragwin void win_drag_vsep_line(win_T *dragwin, int offset); void set_fraction(win_T *wp); void win_new_height(win_T *wp, int height); +void scroll_to_fraction(win_T *wp, int prev_height); void win_new_width(win_T *wp, int width); void win_comp_scroll(win_T *wp); void command_height(void); diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -764,6 +764,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2279, +/**/ 2278, /**/ 2277, diff --git a/src/window.c b/src/window.c --- a/src/window.c +++ b/src/window.c @@ -5674,8 +5674,6 @@ set_fraction(win_T *wp) void win_new_height(win_T *wp, int height) { - linenr_T lnum; - int sline, line_size; int prev_height = wp->w_height; /* Don't want a negative height. Happens when splitting a tiny window. @@ -5701,6 +5699,16 @@ win_new_height(win_T *wp, int height) wp->w_height = height; wp->w_skipcol = 0; + scroll_to_fraction(wp, prev_height); +} + + void +scroll_to_fraction(win_T *wp, int prev_height) +{ + linenr_T lnum; + int sline, line_size; + int height = wp->w_height; + /* Don't change w_topline when height is zero. Don't set w_topline when * 'scrollbind' is set and this isn't the current window. */ if (height > 0