Problem: Setting w_leftcol and handling side effects is confusing.
Solution: Use a function to set w_leftcol() and handle side effects.
}
/*
- * When curwin->w_leftcol has changed, adjust the cursor position.
+ * Set "curwin->w_leftcol" to "leftcol".
+ * Adjust the cursor position if needed.
* Return TRUE if the cursor was moved.
*/
int
-leftcol_changed(void)
+set_leftcol(colnr_T leftcol)
{
- long lastcol;
- colnr_T s, e;
int retval = FALSE;
- long siso = get_sidescrolloff_value();
+
+ // Return quickly when there is no change.
+ if (curwin->w_leftcol == leftcol)
+ return FALSE;
+ curwin->w_leftcol = leftcol;
changed_cline_bef_curs();
- lastcol = curwin->w_leftcol + curwin->w_width - curwin_col_off() - 1;
+ long lastcol = curwin->w_leftcol + curwin->w_width - curwin_col_off() - 1;
validate_virtcol();
- /*
- * If the cursor is right or left of the screen, move it to last or first
- * character.
- */
+ // If the cursor is right or left of the screen, move it to last or first
+ // visible character.
+ long siso = get_sidescrolloff_value();
if (curwin->w_virtcol > (colnr_T)(lastcol - siso))
{
retval = TRUE;
(void)coladvance((colnr_T)(curwin->w_leftcol + siso));
}
- /*
- * If the start of the character under the cursor is not on the screen,
- * advance the cursor one more char. If this fails (last char of the
- * line) adjust the scrolling.
- */
+ // If the start of the character under the cursor is not on the screen,
+ // advance the cursor one more char. If this fails (last char of the
+ // line) adjust the scrolling.
+ colnr_T s, e;
getvvcol(curwin, &curwin->w_cursor, &s, NULL, &e);
if (e > (colnr_T)lastcol)
{
if (curwin->w_leftcol == (colnr_T)leftcol)
return FALSE; // already there
- curwin->w_leftcol = (colnr_T)leftcol;
-
// When the line of the cursor is too short, move the cursor to the
// longest visible line.
if (
curwin->w_cursor.col = 0;
}
- return leftcol_changed();
+ return set_leftcol((colnr_T)leftcol);
}
/*
send_keys_to_term(curbuf->b_term, cap->cmdchar, mod_mask, FALSE);
else
# endif
- // For insert mode, don't scroll the window in which completion is being
+ // For Insert mode, don't scroll the window in which completion is being
// done.
if (mode == MODE_NORMAL || !pum_visible() || curwin != old_curwin)
{
}
// do the horizontal scroll
- if (want_hor && curwin->w_leftcol != tgt_leftcol)
- {
- curwin->w_leftcol = tgt_leftcol;
- leftcol_changed();
- }
+ if (want_hor)
+ (void)set_leftcol(tgt_leftcol);
}
// reset current-window
scrollup(count, TRUE);
else
scrolldown(count, TRUE);
- if (get_scrolloff_value())
+ if (get_scrolloff_value() > 0)
{
// Adjust the cursor position for 'scrolloff'. Mark w_topline as
// valid, otherwise the screen jumps back at the end of the file.
case 'h':
case K_LEFT:
if (!curwin->w_p_wrap)
- {
- if ((colnr_T)cap->count1 > curwin->w_leftcol)
- curwin->w_leftcol = 0;
- else
- curwin->w_leftcol -= (colnr_T)cap->count1;
- leftcol_changed();
- }
+ (void)set_leftcol((colnr_T)cap->count1 > curwin->w_leftcol
+ ? 0 : curwin->w_leftcol - (colnr_T)cap->count1);
break;
- // "zL" - scroll screen left half-page
+ // "zL" - scroll window left half-page
case 'L': cap->count1 *= curwin->w_width / 2;
// FALLTHROUGH
- // "zl" - scroll screen to the left
+ // "zl" - scroll window to the left if not wrapping
case 'l':
case K_RIGHT:
if (!curwin->w_p_wrap)
- {
- // scroll the window left
- curwin->w_leftcol += (colnr_T)cap->count1;
- leftcol_changed();
- }
+ (void)set_leftcol(curwin->w_leftcol + (colnr_T)cap->count1);
break;
// "zs" - scroll screen, cursor at the start
void check_cursor(void);
void check_visual_pos(void);
void adjust_cursor_col(void);
-int leftcol_changed(void);
+int set_leftcol(colnr_T leftcol);
int copy_option_part(char_u **option, char_u *buf, int maxlen, char *sep_chars);
int vim_isspace(int x);
int simplify_key(int key, int *modifiers);
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 901,
/**/
900,
/**/