diff --git a/7.4.073 b/7.4.073 new file mode 100644 index 0000000..7d9cedc --- /dev/null +++ b/7.4.073 @@ -0,0 +1,404 @@ +To: vim_dev@googlegroups.com +Subject: Patch 7.4.073 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +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 -- Bram@Moolenaar.net -- 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 ///