| To: vim_dev@googlegroups.com |
| Subject: Patch 7.4.073 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| 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 |
| |
| |
| |
| |
| |
| *** 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|. |
| |
| |
| |
| |
| *** 1949,1954 **** |
| --- 1949,1955 ---- |
| clear_string_option(&buf->b_p_qe); |
| #endif |
| buf->b_p_ar = -1; |
| + buf->b_p_ul = NO_LOCAL_UNDOLEVEL; |
| } |
| |
| /* |
| |
| |
| |
| *** 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; |
| |
| |
| |
| *** 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 |
| |
| |
| |
| *** 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 |
| |
| |
| |
| *** 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 |
| { |
| |
| |
| |
| *** 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 /// |