Patch 7.4.073
Problem:    Setting undolevels for one buffer changes undo in another.
Solution:   Make 'undolevels' a global-local option. (Christian Brabandt)
Files:      runtime/doc/options.txt, src/buffer.c, src/option.c, src/option.h
            src/structs.h, src/undo.c


*** ../vim-7.4.072/runtime/doc/options.txt      2013-08-10 13:24:57.000000000 
+0200
--- runtime/doc/options.txt     2013-11-06 04:18:43.000000000 +0100
***************
*** 7594,7600 ****
                                                *'undolevels'* *'ul'*
  'undolevels' 'ul'     number  (default 100, 1000 for Unix, VMS,
                                                Win32 and OS/2)
!                       global
                        {not in Vi}
        Maximum number of changes that can be undone.  Since undo information
        is kept in memory, higher numbers will cause more memory to be used
--- 7594,7600 ----
                                                *'undolevels'* *'ul'*
  'undolevels' 'ul'     number  (default 100, 1000 for Unix, VMS,
                                                Win32 and OS/2)
!                       global or local to buffer |global-local|
                        {not in Vi}
        Maximum number of changes that can be undone.  Since undo information
        is kept in memory, higher numbers will cause more memory to be used
***************
*** 7605,7612 ****
  <     But you can also get Vi compatibility by including the 'u' flag in
        'cpoptions', and still be able to use CTRL-R to repeat undo.
        Also see |undo-two-ways|.
!       Set to a negative number for no undo at all: >
!               set ul=-1
  <     This helps when you run out of memory for a single change.
        Also see |clear-undo|.
  
--- 7605,7613 ----
  <     But you can also get Vi compatibility by including the 'u' flag in
        'cpoptions', and still be able to use CTRL-R to repeat undo.
        Also see |undo-two-ways|.
!       Set to -1 for no undo at all.  You might want to do this only for the
!       current buffer: >
!               setlocal ul=-1
  <     This helps when you run out of memory for a single change.
        Also see |clear-undo|.
  
*** ../vim-7.4.072/src/buffer.c 2013-11-05 17:40:47.000000000 +0100
--- src/buffer.c        2013-11-06 04:25:27.000000000 +0100
***************
*** 1949,1954 ****
--- 1949,1955 ----
      clear_string_option(&buf->b_p_qe);
  #endif
      buf->b_p_ar = -1;
+     buf->b_p_ul = NO_LOCAL_UNDOLEVEL;
  }
  
  /*
*** ../vim-7.4.072/src/option.c 2013-11-05 07:12:59.000000000 +0100
--- src/option.c        2013-11-06 04:34:23.000000000 +0100
***************
*** 234,239 ****
--- 234,240 ----
  #ifdef FEAT_STL_OPT
  # define PV_STL               OPT_BOTH(OPT_WIN(WV_STL))
  #endif
+ #define PV_UL         OPT_BOTH(OPT_BUF(BV_UL))
  #ifdef FEAT_WINDOWS
  # define PV_WFH               OPT_WIN(WV_WFH)
  #endif
***************
*** 2683,2689 ****
  #endif
                            {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
      {"undolevels",  "ul",   P_NUM|P_VI_DEF,
!                           (char_u *)&p_ul, PV_NONE,
                            {
  #if defined(UNIX) || defined(WIN3264) || defined(OS2) || defined(VMS)
                            (char_u *)1000L,
--- 2684,2690 ----
  #endif
                            {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
      {"undolevels",  "ul",   P_NUM|P_VI_DEF,
!                           (char_u *)&p_ul, PV_UL,
                            {
  #if defined(UNIX) || defined(WIN3264) || defined(OS2) || defined(VMS)
                            (char_u *)1000L,
***************
*** 3313,3318 ****
--- 3314,3320 ----
  
      curbuf->b_p_initialized = TRUE;
      curbuf->b_p_ar = -1;      /* no local 'autoread' value */
+     curbuf->b_p_ul = NO_LOCAL_UNDOLEVEL;
      check_buf_options(curbuf);
      check_win_options(curwin);
      check_options();
***************
*** 4512,4519 ****
                                                ((flags & P_VI_DEF) || cp_val)
                                                 ?  VI_DEFAULT : VIM_DEFAULT];
                        else if (nextchar == '<')
