To: vim-dev@vim.org Subject: Patch 7.2.042 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit ------------ Patch 7.2.042 Problem: When using winrestview() in a BufWinEnter autocommand the window is scrolled anyway. (Matt Zyzik) Solution: Don't recompute topline when above 'scrolloff' from the bottom. Don't always put the cursor halfway when entering a buffer. Add "w_topline_was_set". Files: src/buffer.c, src/move.c, src/structs.h *** ../vim-7.2.041/src/buffer.c Sat Nov 15 14:10:23 2008 --- src/buffer.c Sat Nov 15 14:58:52 2008 *************** *** 1401,1406 **** --- 1401,1409 ---- 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 */ *************** *** 1440,1446 **** maketitle(); #endif #ifdef FEAT_AUTOCMD ! if (curwin->w_topline == 1) /* when autocmds didn't change it */ #endif scroll_cursor_halfway(FALSE); /* redisplay at correct position */ --- 1443,1450 ---- maketitle(); #endif #ifdef FEAT_AUTOCMD ! /* 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 */ *** ../vim-7.2.041/src/move.c Sun Jul 13 19:25:23 2008 --- src/move.c Sat Nov 15 14:56:47 2008 *************** *** 280,297 **** if (curwin->w_botline <= curbuf->b_ml.ml_line_count) { ! if (curwin->w_cursor.lnum < curwin->w_botline ! && ((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. */ n = curwin->w_empty_rows; loff.lnum = curwin->w_cursor.lnum; #ifdef FEAT_FOLDING --- 280,299 ---- if (curwin->w_botline <= curbuf->b_ml.ml_line_count) { ! 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 (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 *************** *** 317,322 **** --- 319,328 ---- 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) { *************** *** 509,514 **** --- 515,523 ---- /* 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 *** ../vim-7.2.041/src/structs.h Sun Nov 9 13:43:25 2008 --- src/structs.h Sat Nov 15 14:56:42 2008 *************** *** 1784,1793 **** #endif /* ! * The next three 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_DIFF int w_topfill; /* number of filler lines above w_topline */ int w_old_topfill; /* w_topfill at last redraw */ --- 1784,1798 ---- #endif /* ! * "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 */ *** ../vim-7.2.041/src/version.c Sat Nov 15 14:10:23 2008 --- src/version.c Sat Nov 15 16:01:29 2008 *************** *** 678,679 **** --- 678,681 ---- { /* Add new patch number below this line */ + /**/ + 42, /**/ -- hundred-and-one symptoms of being an internet addict: 261. You find diskettes in your pockets when doing laundry. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ download, build and distribute -- http://www.A-A-P.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///