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 -- [EMAIL PROTECTED] -- 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    ///

--~--~---------~--~----~------------~-------~--~----~
You received this message from the "vim_dev" maillist.
For more information, visit http://www.vim.org/maillist.php
-~----------~----~----~----~------~----~------~--~---

Raspunde prin e-mail lui