!                           value = *(long *)get_varp_scope(&(options[opt_idx]),
!                                                                 OPT_GLOBAL);
                        else if (((long *)varp == &p_wc
                                    || (long *)varp == &p_wcm)
                                && (*arg == '<'
--- 4514,4529 ----
                                                ((flags & P_VI_DEF) || cp_val)
                                                 ?  VI_DEFAULT : VIM_DEFAULT];
                        else if (nextchar == '<')
!                       {
!                           /* For 'undolevels' NO_LOCAL_UNDOLEVEL means to
!                            * use the global value. */
!                           if ((long *)varp == &curbuf->b_p_ul
!                                                   && opt_flags == OPT_LOCAL)
!                               value = NO_LOCAL_UNDOLEVEL;
!                           else
!                               value = *(long *)get_varp_scope(
!                                            &(options[opt_idx]), OPT_GLOBAL);
!                       }
                        else if (((long *)varp == &p_wc
                                    || (long *)varp == &p_wcm)
                                && (*arg == '<'
***************
*** 8487,8492 ****
--- 8497,8509 ----
        u_sync(TRUE);
        p_ul = value;
      }
+     else if (pp == &curbuf->b_p_ul)
+     {
+       /* use the old value, otherwise u_sync() may not work properly */
+       curbuf->b_p_ul = old_value;
+       u_sync(TRUE);
+       curbuf->b_p_ul = value;
+     }
  
  #ifdef FEAT_LINEBREAK
      /* 'numberwidth' must be positive */
***************
*** 9720,9726 ****
  /*
   * Unset local option value, similar to ":set opt<".
   */
- 
      void
  unset_global_local_option(name, from)
      char_u    *name;
--- 9737,9742 ----
***************
*** 9793,9798 ****
--- 9809,9817 ----
            clear_string_option(&((win_T *)from)->w_p_stl);
            break;
  #endif
+       case PV_UL:
+           buf->b_p_ul = NO_LOCAL_UNDOLEVEL;
+           break;
      }
  }
  
***************
*** 9841,9846 ****
--- 9860,9866 ----
  #ifdef FEAT_STL_OPT
            case PV_STL:  return (char_u *)&(curwin->w_p_stl);
  #endif
+           case PV_UL:   return (char_u *)&(curbuf->b_p_ul);
        }
        return NULL; /* "cannot happen" */
      }
***************
*** 9905,9910 ****
--- 9925,9932 ----
        case PV_STL:    return *curwin->w_p_stl != NUL
                                    ? (char_u *)&(curwin->w_p_stl) : p->var;
  #endif
+       case PV_UL:     return curbuf->b_p_ul != NO_LOCAL_UNDOLEVEL
+                                   ? (char_u *)&(curbuf->b_p_ul) : p->var;
  
  #ifdef FEAT_ARABIC
        case PV_ARAB:   return (char_u *)&(curwin->w_p_arab);
***************
*** 10445,10450 ****
--- 10467,10473 ----
            /* options that are normally global but also have a local value
             * are not copied, start using the global value */
            buf->b_p_ar = -1;
+           buf->b_p_ul = NO_LOCAL_UNDOLEVEL;
  #ifdef FEAT_QUICKFIX
            buf->b_p_gp = empty_option;
            buf->b_p_mp = empty_option;
*** ../vim-7.4.072/src/option.h 2013-06-26 18:41:39.000000000 +0200
--- src/option.h        2013-11-06 04:17:40.000000000 +0100
***************
*** 1031,1036 ****
--- 1031,1037 ----
      , BV_TW
      , BV_TX
      , BV_UDF
+     , BV_UL
      , BV_WM
      , BV_COUNT            /* must be the last one */
  };
***************
*** 1109,1111 ****
--- 1110,1115 ----
      , WV_WRAP
      , WV_COUNT            /* must be the last one */
  };
+ 
+ /* Value for b_p_ul indicating the global value must be used. */
+ #define NO_LOCAL_UNDOLEVEL -123456
*** ../vim-7.4.072/src/structs.h        2013-11-05 07:12:59.000000000 +0100
--- src/structs.h       2013-11-06 04:26:17.000000000 +0100
***************
*** 1627,1632 ****
--- 1627,1633 ----
      char_u    *b_p_dict;      /* 'dictionary' local value */
      char_u    *b_p_tsr;       /* 'thesaurus' local value */
  #endif
+     long      b_p_ul;         /* 'undolevels' local value */
  #ifdef FEAT_PERSISTENT_UNDO
      int               b_p_udf;        /* 'undofile' */
  #endif
*** ../vim-7.4.072/src/undo.c   2013-09-08 15:40:45.000000000 +0200
--- src/undo.c  2013-11-06 04:33:12.000000000 +0100
***************
*** 83,88 ****
--- 83,89 ----
  
  #include "vim.h"
  
