]> granicus.if.org Git - vim/commitdiff
patch 9.0.1353: too many "else if" statements to handle option values v9.0.1353
authorYegappan Lakshmanan <yegappan@yahoo.com>
Sat, 25 Feb 2023 11:59:33 +0000 (11:59 +0000)
committerBram Moolenaar <Bram@vim.org>
Sat, 25 Feb 2023 11:59:33 +0000 (11:59 +0000)
Problem:    Too many "else if" statements to handle option values.
Solution:   Add more functions to handle option value changes. (Yegappan
            Lakshmanan, closes #12058)

src/option.c
src/option.h
src/optiondefs.h
src/optionstr.c
src/proto/optionstr.pro
src/structs.h
src/testdir/gen_opt_test.vim
src/version.c

index d93d3859fb87239d05a7347f8b928771f1ce015f..3fa3b1c140eff681266445a375a5ecd0c6729273 100644 (file)
@@ -3898,6 +3898,7 @@ set_bool_option(
        args.os_oldval.boolean = old_value;
        args.os_newval.boolean = value;
        args.os_doskip = FALSE;
+       args.os_errbuf = NULL;
        errmsg = options[opt_idx].opt_did_set_cb(&args);
        if (args.os_doskip)
            return errmsg;
@@ -4669,6 +4670,7 @@ set_num_option(
        args.os_flags = opt_flags;
        args.os_oldval.number = old_value;
        args.os_newval.number = value;
+       args.os_errbuf = NULL;
        errmsg = options[opt_idx].opt_did_set_cb(&args);
     }
 
index 9cc540a24fd8aea05bdd251a61ffa2e13777fe9f..487d87c319ef1413ee31446c7973036f1a5605b6 100644 (file)
@@ -299,7 +299,8 @@ typedef enum {
 #define GO_FOOTER      'F'             // add footer
 #define GO_VERTICAL    'v'             // arrange dialog buttons vertically
 #define GO_KEEPWINSIZE 'k'             // keep GUI window size
-#define GO_ALL         "!aAbcdefFghilmMprtTvk" // all possible flags for 'go'
+// all possible flags for 'go'
+#define GO_ALL         "!aAbcdefFghilLmMpPrRtTvk"
 
 // flags for 'comments' option
 #define COM_NEST       'n'             // comments strings nest
index 6ae07fd6577765a7a0e363982e80b8c117aeec30..ecaaf452996f086ab6c030b92f5f1ec1ca8c926d 100644 (file)
@@ -468,7 +468,7 @@ static struct vimoption options[] =
                            SCTX_INIT},
     {"balloonexpr", "bexpr", P_STRING|P_ALLOCED|P_VI_DEF|P_VIM|P_MLE,
 #if defined(FEAT_BEVAL) && defined(FEAT_EVAL)
-                           (char_u *)&p_bexpr, PV_BEXPR, NULL,
+                           (char_u *)&p_bexpr, PV_BEXPR, did_set_optexpr,
                            {(char_u *)"", (char_u *)0L}
 #else
                            (char_u *)NULL, PV_NONE, NULL,
@@ -559,7 +559,7 @@ static struct vimoption options[] =
                            SCTX_INIT},
     {"charconvert",  "ccv", P_STRING|P_VI_DEF|P_SECURE,
 #if defined(FEAT_EVAL)
-                           (char_u *)&p_ccv, PV_NONE, NULL,
+                           (char_u *)&p_ccv, PV_NONE, did_set_optexpr,
                            {(char_u *)"", (char_u *)0L}
 #else
                            (char_u *)NULL, PV_NONE, NULL,
@@ -616,7 +616,7 @@ static struct vimoption options[] =
                            {(char_u *)80L, (char_u *)0L} SCTX_INIT},
     {"comments",    "com",  P_STRING|P_ALLOCED|P_VI_DEF|P_ONECOMMA
                                                          |P_NODUP|P_CURSWANT,
-                           (char_u *)&p_com, PV_COM, NULL,
+                           (char_u *)&p_com, PV_COM, did_set_comments,
                            {(char_u *)"s1:/*,mb:*,ex:*/,://,b:#,:%,:XCOMM,n:>,fb:-",
                                (char_u *)0L}
                            SCTX_INIT},
@@ -635,12 +635,12 @@ static struct vimoption options[] =
                            (char_u *)&p_cp, PV_NONE, did_set_compatible,
                            {(char_u *)TRUE, (char_u *)FALSE} SCTX_INIT},
     {"complete",    "cpt",  P_STRING|P_ALLOCED|P_VI_DEF|P_ONECOMMA|P_NODUP,
-                           (char_u *)&p_cpt, PV_CPT, NULL,
+                           (char_u *)&p_cpt, PV_CPT, did_set_complete,
                            {(char_u *)".,w,b,u,t,i", (char_u *)0L}
                            SCTX_INIT},
     {"concealcursor","cocu", P_STRING|P_ALLOCED|P_RWIN|P_VI_DEF,
 #ifdef FEAT_CONCEAL
-                           (char_u *)VAR_WIN, PV_COCU, NULL,
+                           (char_u *)VAR_WIN, PV_COCU, did_set_concealcursor,
                            {(char_u *)"", (char_u *)NULL}
 #else
                            (char_u *)NULL, PV_NONE, NULL,
@@ -700,7 +700,7 @@ static struct vimoption options[] =
                            (char_u *)&p_ci, PV_CI, NULL,
                            {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"cpoptions",   "cpo",  P_STRING|P_VIM|P_RALL|P_FLAGLIST,
-                           (char_u *)&p_cpo, PV_NONE, NULL,
+                           (char_u *)&p_cpo, PV_NONE, did_set_cpoptions,
                            {(char_u *)CPO_VI, (char_u *)CPO_VIM}
                            SCTX_INIT},
     {"cryptmethod", "cm",   P_STRING|P_ALLOCED|P_VI_DEF,
@@ -818,7 +818,7 @@ static struct vimoption options[] =
                            {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"diffexpr",    "dex",  P_STRING|P_VI_DEF|P_SECURE|P_CURSWANT,
 #if defined(FEAT_DIFF) && defined(FEAT_EVAL)
-                           (char_u *)&p_dex, PV_NONE, NULL,
+                           (char_u *)&p_dex, PV_NONE, did_set_optexpr,
                            {(char_u *)"", (char_u *)0L}
 #else
                            (char_u *)NULL, PV_NONE, NULL,
@@ -986,7 +986,7 @@ static struct vimoption options[] =
                            SCTX_INIT},
     {"foldexpr",    "fde",  P_STRING|P_ALLOCED|P_VIM|P_VI_DEF|P_RWIN|P_MLE,
 #if defined(FEAT_FOLDING) && defined(FEAT_EVAL)
-                           (char_u *)VAR_WIN, PV_FDE, NULL,
+                           (char_u *)VAR_WIN, PV_FDE, did_set_foldexpr,
                            {(char_u *)"0", (char_u *)NULL}
 #else
                            (char_u *)NULL, PV_NONE, NULL,
@@ -1069,7 +1069,7 @@ static struct vimoption options[] =
                            SCTX_INIT},
     {"foldtext",    "fdt",  P_STRING|P_ALLOCED|P_VIM|P_VI_DEF|P_RWIN|P_MLE,
 #if defined(FEAT_FOLDING) && defined(FEAT_EVAL)
-                           (char_u *)VAR_WIN, PV_FDT, NULL,
+                           (char_u *)VAR_WIN, PV_FDT, did_set_optexpr,
                            {(char_u *)"foldtext()", (char_u *)NULL}
 #else
                            (char_u *)NULL, PV_NONE, NULL,
@@ -1078,7 +1078,7 @@ static struct vimoption options[] =
                            SCTX_INIT},
     {"formatexpr", "fex",   P_STRING|P_ALLOCED|P_VI_DEF|P_VIM|P_MLE,
 #ifdef FEAT_EVAL
-                           (char_u *)&p_fex, PV_FEX, NULL,
+                           (char_u *)&p_fex, PV_FEX, did_set_optexpr,
                            {(char_u *)"", (char_u *)0L}
 #else
                            (char_u *)NULL, PV_NONE, NULL,
@@ -1086,7 +1086,7 @@ static struct vimoption options[] =
 #endif
                            SCTX_INIT},
     {"formatoptions","fo",  P_STRING|P_ALLOCED|P_VIM|P_FLAGLIST,
-                           (char_u *)&p_fo, PV_FO, NULL,
+                           (char_u *)&p_fo, PV_FO, did_set_formatoptions,
                            {(char_u *)DFLT_FO_VI, (char_u *)DFLT_FO_VIM}
                            SCTX_INIT},
     {"formatlistpat","flp", P_STRING|P_ALLOCED|P_VI_DEF,
@@ -1144,7 +1144,8 @@ static struct vimoption options[] =
                            SCTX_INIT},
     {"guicursor",    "gcr", P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP,
 #ifdef CURSOR_SHAPE
-                           (char_u *)&p_guicursor, PV_NONE, NULL,
+                           (char_u *)&p_guicursor, PV_NONE,
+                           did_set_guicursor,
                            {
 # ifdef FEAT_GUI
                                (char_u *)"n-v-c:block-Cursor/lCursor,ve:ver35-Cursor,o:hor50-Cursor,i-ci:ver25-Cursor/lCursor,r-cr:hor20-Cursor/lCursor,sm:block-Cursor-blinkwait175-blinkoff150-blinkon175",
@@ -1375,7 +1376,7 @@ static struct vimoption options[] =
                            SCTX_INIT},
     {"includeexpr", "inex", P_STRING|P_ALLOCED|P_VI_DEF|P_MLE,
 #if defined(FEAT_FIND_ID) && defined(FEAT_EVAL)
-                           (char_u *)&p_inex, PV_INEX, NULL,
+                           (char_u *)&p_inex, PV_INEX, did_set_optexpr,
                            {(char_u *)"", (char_u *)0L}
 #else
                            (char_u *)NULL, PV_NONE, NULL,
@@ -1387,7 +1388,7 @@ static struct vimoption options[] =
                            {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"indentexpr", "inde",  P_STRING|P_ALLOCED|P_VI_DEF|P_VIM|P_MLE,
 #if defined(FEAT_EVAL)
-                           (char_u *)&p_inde, PV_INDE, NULL,
+                           (char_u *)&p_inde, PV_INDE, did_set_optexpr,
                            {(char_u *)"", (char_u *)0L}
 #else
                            (char_u *)NULL, PV_NONE, NULL,
@@ -1689,7 +1690,7 @@ static struct vimoption options[] =
                            (char_u *)&p_more, PV_NONE, NULL,
                            {(char_u *)FALSE, (char_u *)TRUE} SCTX_INIT},
     {"mouse",      NULL,   P_STRING|P_VI_DEF|P_FLAGLIST,
-                           (char_u *)&p_mouse, PV_NONE, NULL,
+                           (char_u *)&p_mouse, PV_NONE, did_set_mouse,
                            {
 #if defined(MSWIN)
                                (char_u *)"a",
@@ -1834,7 +1835,7 @@ static struct vimoption options[] =
                            {(char_u *)"", (char_u *)0L} SCTX_INIT},
     {"patchexpr",   "pex",  P_STRING|P_VI_DEF|P_SECURE,
 #if defined(FEAT_DIFF) && defined(FEAT_EVAL)
-                           (char_u *)&p_pex, PV_NONE, NULL,
+                           (char_u *)&p_pex, PV_NONE, did_set_optexpr,
                            {(char_u *)"", (char_u *)0L}
 #else
                            (char_u *)NULL, PV_NONE, NULL,
@@ -1910,7 +1911,7 @@ static struct vimoption options[] =
                            SCTX_INIT},
     {"printexpr", "pexpr",  P_STRING|P_VI_DEF|P_SECURE,
 #ifdef FEAT_POSTSCRIPT
-                           (char_u *)&p_pexpr, PV_NONE, NULL,
+                           (char_u *)&p_pexpr, PV_NONE, did_set_optexpr,
                            {(char_u *)"", (char_u *)0L}
 #else
                            (char_u *)NULL, PV_NONE, NULL,
@@ -2259,7 +2260,7 @@ static struct vimoption options[] =
                            did_set_shiftwidth_tabstop,
                            {(char_u *)8L, (char_u *)0L} SCTX_INIT},
     {"shortmess",   "shm",  P_STRING|P_VIM|P_FLAGLIST,
-                           (char_u *)&p_shm, PV_NONE, NULL,
+                           (char_u *)&p_shm, PV_NONE, did_set_shortmess,
                            {(char_u *)"S", (char_u *)"filnxtToOS"}
                            SCTX_INIT},
     {"shortname",   "sn",   P_BOOL|P_VI_DEF,
@@ -2742,7 +2743,7 @@ static struct vimoption options[] =
                            SCTX_INIT},
     {"viminfo",            "vi",   P_STRING|P_ONECOMMA|P_NODUP|P_SECURE,
 #ifdef FEAT_VIMINFO
-                           (char_u *)&p_viminfo, PV_NONE, NULL,
+                           (char_u *)&p_viminfo, PV_NONE, did_set_viminfo,
 #if defined(MSWIN)
                            {(char_u *)"", (char_u *)"'100,<50,s10,h,rA:,rB:"}
 #elif defined(AMIGA)
@@ -2790,7 +2791,7 @@ static struct vimoption options[] =
                            (char_u *)&p_wiv, PV_NONE, did_set_weirdinvert,
                            {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"whichwrap",   "ww",   P_STRING|P_VIM|P_ONECOMMA|P_FLAGLIST,
-                           (char_u *)&p_ww, PV_NONE, NULL,
+                           (char_u *)&p_ww, PV_NONE, did_set_whichwrap,
                            {(char_u *)"", (char_u *)"b,s"} SCTX_INIT},
     {"wildchar",    "wc",   P_NUM|P_VIM,
                            (char_u *)&p_wc, PV_NONE, NULL,
index f6a02b2a42170eeccf2b04a53916e341e0902cbb..4671e835f3bcad4bdbf9bfc17f6bc929267bc5c0 100644 (file)
@@ -790,7 +790,7 @@ did_set_helpfile(optset_T *args UNUSED)
     return NULL;
 }
 
-#ifdef FEAT_SYN_HL
+#if defined(FEAT_SYN_HL) || defined(PROTO)
 /*
  * The 'colorcolumn' option is changed.
  */
@@ -1458,20 +1458,20 @@ did_set_matchpairs(optset_T *args)
 /*
  * The 'comments' option is changed.
  */
-    static char *
-did_set_comments(char_u **varp, char *errbuf)
+    char *
+did_set_comments(optset_T *args)
 {
     char_u     *s;
     char       *errmsg = NULL;
 
-    for (s = *varp; *s; )
+    for (s = args->os_varp; *s; )
     {
        while (*s && *s != ':')
        {
            if (vim_strchr((char_u *)COM_ALL, *s) == NULL
                    && !VIM_ISDIGIT(*s) && *s != '-')
            {
-               errmsg = illegal_char(errbuf, *s);
+               errmsg = illegal_char(args->os_errbuf, *s);
                break;
            }
            ++s;
@@ -1547,12 +1547,12 @@ did_set_verbosefile(optset_T *args UNUSED)
     return NULL;
 }
 
-#ifdef FEAT_VIMINFO
+#if defined(FEAT_VIMINFO) || defined(PROTO)
 /*
  * The 'viminfo' option is changed.
  */
-    static char *
-did_set_viminfo(char *errbuf)
+    char *
+did_set_viminfo(optset_T *args)
 {
     char_u     *s;
     char       *errmsg = NULL;
@@ -1562,7 +1562,7 @@ did_set_viminfo(char *errbuf)
        // Check it's a valid character
        if (vim_strchr((char_u *)"!\"%'/:<@cfhnrs", *s) == NULL)
        {
-           errmsg = illegal_char(errbuf, *s);
+           errmsg = illegal_char(args->os_errbuf, *s);
            break;
        }
        if (*s == 'n')  // name is always last one
@@ -1587,12 +1587,12 @@ did_set_viminfo(char *errbuf)
 
            if (!VIM_ISDIGIT(*(s - 1)))
            {
-               if (errbuf != NULL)
+               if (args->os_errbuf != NULL)
                {
-                   sprintf(errbuf,
+                   sprintf(args->os_errbuf,
                            _(e_missing_number_after_angle_str_angle),
                            transchar_byte(*(s - 1)));
-                   errmsg = errbuf;
+                   errmsg = args->os_errbuf;
                }
                else
                    errmsg = "";
@@ -1603,7 +1603,7 @@ did_set_viminfo(char *errbuf)
            ++s;
        else if (*s)
        {
-           if (errbuf != NULL)
+           if (args->os_errbuf != NULL)
                errmsg = e_missing_comma;
            else
                errmsg = "";
@@ -1698,6 +1698,17 @@ did_set_showbreak(optset_T *args)
 }
 #endif
 
+#if defined(CURSOR_SHAPE) || defined(PROTO)
+/*
+ * The 'guicursor' option is changed.
+ */
+    char *
+did_set_guicursor(optset_T *args UNUSED)
+{
+    return parse_shape_opt(SHAPE_CURSOR);
+}
+#endif
+
 #if defined(FEAT_GUI) || defined(PROTO)
 /*
  * The 'guifont' option is changed.
@@ -1849,13 +1860,35 @@ did_set_iconstring(optset_T *args)
     return did_set_titleiconstring(args, flagval);
 }
 
-#ifdef FEAT_GUI
+/*
+ * An option which is a list of flags is set.  Valid values are in 'flags'.
+ */
+    static char *
+did_set_option_listflag(char_u *varp, char_u *flags, char *errbuf)
+{
+    char_u     *s;
+
+    for (s = varp; *s; ++s)
+       if (vim_strchr(flags, *s) == NULL)
+           return illegal_char(errbuf, *s);
+
+    return NULL;
+}
+
+#if defined(FEAT_GUI) || defined(PROTO)
 /*
  * The 'guioptions' option is changed.
  */
     char *
 did_set_guioptions(optset_T *args)
 {
+    char *errmsg;
+
+    errmsg = did_set_option_listflag(args->os_varp, (char_u *)GO_ALL,
+                                                       args->os_errbuf);
+    if (errmsg != NULL)
+       return errmsg;
+
     gui_init_which_components(args->os_oldval.string);
     return NULL;
 }
@@ -2095,7 +2128,7 @@ did_set_buftype(optset_T *args UNUSED)
     return NULL;
 }
 
-#ifdef FEAT_STL_OPT
+#if defined(FEAT_STL_OPT) || defined(PROTO)
 /*
  * The 'statusline' or the 'tabline' or the 'rulerformat' option is changed.
  * "rulerformat" is TRUE if the 'rulerformat' option is changed.
@@ -2162,20 +2195,20 @@ did_set_rulerformat(optset_T *args)
 /*
  * The 'complete' option is changed.
  */
-    static char *
-did_set_complete(char_u **varp, char *errbuf)
+    char *
+did_set_complete(optset_T *args)
 {
     char_u     *s;
 
     // check if it is a valid value for 'complete' -- Acevedo
-    for (s = *varp; *s;)
+    for (s = args->os_varp; *s;)
     {
        while (*s == ',' || *s == ' ')
            s++;
        if (!*s)
            break;
        if (vim_strchr((char_u *)".wbuksid]tU", *s) == NULL)
-           return illegal_char(errbuf, *s);
+           return illegal_char(args->os_errbuf, *s);
        if (*++s != NUL && *s != ',' && *s != ' ')
        {
            if (s[-1] == 'k' || s[-1] == 's')
@@ -2190,11 +2223,11 @@ did_set_complete(char_u **varp, char *errbuf)
            }
            else
            {
-               if (errbuf != NULL)
+               if (args->os_errbuf != NULL)
                {
-                   sprintf((char *)errbuf,
+                   sprintf((char *)args->os_errbuf,
                            _(e_illegal_character_after_chr), *--s);
-                   return errbuf;
+                   return args->os_errbuf;
                }
                return "";
            }
@@ -2744,45 +2777,137 @@ did_set_completepopup(optset_T *args UNUSED)
 # endif
 #endif
 
-#ifdef FEAT_EVAL
+#if defined(FEAT_EVAL) || defined(PROTO)
+/*
+ * Returns TRUE if the option pointed by "varp" or "gvarp" is one of the
+ * '*expr' options: 'balloonexpr', 'diffexpr', 'foldexpr', 'foldtext',
+ * 'formatexpr', 'includeexpr', 'indentexpr', 'patchexpr', 'printexpr' or
+ * 'charconvert'.
+ */
+    static int
+is_expr_option(char_u **varp, char_u **gvarp)
+{
+    return (
+# ifdef FEAT_BEVAL
+       varp == &p_bexpr ||                     // 'balloonexpr'
+# endif
+# ifdef FEAT_DIFF
+       varp == &p_dex ||                       // 'diffexpr'
+# endif
+# ifdef FEAT_FOLDING
+       gvarp == &curwin->w_allbuf_opt.wo_fde ||        // 'foldexpr'
+       gvarp == &curwin->w_allbuf_opt.wo_fdt ||        // 'foldtext'
+# endif
+       gvarp == &p_fex ||                      // 'formatexpr'
+# ifdef FEAT_FIND_ID
+       gvarp == &p_inex ||                     // 'includeexpr'
+# endif
+       gvarp == &p_inde ||                     // 'indentexpr'
+# ifdef FEAT_DIFF
+       varp == &p_pex ||                       // 'patchexpr'
+# endif
+# ifdef FEAT_POSTSCRIPT
+       varp == &p_pexpr ||                     // 'printexpr'
+# endif
+       varp == &p_ccv);                        // 'charconvert'
+}
+
 /*
  * One of the '*expr' options is changed: 'balloonexpr', 'diffexpr',
  * 'foldexpr', 'foldtext', 'formatexpr', 'includeexpr', 'indentexpr',
  * 'patchexpr', 'printexpr' and 'charconvert'.
  *
  */
-    static void
-did_set_optexpr(char_u **varp)
+    char *
+did_set_optexpr(optset_T *args)
 {
     // If the option value starts with <SID> or s:, then replace that with
     // the script identifier.
-    char_u *name = get_scriptlocal_funcname(*varp);
+    char_u *name = get_scriptlocal_funcname(args->os_varp);
     if (name != NULL)
     {
-       free_string_option(*varp);
-       *varp = name;
+       free_string_option(args->os_varp);
+       args->os_varp = name;
     }
 
-# ifdef FEAT_FOLDING
-    if (varp == &curwin->w_p_fde && foldmethodIsExpr(curwin))
+    return NULL;
+}
+
+# if defined(FEAT_FOLDING) || defined(PROTO)
+/*
+ * The 'foldexpr' option is changed.
+ */
+    char *
+did_set_foldexpr(optset_T *args)
+{
+    (void)did_set_optexpr(args);
+    if (foldmethodIsExpr(curwin))
        foldUpdateAll(curwin);
+    return NULL;
+}
 # endif
+#endif
+
+#if defined(FEAT_CONCEAL) || defined(PROTO)
+/*
+ * The 'concealcursor' option is changed.
+ */
+    char *
+did_set_concealcursor(optset_T *args)
+{
+    return did_set_option_listflag(args->os_varp, (char_u *)COCU_ALL,
+                                                       args->os_errbuf);
 }
 #endif
 
 /*
- * An option which is a list of flags is set.  Valid values are in 'flags'.
+ * The 'cpoptions' option is changed.
  */
-    static char *
-did_set_option_listflag(char_u **varp, char_u *flags, char *errbuf)
+    char *
+did_set_cpoptions(optset_T *args)
 {
-    char_u     *s;
+    return did_set_option_listflag(args->os_varp, (char_u *)CPO_ALL,
+                                                       args->os_errbuf);
+}
 
-    for (s = *varp; *s; ++s)
-       if (vim_strchr(flags, *s) == NULL)
-           return illegal_char(errbuf, *s);
+/*
+ * The 'formatoptions' option is changed.
+ */
+    char *
+did_set_formatoptions(optset_T *args)
+{
+    return did_set_option_listflag(args->os_varp, (char_u *)FO_ALL,
+                                                       args->os_errbuf);
+}
 
-    return NULL;
+/*
+ * The 'mouse' option is changed.
+ */
+    char *
+did_set_mouse(optset_T *args)
+{
+    return did_set_option_listflag(args->os_varp, (char_u *)MOUSE_ALL,
+                                                       args->os_errbuf);
+}
+
+/*
+ * The 'shortmess' option is changed.
+ */
+    char *
+did_set_shortmess(optset_T *args)
+{
+    return did_set_option_listflag(args->os_varp, (char_u *)SHM_ALL,
+                                                       args->os_errbuf);
+}
+
+/*
+ * The 'whichwrap' option is changed.
+ */
+    char *
+did_set_whichwrap(optset_T *args)
+{
+    return did_set_option_listflag(args->os_varp, (char_u *)WW_ALL,
+                                                       args->os_errbuf);
 }
 
 #ifdef FEAT_SYN_HL
@@ -2912,7 +3037,14 @@ did_set_string_option(
        args.os_flags = opt_flags;
        args.os_oldval.string = oldval;
        args.os_newval.string = value;
+       args.os_errbuf = errbuf;
        errmsg = did_set_cb(&args);
+#ifdef FEAT_EVAL
+       // When processing the '*expr' options (e.g. diffexpr, foldexpr, etc.),
+       // the did_set_cb() function may modify '*varp'.
+       if (errmsg == NULL && is_expr_option(varp, gvarp))
+           *varp = args.os_varp;
+#endif
     }
     else if (varp == &T_NAME)                  // 'term'
        errmsg = did_set_term(&opt_idx, &free_oldval);
@@ -2930,8 +3062,6 @@ did_set_string_option(
     else if (varp == &curbuf->b_p_keymap)      // 'keymap'
        errmsg = did_set_keymap(varp, opt_flags, value_checked);
 #endif
-    else if (gvarp == &p_com)                  // 'comments'
-       errmsg = did_set_comments(varp, errbuf);
     else if (  varp == &p_lcs                  // global 'listchars'
            || varp == &p_fcs)                  // global 'fillchars'
        errmsg = did_set_global_listfillchars(varp, opt_flags);
@@ -2939,19 +3069,9 @@ did_set_string_option(
        errmsg = set_chars_option(curwin, varp, TRUE);
     else if (varp == &curwin->w_p_fcs)         // local 'fillchars'
        errmsg = set_chars_option(curwin, varp, TRUE);
-#ifdef FEAT_VIMINFO
-    else if (varp == &p_viminfo)               // 'viminfo'
-       errmsg = did_set_viminfo(errbuf);
-#endif // FEAT_VIMINFO
     // terminal options
     else if (istermoption_idx(opt_idx) && full_screen)
        did_set_term_option(varp, &did_swaptcap);
-#ifdef CURSOR_SHAPE
-    else if (varp == &p_guicursor)             // 'guicursor'
-       errmsg = parse_shape_opt(SHAPE_CURSOR);
-#endif
-    else if (gvarp == &p_cpt)                  // 'complete'
-       errmsg = did_set_complete(varp, errbuf);
     else if (gvarp == &p_ft)                   // 'filetype'
        errmsg = did_set_filetype_or_syntax(varp, oldval, value_checked,
                                                        &value_changed);
@@ -2960,50 +3080,6 @@ did_set_string_option(
        errmsg = did_set_filetype_or_syntax(varp, oldval, value_checked,
                                                        &value_changed);
 #endif
-#ifdef FEAT_EVAL
-    else if (
-# ifdef FEAT_BEVAL
-           varp == &p_bexpr ||                 // 'balloonexpr'
-# endif
-# ifdef FEAT_DIFF
-           varp == &p_dex ||                   // 'diffexpr'
-# endif
-# ifdef FEAT_FOLDING
-           gvarp == &curwin->w_allbuf_opt.wo_fde ||    // 'foldexpr'
-           gvarp == &curwin->w_allbuf_opt.wo_fdt ||    // 'foldtext'
-# endif
-           gvarp == &p_fex ||                  // 'formatexpr'
-# ifdef FEAT_FIND_ID
-           gvarp == &p_inex ||                 // 'includeexpr'
-# endif
-           gvarp == &p_inde ||                 // 'indentexpr'
-# ifdef FEAT_DIFF
-           varp == &p_pex ||                   // 'patchexpr'
-# endif
-# ifdef FEAT_POSTSCRIPT
-           varp == &p_pexpr ||                 // 'printexpr'
-# endif
-           varp == &p_ccv)                     // 'charconvert'
-       did_set_optexpr(varp);
-#endif
-    else if (varp == &p_ww)                    // 'whichwrap'
-       errmsg = did_set_option_listflag(varp, (char_u *)WW_ALL, errbuf);
-    else if (varp == &p_shm)                   // 'shortmess'
-       errmsg = did_set_option_listflag(varp, (char_u *)SHM_ALL, errbuf);
-    else if (varp == &(p_cpo))                 // 'cpoptions'
-       errmsg = did_set_option_listflag(varp, (char_u *)CPO_ALL, errbuf);
-    else if (varp == &(curbuf->b_p_fo))                // 'formatoptions'
-       errmsg = did_set_option_listflag(varp, (char_u *)FO_ALL, errbuf);
-#ifdef FEAT_CONCEAL
-    else if (varp == &curwin->w_p_cocu)                // 'concealcursor'
-       errmsg = did_set_option_listflag(varp, (char_u *)COCU_ALL, errbuf);
-#endif
-    else if (varp == &p_mouse)                 // 'mouse'
-       errmsg = did_set_option_listflag(varp, (char_u *)MOUSE_ALL, errbuf);
-#if defined(FEAT_GUI)
-    else if (varp == &p_go)                    // 'guioptions'
-       errmsg = did_set_option_listflag(varp, (char_u *)GO_ALL, errbuf);
-#endif
 
     // If an error is detected, restore the previous value.
     if (errmsg != NULL)
index 650fc067e0d6d6843f5d12bf0a783aa4fc1944c6..594632e15488e9ccc98bab4eeeb5c52d1f3bf51b 100644 (file)
@@ -41,8 +41,11 @@ char *did_set_fileformats(optset_T *args);
 char *did_set_cryptkey(optset_T *args);
 char *did_set_cryptmethod(optset_T *args);
 char *did_set_matchpairs(optset_T *args);
+char *did_set_comments(optset_T *args);
 char *did_set_verbosefile(optset_T *args);
+char *did_set_viminfo(optset_T *args);
 char *did_set_showbreak(optset_T *args);
+char *did_set_guicursor(optset_T *args);
 char *did_set_guifont(optset_T *args);
 char *did_set_guifontset(optset_T *args);
 char *did_set_guifontwide(optset_T *args);
@@ -71,6 +74,7 @@ char *did_set_buftype(optset_T *args);
 char *did_set_statusline(optset_T *args);
 char *did_set_tabline(optset_T *args);
 char *did_set_rulerformat(optset_T *args);
+char *did_set_complete(optset_T *args);
 char *did_set_completeopt(optset_T *args);
 char *did_set_completeslash(optset_T *args);
 char *did_set_signcolumn(optset_T *args);
@@ -99,6 +103,14 @@ char *did_set_varsofttabstop(optset_T *args);
 char *did_set_vartabstop(optset_T *args);
 char *did_set_previewpopup(optset_T *args);
 char *did_set_completepopup(optset_T *args);
+char *did_set_optexpr(optset_T *args);
+char *did_set_foldexpr(optset_T *args);
+char *did_set_concealcursor(optset_T *args);
+char *did_set_cpoptions(optset_T *args);
+char *did_set_formatoptions(optset_T *args);
+char *did_set_mouse(optset_T *args);
+char *did_set_shortmess(optset_T *args);
+char *did_set_whichwrap(optset_T *args);
 char *did_set_string_option(int opt_idx, char_u **varp, char_u *oldval, char_u *value, char *errbuf, int opt_flags, int *value_checked);
 int check_ff_value(char_u *p);
 void save_clear_shm_value(void);
index 655293942263e591b5ff3152af46ba1b5177ff05..d33ddb2543c4cb27e4f6f339413ba1619d854053 100644 (file)
@@ -4819,4 +4819,9 @@ typedef struct
     // When set by the called function: Stop processing the option further.
     // Currently only used for boolean options.
     int                os_doskip;
+
+    // If the value specified for an option is not valid and the error message
+    // is parameterized, then the "os_errbuf" buffer is used to store the error
+    // message (when it is not NULL).
+    char       *os_errbuf;
 } optset_T;
index a18aa66dfa4d3e156b3246854918d59863aad7d5..6124bb2d2bf8235f41a4eb641ad63bf52c319100 100644 (file)
@@ -104,6 +104,7 @@ let test_values = {
       \ 'guifont': [['', fontname], []],
       \ 'guifontwide': [['', fontname], []],
       \ 'guifontset': [['', fontname], []],
+      \ 'guioptions': [['', 'a'], ['Q']],
       \ 'helplang': [['', 'de', 'de,it'], ['xxx']],
       \ 'highlight': [['', 'e:Error'], ['xxx']],
       \ 'imactivatekey': [['', 'S-space'], ['xxx']],
index 9b539356d2e51b92d8b1231e15970dc6adf32284..c3631e6ccd28d716b744daebc247e9cc3c5458e1 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1353,
 /**/
     1352,
 /**/