forked from aniani/vim
patch 9.0.0647: the 'splitscroll' option is not a good name
Problem: The 'splitscroll' option is not a good name. Solution: Rename 'splitscroll' to 'splitkeep' and make it a string option, also supporting "topline". (Luuk van Baal, closes #11258)
This commit is contained in:
committed by
Bram Moolenaar
parent
6b2d4ff714
commit
13ece2ae1d
60
src/window.c
60
src/window.c
@@ -1325,7 +1325,7 @@ win_split_ins(
|
||||
win_equal(wp, TRUE,
|
||||
(flags & WSP_VERT) ? (dir == 'v' ? 'b' : 'h')
|
||||
: dir == 'h' ? 'b' : 'v');
|
||||
else if (!p_spsc && wp != aucmd_win)
|
||||
else if (*p_spk != 'c' && wp != aucmd_win)
|
||||
win_fix_scroll(FALSE);
|
||||
|
||||
// Don't change the window height/width to 'winheight' / 'winwidth' if a
|
||||
@@ -1411,7 +1411,7 @@ win_init(win_T *newp, win_T *oldp, int flags UNUSED)
|
||||
newp->w_prevdir = (oldp->w_prevdir == NULL)
|
||||
? NULL : vim_strsave(oldp->w_prevdir);
|
||||
|
||||
if (!p_spsc)
|
||||
if (*p_spk != 'c')
|
||||
{
|
||||
newp->w_botline = oldp->w_botline;
|
||||
newp->w_prev_height = oldp->w_height - WINBAR_HEIGHT(oldp);
|
||||
@@ -1925,7 +1925,7 @@ win_equal(
|
||||
win_equal_rec(next_curwin == NULL ? curwin : next_curwin, current,
|
||||
topframe, dir, 0, tabline_height(),
|
||||
(int)Columns, topframe->fr_height);
|
||||
if (!p_spsc && next_curwin != aucmd_win)
|
||||
if (*p_spk != 'c' && next_curwin != aucmd_win)
|
||||
win_fix_scroll(TRUE);
|
||||
}
|
||||
|
||||
@@ -2733,7 +2733,7 @@ win_close(win_T *win, int free_buf)
|
||||
else
|
||||
{
|
||||
win_comp_pos();
|
||||
if (!p_spsc)
|
||||
if (*p_spk != 'c')
|
||||
win_fix_scroll(FALSE);
|
||||
}
|
||||
if (close_curwin)
|
||||
@@ -4931,7 +4931,7 @@ win_enter_ext(win_T *wp, int flags)
|
||||
|
||||
// Might need to scroll the old window before switching, e.g., when the
|
||||
// cursor was moved.
|
||||
if (p_spsc)
|
||||
if (*p_spk == 'c')
|
||||
update_topline();
|
||||
|
||||
// may have to copy the buffer options when 'cpo' contains 'S'
|
||||
@@ -4947,7 +4947,7 @@ win_enter_ext(win_T *wp, int flags)
|
||||
check_cursor();
|
||||
if (!virtual_active())
|
||||
curwin->w_cursor.coladd = 0;
|
||||
if (p_spsc) // assume cursor position needs updating.
|
||||
if (*p_spk == 'c') // assume cursor position needs updating
|
||||
changed_line_abv_curs();
|
||||
else
|
||||
win_fix_cursor(TRUE);
|
||||
@@ -5068,7 +5068,7 @@ static int last_win_id = LOWEST_WIN_ID - 1;
|
||||
* FALSE.
|
||||
*/
|
||||
static win_T *
|
||||
win_alloc(win_T *after UNUSED, int hidden UNUSED)
|
||||
win_alloc(win_T *after, int hidden)
|
||||
{
|
||||
win_T *new_wp;
|
||||
|
||||
@@ -5480,7 +5480,7 @@ shell_new_rows(void)
|
||||
compute_cmdrow();
|
||||
curtab->tp_ch_used = p_ch;
|
||||
|
||||
if (!p_spsc && !skip_win_fix_scroll)
|
||||
if (*p_spk != 'c' && !skip_win_fix_scroll)
|
||||
win_fix_scroll(TRUE);
|
||||
|
||||
#if 0
|
||||
@@ -5687,7 +5687,7 @@ win_setheight_win(int height, win_T *win)
|
||||
msg_row = row;
|
||||
msg_col = 0;
|
||||
|
||||
if (!p_spsc)
|
||||
if (*p_spk != 'c')
|
||||
win_fix_scroll(TRUE);
|
||||
|
||||
redraw_all_later(UPD_NOT_VALID);
|
||||
@@ -6218,7 +6218,7 @@ win_drag_status_line(win_T *dragwin, int offset)
|
||||
p_ch = MAX(Rows - cmdline_row, 1);
|
||||
curtab->tp_ch_used = p_ch;
|
||||
|
||||
if (!p_spsc)
|
||||
if (*p_spk != 'c')
|
||||
win_fix_scroll(TRUE);
|
||||
|
||||
redraw_all_later(UPD_SOME_VALID);
|
||||
@@ -6348,7 +6348,7 @@ set_fraction(win_T *wp)
|
||||
}
|
||||
|
||||
/*
|
||||
* Handle scroll position for 'nosplitscroll'. Replaces scroll_to_fraction()
|
||||
* Handle scroll position for 'splitkeep'. Replaces scroll_to_fraction()
|
||||
* call from win_new_height(). Instead we iterate over all windows in a
|
||||
* tabpage and calculate the new scroll position.
|
||||
* TODO: Ensure this also works with wrapped lines.
|
||||
@@ -6362,14 +6362,14 @@ win_fix_scroll(int resize)
|
||||
win_T *wp;
|
||||
linenr_T lnum;
|
||||
|
||||
skip_update_topline = TRUE; // avoid scrolling in curs_columns()
|
||||
skip_update_topline = TRUE;
|
||||
FOR_ALL_WINDOWS(wp)
|
||||
{
|
||||
// Skip when window height has not changed.
|
||||
if (wp->w_height != wp->w_prev_height)
|
||||
{
|
||||
// If window has moved update botline to keep the same screenlines.
|
||||
if (wp->w_winrow != wp->w_prev_winrow)
|
||||
if (*p_spk == 's' && wp->w_winrow != wp->w_prev_winrow)
|
||||
{
|
||||
lnum = wp->w_cursor.lnum;
|
||||
diff = (wp->w_winrow - wp->w_prev_winrow)
|
||||
@@ -6403,7 +6403,7 @@ win_fix_scroll(int resize)
|
||||
}
|
||||
|
||||
/*
|
||||
* Make sure the cursor position is valid for 'nosplitscroll'.
|
||||
* Make sure the cursor position is valid for 'splitkeep'.
|
||||
* If it is not, put the cursor position in the jumplist and move it.
|
||||
* If we are not in normal mode, scroll to make valid instead.
|
||||
*/
|
||||
@@ -6413,9 +6413,9 @@ win_fix_cursor(int normal)
|
||||
long so = get_scrolloff_value();
|
||||
win_T *wp = curwin;
|
||||
linenr_T nlnum = 0;
|
||||
linenr_T lnum = wp->w_cursor.lnum;
|
||||
linenr_T bot;
|
||||
linenr_T top;
|
||||
linenr_T lnum = wp->w_cursor.lnum;
|
||||
linenr_T bot;
|
||||
linenr_T top;
|
||||
|
||||
if (wp->w_buffer->b_ml.ml_line_count < wp->w_height)
|
||||
return;
|
||||
@@ -6429,25 +6429,23 @@ win_fix_cursor(int normal)
|
||||
top = cursor_down_inner(wp, so);
|
||||
wp->w_cursor.lnum = wp->w_botline - 1;
|
||||
bot = cursor_up_inner(wp, so);
|
||||
wp->w_cursor.lnum = lnum;
|
||||
// Check if cursor position is above or below valid cursor range.
|
||||
if (lnum > bot && (wp->w_botline - wp->w_buffer->b_ml.ml_line_count) != 1)
|
||||
nlnum = bot;
|
||||
else if (lnum < top && wp->w_topline != 1)
|
||||
nlnum = (so == wp->w_height / 2) ? bot : top;
|
||||
|
||||
wp->w_cursor.lnum = lnum;
|
||||
|
||||
if (nlnum) // Cursor is invalid for current scroll position.
|
||||
{
|
||||
if (normal) // Save to jumplist and set cursor to avoid scrolling.
|
||||
{
|
||||
setmark('\'');
|
||||
wp->w_cursor.lnum = nlnum;
|
||||
curs_columns(TRUE); // validate w_wrow
|
||||
}
|
||||
else // Scroll instead when not in normal mode.
|
||||
{
|
||||
wp->w_fraction = 0.5 * FRACTION_MULT;
|
||||
wp->w_fraction = (nlnum == bot) ? FRACTION_MULT : 0;
|
||||
scroll_to_fraction(wp, wp->w_prev_height);
|
||||
validate_botline_win(curwin);
|
||||
}
|
||||
@@ -6474,7 +6472,7 @@ win_new_height(win_T *wp, int height)
|
||||
|
||||
if (wp->w_height > 0)
|
||||
{
|
||||
if (wp == curwin && p_spsc)
|
||||
if (wp == curwin && *p_spk == 'c')
|
||||
// w_wrow needs to be valid. When setting 'laststatus' this may
|
||||
// call win_new_height() recursively.
|
||||
validate_cursor();
|
||||
@@ -6490,7 +6488,7 @@ win_new_height(win_T *wp, int height)
|
||||
|
||||
// There is no point in adjusting the scroll position when exiting. Some
|
||||
// values might be invalid.
|
||||
if (!exiting && p_spsc)
|
||||
if (!exiting && *p_spk == 'c')
|
||||
scroll_to_fraction(wp, prev_height);
|
||||
}
|
||||
|
||||
@@ -6604,7 +6602,7 @@ scroll_to_fraction(win_T *wp, int prev_height)
|
||||
|
||||
if (wp == curwin)
|
||||
{
|
||||
if (p_spsc && get_scrolloff_value())
|
||||
if (get_scrolloff_value())
|
||||
update_topline();
|
||||
curs_columns(FALSE); // validate w_wrow
|
||||
}
|
||||
@@ -6627,15 +6625,13 @@ win_new_width(win_T *wp, int width)
|
||||
wp->w_width = width < 0 ? 0 : width;
|
||||
wp->w_lines_valid = 0;
|
||||
changed_line_abv_curs_win(wp);
|
||||
// Handled in win_fix_scroll()
|
||||
if (p_spsc)
|
||||
invalidate_botline_win(wp);
|
||||
if (wp == curwin)
|
||||
{
|
||||
invalidate_botline_win(wp);
|
||||
if (wp == curwin)
|
||||
{
|
||||
update_topline();
|
||||
curs_columns(TRUE); // validate w_wrow
|
||||
}
|
||||
skip_update_topline = (*p_spk != 'c');
|
||||
update_topline();
|
||||
curs_columns(TRUE); // validate w_wrow
|
||||
skip_update_topline = FALSE;
|
||||
}
|
||||
redraw_win_later(wp, UPD_NOT_VALID);
|
||||
wp->w_redr_status = TRUE;
|
||||
|
Reference in New Issue
Block a user