# HG changeset patch # User Bram Moolenaar # Date 1332957544 -7200 # Node ID 21219ffc97903684349f1fcc843eb61838877874 # Parent 1bf039d645cfd9776eaf60a6f95ba82e3abd1b1c updated for version 7.3.487 Problem: When setting 'timeoutlen' or 'ttimeoutlen' the column for vertical movement is reset unnecessarily. Solution: Do not set w_set_curswant for every option. Add a test for this. (Kana Natsuno) Add the P_CURSWANT flag for options. diff --git a/src/option.c b/src/option.c --- a/src/option.c +++ b/src/option.c @@ -433,17 +433,19 @@ struct vimoption #define P_RCLR 0x7000 /* clear and redraw all */ #define P_COMMA 0x8000 /* comma separated list */ -#define P_NODUP 0x10000L/* don't allow duplicate strings */ -#define P_FLAGLIST 0x20000L/* list of single-char flags */ - -#define P_SECURE 0x40000L/* cannot change in modeline or secure mode */ -#define P_GETTEXT 0x80000L/* expand default value with _() */ -#define P_NOGLOB 0x100000L/* do not use local value for global vimrc */ -#define P_NFNAME 0x200000L/* only normal file name chars allowed */ -#define P_INSECURE 0x400000L/* option was set from a modeline */ -#define P_PRI_MKRC 0x800000L/* priority for :mkvimrc (setting option has +#define P_NODUP 0x10000L /* don't allow duplicate strings */ +#define P_FLAGLIST 0x20000L /* list of single-char flags */ + +#define P_SECURE 0x40000L /* cannot change in modeline or secure mode */ +#define P_GETTEXT 0x80000L /* expand default value with _() */ +#define P_NOGLOB 0x100000L /* do not use local value for global vimrc */ +#define P_NFNAME 0x200000L /* only normal file name chars allowed */ +#define P_INSECURE 0x400000L /* option was set from a modeline */ +#define P_PRI_MKRC 0x800000L /* priority for :mkvimrc (setting option has side effects) */ -#define P_NO_ML 0x1000000L/* not allowed in modeline */ +#define P_NO_ML 0x1000000L /* not allowed in modeline */ +#define P_CURSWANT 0x2000000L /* update curswant required; not needed when + * there is a redraw flag */ #define ISK_LATIN1 (char_u *)"@,48-57,_,192-255" @@ -479,7 +481,7 @@ static struct vimoption #endif options[] = { - {"aleph", "al", P_NUM|P_VI_DEF, + {"aleph", "al", P_NUM|P_VI_DEF|P_CURSWANT, #ifdef FEAT_RIGHTLEFT (char_u *)&p_aleph, PV_NONE, #else @@ -501,7 +503,7 @@ static struct vimoption {(char_u *)FALSE, (char_u *)FALSE} #endif SCRIPTID_INIT}, - {"arabic", "arab", P_BOOL|P_VI_DEF|P_VIM, + {"arabic", "arab", P_BOOL|P_VI_DEF|P_VIM|P_CURSWANT, #ifdef FEAT_ARABIC (char_u *)VAR_WIN, PV_ARAB, #else @@ -778,7 +780,7 @@ static struct vimoption {"columns", "co", P_NUM|P_NODEFAULT|P_NO_MKRC|P_VI_DEF|P_RCLR, (char_u *)&Columns, PV_NONE, {(char_u *)80L, (char_u *)0L} SCRIPTID_INIT}, - {"comments", "com", P_STRING|P_ALLOCED|P_VI_DEF|P_COMMA|P_NODUP, + {"comments", "com", P_STRING|P_ALLOCED|P_VI_DEF|P_COMMA|P_NODUP|P_CURSWANT, #ifdef FEAT_COMMENTS (char_u *)&p_com, PV_COM, {(char_u *)"s1:/*,mb:*,ex:*/,://,b:#,:%,:XCOMM,n:>,fb:-", @@ -788,7 +790,7 @@ static struct vimoption {(char_u *)0L, (char_u *)0L} #endif SCRIPTID_INIT}, - {"commentstring", "cms", P_STRING|P_ALLOCED|P_VI_DEF, + {"commentstring", "cms", P_STRING|P_ALLOCED|P_VI_DEF|P_CURSWANT, #ifdef FEAT_FOLDING (char_u *)&p_cms, PV_CMS, {(char_u *)"/*%s*/", (char_u *)0L} @@ -953,7 +955,7 @@ static struct vimoption {"debug", NULL, P_STRING|P_VI_DEF, (char_u *)&p_debug, PV_NONE, {(char_u *)"", (char_u *)0L} SCRIPTID_INIT}, - {"define", "def", P_STRING|P_ALLOCED|P_VI_DEF, + {"define", "def", P_STRING|P_ALLOCED|P_VI_DEF|P_CURSWANT, #ifdef FEAT_FIND_ID (char_u *)&p_def, PV_DEF, {(char_u *)"^\\s*#\\s*define", (char_u *)0L} @@ -983,7 +985,7 @@ static struct vimoption (char_u *)NULL, PV_NONE, #endif {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"diffexpr", "dex", P_STRING|P_VI_DEF|P_SECURE, + {"diffexpr", "dex", P_STRING|P_VI_DEF|P_SECURE|P_CURSWANT, #if defined(FEAT_DIFF) && defined(FEAT_EVAL) (char_u *)&p_dex, PV_NONE, {(char_u *)"", (char_u *)0L} @@ -1099,7 +1101,7 @@ static struct vimoption {(char_u *)0L, (char_u *)0L} #endif SCRIPTID_INIT}, - {"fileformat", "ff", P_STRING|P_ALLOCED|P_VI_DEF|P_RSTAT|P_NO_MKRC, + {"fileformat", "ff", P_STRING|P_ALLOCED|P_VI_DEF|P_RSTAT|P_NO_MKRC|P_CURSWANT, (char_u *)&p_ff, PV_FF, {(char_u *)DFLT_FF, (char_u *)0L} SCRIPTID_INIT}, {"fileformats", "ffs", P_STRING|P_VIM|P_COMMA|P_NODUP, @@ -1159,7 +1161,7 @@ static struct vimoption {"foldlevel", "fdl", P_NUM|P_VI_DEF|P_RWIN, (char_u *)VAR_WIN, PV_FDL, {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT}, - {"foldlevelstart","fdls", P_NUM|P_VI_DEF, + {"foldlevelstart","fdls", P_NUM|P_VI_DEF|P_CURSWANT, (char_u *)&p_fdls, PV_NONE, {(char_u *)-1L, (char_u *)0L} SCRIPTID_INIT}, {"foldmarker", "fmr", P_STRING|P_ALLOCED|P_VIM|P_VI_DEF| @@ -1176,7 +1178,7 @@ static struct vimoption {"foldnestmax", "fdn", P_NUM|P_VI_DEF|P_RWIN, (char_u *)VAR_WIN, PV_FDN, {(char_u *)20L, (char_u *)0L} SCRIPTID_INIT}, - {"foldopen", "fdo", P_STRING|P_VI_DEF|P_COMMA|P_NODUP, + {"foldopen", "fdo", P_STRING|P_VI_DEF|P_COMMA|P_NODUP|P_CURSWANT, (char_u *)&p_fdo, PV_NONE, {(char_u *)"block,hor,mark,percent,quickfix,search,tag,undo", (char_u *)0L} SCRIPTID_INIT}, @@ -1741,7 +1743,7 @@ static struct vimoption {"matchtime", "mat", P_NUM|P_VI_DEF, (char_u *)&p_mat, PV_NONE, {(char_u *)5L, (char_u *)0L} SCRIPTID_INIT}, - {"maxcombine", "mco", P_NUM|P_VI_DEF, + {"maxcombine", "mco", P_NUM|P_VI_DEF|P_CURSWANT, #ifdef FEAT_MBYTE (char_u *)&p_mco, PV_NONE, #else @@ -2710,7 +2712,7 @@ static struct vimoption {(char_u *)0L, (char_u *)0L} #endif SCRIPTID_INIT}, - {"virtualedit", "ve", P_STRING|P_COMMA|P_NODUP|P_VI_DEF|P_VIM, + {"virtualedit", "ve", P_STRING|P_COMMA|P_NODUP|P_VI_DEF|P_VIM|P_CURSWANT, #ifdef FEAT_VIRTUALEDIT (char_u *)&p_ve, PV_NONE, {(char_u *)"", (char_u *)""} @@ -7064,8 +7066,10 @@ did_set_string_option(opt_idx, varp, new } #endif - if (curwin->w_curswant != MAXCOL) - curwin->w_set_curswant = TRUE; /* in case 'showbreak' changed */ + if (curwin->w_curswant != MAXCOL + && (options[opt_idx].flags & (P_CURSWANT | P_RCLR)) != 0) + curwin->w_set_curswant = TRUE; + #ifdef FEAT_GUI /* check redraw when it's not a GUI option or the GUI is active. */ if (!redraw_gui_only || gui.in_use) @@ -7587,9 +7591,6 @@ set_bool_option(opt_idx, varp, value, op || (int *)varp == &curwin->w_p_nu || (int *)varp == &curwin->w_p_rnu) { - if (curwin->w_curswant != MAXCOL) - curwin->w_set_curswant = TRUE; - /* If 'number' is set, reset 'relativenumber'. */ /* If 'relativenumber' is set, reset 'number'. */ if ((int *)varp == &curwin->w_p_nu && curwin->w_p_nu) @@ -7834,8 +7835,6 @@ set_bool_option(opt_idx, varp, value, op { if (curwin->w_p_wrap) curwin->w_leftcol = 0; - if (curwin->w_curswant != MAXCOL) - curwin->w_set_curswant = TRUE; } #ifdef FEAT_WINDOWS @@ -8062,31 +8061,8 @@ set_bool_option(opt_idx, varp, value, op curbuf->b_p_imsearch = B_IMODE_USE_INSERT; # endif } - if (curwin->w_curswant != MAXCOL) - curwin->w_set_curswant = TRUE; - } - - else if ((int *)varp == &p_arshape) - { - if (curwin->w_curswant != MAXCOL) - curwin->w_set_curswant = TRUE; - } -#endif - -#ifdef FEAT_LINEBREAK - if ((int *)varp == &curwin->w_p_lbr) - { - if (curwin->w_curswant != MAXCOL) - curwin->w_set_curswant = TRUE; - } -#endif - -#ifdef FEAT_RIGHTLEFT - if ((int *)varp == &curwin->w_p_rl) - { - if (curwin->w_curswant != MAXCOL) - curwin->w_set_curswant = TRUE; - } + } + #endif /* @@ -8096,7 +8072,9 @@ set_bool_option(opt_idx, varp, value, op options[opt_idx].flags |= P_WAS_SET; comp_col(); /* in case 'ruler' or 'showcmd' changed */ - + if (curwin->w_curswant != MAXCOL + && (options[opt_idx].flags & (P_CURSWANT | P_RCLR)) != 0) + curwin->w_set_curswant = TRUE; check_redraw(options[opt_idx].flags); return NULL; @@ -8611,8 +8589,9 @@ set_num_option(opt_idx, varp, value, err options[opt_idx].flags |= P_WAS_SET; comp_col(); /* in case 'columns' or 'ls' changed */ - if (curwin->w_curswant != MAXCOL) - curwin->w_set_curswant = TRUE; /* in case 'tabstop' changed */ + if (curwin->w_curswant != MAXCOL + && (options[opt_idx].flags & (P_CURSWANT | P_RCLR)) != 0) + curwin->w_set_curswant = TRUE; check_redraw(options[opt_idx].flags); return errmsg; diff --git a/src/testdir/Make_amiga.mak b/src/testdir/Make_amiga.mak --- a/src/testdir/Make_amiga.mak +++ b/src/testdir/Make_amiga.mak @@ -29,7 +29,7 @@ SCRIPTS = test1.out test3.out test4.out test66.out test67.out test68.out test69.out test70.out \ test71.out test72.out test73.out test74.out test75.out \ test76.out test77.out test78.out test79.out test80.out \ - test81.out test82.out test83.out + test81.out test82.out test83.out test84.out .SUFFIXES: .in .out @@ -132,3 +132,4 @@ test80.out: test80.in test81.out: test81.in test82.out: test82.in test83.out: test83.in +test84.out: test84.in diff --git a/src/testdir/Make_dos.mak b/src/testdir/Make_dos.mak --- a/src/testdir/Make_dos.mak +++ b/src/testdir/Make_dos.mak @@ -29,7 +29,8 @@ SCRIPTS = test3.out test4.out test5.out test42.out test52.out test65.out test66.out test67.out \ test68.out test69.out test71.out test72.out test73.out \ test74.out test75.out test76.out test77.out test78.out \ - test79.out test80.out test81.out test82.out test83.out + test79.out test80.out test81.out test82.out test83.out \ + test84.out SCRIPTS32 = test50.out test70.out diff --git a/src/testdir/Make_ming.mak b/src/testdir/Make_ming.mak --- a/src/testdir/Make_ming.mak +++ b/src/testdir/Make_ming.mak @@ -49,7 +49,8 @@ SCRIPTS = test3.out test4.out test5.out test42.out test52.out test65.out test66.out test67.out \ test68.out test69.out test71.out test72.out test73.out \ test74.out test75.out test76.out test77.out test78.out \ - test79.out test80.out test81.out test82.out test83.out + test79.out test80.out test81.out test82.out test83.out \ + test84.out SCRIPTS32 = test50.out test70.out diff --git a/src/testdir/Make_os2.mak b/src/testdir/Make_os2.mak --- a/src/testdir/Make_os2.mak +++ b/src/testdir/Make_os2.mak @@ -29,7 +29,7 @@ SCRIPTS = test1.out test3.out test4.out test66.out test67.out test68.out test69.out test70.out \ test71.out test72.out test73.out test74.out test75.out \ test76.out test77.out test78.out test79.out test80.out \ - test81.out test82.out test83.out + test81.out test82.out test83.out test84.out .SUFFIXES: .in .out diff --git a/src/testdir/Make_vms.mms b/src/testdir/Make_vms.mms --- a/src/testdir/Make_vms.mms +++ b/src/testdir/Make_vms.mms @@ -4,7 +4,7 @@ # Authors: Zoltan Arpadffy, # Sandor Kopanyi, # -# Last change: 2011 Jul 15 +# Last change: 2012 Mar 28 # # This has been tested on VMS 6.2 to 8.3 on DEC Alpha, VAX and IA64. # Edit the lines in the Configuration section below to select. @@ -76,7 +76,7 @@ SCRIPT = test1.out test2.out test3.out test66.out test67.out test68.out test69.out \ test71.out test72.out test74.out test75.out test76.out \ test77.out test78.out test79.out test80.out test81.out \ - test82.out test83.out + test82.out test83.out test84.out # Known problems: # Test 30: a problem around mac format - unknown reason diff --git a/src/testdir/Makefile b/src/testdir/Makefile --- a/src/testdir/Makefile +++ b/src/testdir/Makefile @@ -26,7 +26,8 @@ SCRIPTS = test1.out test2.out test3.out test64.out test65.out test66.out test67.out test68.out \ test69.out test70.out test71.out test72.out test73.out \ test74.out test75.out test76.out test77.out test78.out \ - test79.out test80.out test81.out test82.out test83.out + test79.out test80.out test81.out test82.out test83.out \ + test84.out SCRIPTS_GUI = test16.out diff --git a/src/testdir/test84.in b/src/testdir/test84.in new file mode 100644 --- /dev/null +++ b/src/testdir/test84.in @@ -0,0 +1,35 @@ +Tests for curswant not changing when setting an option + +STARTTEST +:so small.vim +:/^start target options$/+1,/^end target options$/-1 yank +:let target_option_names = split(@0) +:function TestCurswant(option_name) +: normal! ggf8j +: let curswant_before = winsaveview().curswant +: execute 'let' '&'.a:option_name '=' '&'.a:option_name +: let curswant_after = winsaveview().curswant +: return [a:option_name, curswant_before, curswant_after] +:endfunction +: +:new +:put =['1234567890', '12345'] +:1 delete _ +:let result = [] +:for option_name in target_option_names +: call add(result, TestCurswant(option_name)) +:endfor +: +:new +:put =map(copy(result), 'join(v:val, '' '')') +:1 delete _ +:write test.out +: +:qall! +ENDTEST + +start target options + tabstop + timeoutlen + ttimeoutlen +end target options diff --git a/src/testdir/test84.ok b/src/testdir/test84.ok new file mode 100644 --- /dev/null +++ b/src/testdir/test84.ok @@ -0,0 +1,3 @@ +tabstop 7 4 +timeoutlen 7 7 +ttimeoutlen 7 7 diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -715,6 +715,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 487, +/**/ 486, /**/ 485,