curwin->w_cursor.coladd = 0;
#endif
curwin->w_set_curswant = TRUE;
+#ifdef FEAT_AUTOCMD
+ curwin->w_topline_was_set = FALSE;
+#endif
/* Make sure the buffer is loaded. */
if (curbuf->b_ml.ml_mfp == NULL) /* need to load the file */
maketitle();
#endif
#ifdef FEAT_AUTOCMD
- if (curwin->w_topline == 1) /* when autocmds didn't change it */
+ /* when autocmds didn't change it */
+ if (curwin->w_topline == 1 && !curwin->w_topline_was_set)
#endif
scroll_cursor_halfway(FALSE); /* redisplay at correct position */
if (curwin->w_botline <= curbuf->b_ml.ml_line_count)
{
- if (curwin->w_cursor.lnum < curwin->w_botline
- && ((long)curwin->w_cursor.lnum
+ if (curwin->w_cursor.lnum < curwin->w_botline)
+ {
+ if (((long)curwin->w_cursor.lnum
>= (long)curwin->w_botline - p_so
#ifdef FEAT_FOLDING
|| hasAnyFolding(curwin)
#endif
))
- {
+ {
lineoff_T loff;
- /* Cursor is above botline, check if there are 'scrolloff'
- * window lines below the cursor. If not, need to scroll. */
+ /* Cursor is (a few lines) above botline, check if there are
+ * 'scrolloff' window lines below the cursor. If not, need to
+ * scroll. */
n = curwin->w_empty_rows;
loff.lnum = curwin->w_cursor.lnum;
#ifdef FEAT_FOLDING
if (n >= p_so)
/* sufficient context, no need to scroll */
check_botline = FALSE;
+ }
+ else
+ /* sufficient context, no need to scroll */
+ check_botline = FALSE;
}
if (check_botline)
{
/* Approximate the value of w_botline */
wp->w_botline += lnum - wp->w_topline;
wp->w_topline = lnum;
+#ifdef FEAT_AUTOCMD
+ wp->w_topline_was_set = TRUE;
+#endif
#ifdef FEAT_DIFF
wp->w_topfill = 0;
#endif
#endif
/*
- * The next three specify the offsets for displaying the buffer:
+ * "w_topline", "w_leftcol" and "w_skipcol" specify the offsets for
+ * displaying the buffer.
*/
linenr_T w_topline; /* buffer line number of the line at the
top of the window */
+#ifdef FEAT_AUTOCMD
+ char w_topline_was_set; /* flag set to TRUE when topline is set,
+ e.g. by winrestview() */
+#endif
#ifdef FEAT_DIFF
int w_topfill; /* number of filler lines above w_topline */
int w_old_topfill; /* w_topfill at last redraw */