+ static long get_undolevel __ARGS((void));
  static void u_unch_branch __ARGS((u_header_T *uhp));
  static u_entry_T *u_get_headentry __ARGS((void));
  static void u_getbot __ARGS((void));
***************
*** 336,341 ****
--- 337,353 ----
  }
  
  /*
+  * Get the undolevle value for the current buffer.
+  */
+     static long
+ get_undolevel()
+ {
+     if (curbuf->b_p_ul == NO_LOCAL_UNDOLEVEL)
+       return p_ul;
+     return curbuf->b_p_ul;
+ }
+ 
+ /*
   * Common code for various ways to save text before a change.
   * "top" is the line above the first changed line.
   * "bot" is the line below the last changed line.
***************
*** 419,425 ****
        curbuf->b_new_change = TRUE;
  #endif
  
!       if (p_ul >= 0)
        {
            /*
             * Make a new header entry.  Do this first so that we don't mess
--- 431,437 ----
        curbuf->b_new_change = TRUE;
  #endif
  
!       if (get_undolevel() >= 0)
        {
            /*
             * Make a new header entry.  Do this first so that we don't mess
***************
*** 449,455 ****
        /*
         * free headers to keep the size right
         */
!       while (curbuf->b_u_numhead > p_ul && curbuf->b_u_oldhead != NULL)
        {
            u_header_T      *uhfree = curbuf->b_u_oldhead;
  
--- 461,468 ----
        /*
         * free headers to keep the size right
         */
!       while (curbuf->b_u_numhead > get_undolevel()
!                                              && curbuf->b_u_oldhead != NULL)
        {
            u_header_T      *uhfree = curbuf->b_u_oldhead;
  
***************
*** 530,536 ****
      }
      else
      {
!       if (p_ul < 0)           /* no undo at all */
            return OK;
  
        /*
--- 543,549 ----
      }
      else
      {
!       if (get_undolevel() < 0)        /* no undo at all */
            return OK;
  
        /*
***************
*** 1972,1978 ****
        {
            if (curbuf->b_u_curhead == NULL)            /* first undo */
                curbuf->b_u_curhead = curbuf->b_u_newhead;
!           else if (p_ul > 0)                          /* multi level undo */
                /* get next undo */
                curbuf->b_u_curhead = curbuf->b_u_curhead->uh_next.ptr;
            /* nothing to undo */
--- 1985,1991 ----
        {
            if (curbuf->b_u_curhead == NULL)            /* first undo */
                curbuf->b_u_curhead = curbuf->b_u_newhead;
!           else if (get_undolevel() > 0)               /* multi level undo */
                /* get next undo */
                curbuf->b_u_curhead = curbuf->b_u_curhead->uh_next.ptr;
            /* nothing to undo */
***************
*** 1993,1999 ****
        }
        else
        {
!           if (curbuf->b_u_curhead == NULL || p_ul <= 0)
            {
                beep_flush();   /* nothing to redo */
                if (count == startcount - 1)
--- 2006,2012 ----
        }
        else
        {
!           if (curbuf->b_u_curhead == NULL || get_undolevel() <= 0)
            {
                beep_flush();   /* nothing to redo */
                if (count == startcount - 1)
***************
*** 2751,2757 ****
      if (im_is_preediting())
        return;             /* XIM is busy, don't break an undo sequence */
  #endif
!     if (p_ul < 0)
        curbuf->b_u_synced = TRUE;  /* no entries, nothing to do */
      else
      {
--- 2764,2770 ----
      if (im_is_preediting())
        return;             /* XIM is busy, don't break an undo sequence */
  #endif
!     if (get_undolevel() < 0)
        curbuf->b_u_synced = TRUE;  /* no entries, nothing to do */
      else
      {
***************
*** 2911,2917 ****
      }
      if (!curbuf->b_u_synced)
        return;             /* already unsynced */
!     if (p_ul < 0)
        return;             /* no entries, nothing to do */
      else
      {
--- 2924,2930 ----
      }
      if (!curbuf->b_u_synced)
        return;             /* already unsynced */
!     if (get_undolevel() < 0)
        return;             /* no entries, nothing to do */
      else
      {
*** ../vim-7.4.072/src/version.c        2013-11-06 04:04:29.000000000 +0100
--- src/version.c       2013-11-06 05:21:43.000000000 +0100
***************
*** 740,741 ****
--- 740,743 ----
  {   /* Add new patch number below this line */
+ /**/
+     73,
  /**/

-- 
Living on Earth includes an annual free trip around the Sun.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Raspunde prin e-mail lui