diff src/optiondefs.h @ 33399:95db67c7b754 v9.0.1958

patch 9.0.1958: cannot complete option values Commit: https://github.com/vim/vim/commit/900894b09a95398dfc75599e9f0aa2ea25723384 Author: Yee Cheng Chin <ychin.git@gmail.com> Date: Fri Sep 29 20:42:32 2023 +0200 patch 9.0.1958: cannot complete option values Problem: cannot complete option values Solution: Add completion functions for several options Add cmdline tab-completion for setting string options Add tab-completion for setting string options on the cmdline using `:set=` (along with `:set+=` and `:set-=`). The existing tab completion for setting options currently only works when nothing is typed yet, and it only fills in with the existing value, e.g. when the user does `:set diffopt=<Tab>` it will be completed to `set diffopt=internal,filler,closeoff` and nothing else. This isn't too useful as a user usually wants auto-complete to suggest all the possible values, such as 'iblank', or 'algorithm:patience'. For set= and set+=, this adds a new optional callback function for each option that can be invoked when doing completion. This allows for each option to have control over how completion works. For example, in 'diffopt', it will suggest the default enumeration, but if `algorithm:` is selected, it will further suggest different algorithm types like 'meyers' and 'patience'. When using set=, the existing option value will be filled in as the first choice to preserve the existing behavior. When using set+= this won't happen as it doesn't make sense. For flag list options (e.g. 'mouse' and 'guioptions'), completion will take into account existing typed values (and in the case of set+=, the existing option value) to make sure it doesn't suggest duplicates. For set-=, there is a new `ExpandSettingSubtract` function which will handle flag list and comma-separated options smartly, by only suggesting values that currently exist in the option. Note that Vim has some existing code that adds special handling for 'filetype', 'syntax', and misc dir options like 'backupdir'. This change preserves them as they already work, instead of converting to the new callback API for each option. closes: #13182 Signed-off-by: Christian Brabandt <cb@256bit.org> Co-authored-by: Yee Cheng Chin <ychin.git@gmail.com>
author Christian Brabandt <cb@256bit.org>
date Fri, 29 Sep 2023 20:45:04 +0200
parents 1f3bcb7f3bd0
children aa7cd2253130
line wrap: on
line diff
--- a/src/optiondefs.h
+++ b/src/optiondefs.h
@@ -272,6 +272,11 @@ struct vimoption
     // callback function to invoke after an option is modified to validate and
     // apply the new value.
     opt_did_set_cb_T	opt_did_set_cb;
+
+    // callback function to invoke when expanding possible values on the
+    // cmdline. Only useful for string options.
+    opt_expand_cb_T	opt_expand_cb;
+
     char_u	*def_val[2];	// default values for variable (vi and vim)
 #ifdef FEAT_EVAL
     sctx_T	script_ctx;	// script context where the option was last set
@@ -324,7 +329,7 @@ static struct vimoption options[] =
 #else
 			    (char_u *)NULL, PV_NONE,
 #endif
-			    NULL,
+			    NULL, NULL,
 			    {
 #if defined(MSWIN) && !defined(FEAT_GUI_MSWIN)
 			    (char_u *)128L,
@@ -333,72 +338,72 @@ static struct vimoption options[] =
 #endif
 					    (char_u *)0L} SCTX_INIT},
     {"antialias",   "anti", P_BOOL|P_VI_DEF|P_VIM|P_RCLR,
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)FALSE}
 			    SCTX_INIT},
     {"arabic",	    "arab", P_BOOL|P_VI_DEF|P_VIM|P_CURSWANT,
 #ifdef FEAT_ARABIC
-			    (char_u *)VAR_WIN, PV_ARAB, did_set_arabic,
+			    (char_u *)VAR_WIN, PV_ARAB, did_set_arabic, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"arabicshape", "arshape", P_BOOL|P_VI_DEF|P_VIM|P_RCLR,
 #ifdef FEAT_ARABIC
-			    (char_u *)&p_arshape, PV_NONE, NULL,
+			    (char_u *)&p_arshape, PV_NONE, NULL, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)TRUE, (char_u *)0L} SCTX_INIT},
     {"allowrevins", "ari",  P_BOOL|P_VI_DEF|P_VIM,
 #ifdef FEAT_RIGHTLEFT
-			    (char_u *)&p_ari, PV_NONE, NULL,
+			    (char_u *)&p_ari, PV_NONE, NULL, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"altkeymap",   "akm",  P_BOOL|P_VI_DEF,
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"ambiwidth",  "ambw",  P_STRING|P_VI_DEF|P_RCLR,
-			    (char_u *)&p_ambw, PV_NONE, did_set_ambiwidth,
+			    (char_u *)&p_ambw, PV_NONE, did_set_ambiwidth, expand_set_ambiwidth,
 			    {(char_u *)"single", (char_u *)0L}
 			    SCTX_INIT},
     {"autochdir",  "acd",   P_BOOL|P_VI_DEF,
 #ifdef FEAT_AUTOCHDIR
-			    (char_u *)&p_acd, PV_NONE, did_set_autochdir,
+			    (char_u *)&p_acd, PV_NONE, did_set_autochdir, NULL,
 			    {(char_u *)FALSE, (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"autoshelldir",  "asd",   P_BOOL|P_VI_DEF,
 #ifdef FEAT_AUTOSHELLDIR
-			    (char_u *)&p_asd, PV_NONE, NULL,
+			    (char_u *)&p_asd, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"autoindent",  "ai",   P_BOOL|P_VI_DEF,
-			    (char_u *)&p_ai, PV_AI, NULL,
+			    (char_u *)&p_ai, PV_AI, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"autoprint",   "ap",   P_BOOL|P_VI_DEF,
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"autoread",    "ar",   P_BOOL|P_VI_DEF,
-			    (char_u *)&p_ar, PV_AR, NULL,
+			    (char_u *)&p_ar, PV_AR, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"autowrite",   "aw",   P_BOOL|P_VI_DEF,
-			    (char_u *)&p_aw, PV_NONE, NULL,
+			    (char_u *)&p_aw, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"autowriteall","awa",  P_BOOL|P_VI_DEF,
-			    (char_u *)&p_awa, PV_NONE, NULL,
+			    (char_u *)&p_awa, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"background",  "bg",   P_STRING|P_VI_DEF|P_RCLR,
-			    (char_u *)&p_bg, PV_NONE, did_set_background,
+			    (char_u *)&p_bg, PV_NONE, did_set_background, expand_set_background,
 			    {
 #if (defined(MSWIN)) && !defined(FEAT_GUI)
 			    (char_u *)"dark",
@@ -407,13 +412,13 @@ static struct vimoption options[] =
 #endif
 					    (char_u *)0L} SCTX_INIT},
     {"backspace",   "bs",   P_STRING|P_VI_DEF|P_VIM|P_ONECOMMA|P_NODUP,
-			    (char_u *)&p_bs, PV_NONE, did_set_backspace,
+			    (char_u *)&p_bs, PV_NONE, did_set_backspace, expand_set_backspace,
 			    {(char_u *)"", (char_u *)0L} SCTX_INIT},
     {"backup",	    "bk",   P_BOOL|P_VI_DEF|P_VIM,
-			    (char_u *)&p_bk, PV_NONE, NULL,
+			    (char_u *)&p_bk, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"backupcopy",  "bkc",  P_STRING|P_VIM|P_ONECOMMA|P_NODUP,
-			    (char_u *)&p_bkc, PV_BKC, did_set_backupcopy,
+			    (char_u *)&p_bkc, PV_BKC, did_set_backupcopy, expand_set_backupcopy,
 #ifdef UNIX
 			    {(char_u *)"yes", (char_u *)"auto"}
 #else
@@ -422,11 +427,11 @@ static struct vimoption options[] =
 			    SCTX_INIT},
     {"backupdir",   "bdir", P_STRING|P_EXPAND|P_VI_DEF|P_ONECOMMA
 							    |P_NODUP|P_SECURE,
-			    (char_u *)&p_bdir, PV_NONE, NULL,
+			    (char_u *)&p_bdir, PV_NONE, NULL, NULL,
 			    {(char_u *)DFLT_BDIR, (char_u *)0L} SCTX_INIT},
     {"backupext",   "bex",  P_STRING|P_VI_DEF|P_NFNAME,
 			    (char_u *)&p_bex, PV_NONE,
-			    did_set_backupext_or_patchmode,
+			    did_set_backupext_or_patchmode, NULL,
 			    {
 #ifdef VMS
 			    (char_u *)"_",
@@ -435,77 +440,77 @@ static struct vimoption options[] =
 #endif
 					    (char_u *)0L} SCTX_INIT},
     {"backupskip",  "bsk",  P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP,
-			    (char_u *)&p_bsk, PV_NONE, NULL,
+			    (char_u *)&p_bsk, PV_NONE, NULL, NULL,
 			    {(char_u *)"", (char_u *)0L}
 			    SCTX_INIT},
     {"balloondelay","bdlay",P_NUM|P_VI_DEF,
 #ifdef FEAT_BEVAL
-			    (char_u *)&p_bdlay, PV_NONE, NULL,
+			    (char_u *)&p_bdlay, PV_NONE, NULL, NULL,
 			    {(char_u *)600L, (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"ballooneval", "beval",P_BOOL|P_VI_DEF|P_NO_MKRC,
 #ifdef FEAT_BEVAL_GUI
-			    (char_u *)&p_beval, PV_NONE, did_set_ballooneval,
+			    (char_u *)&p_beval, PV_NONE, did_set_ballooneval, NULL,
 			    {(char_u *)FALSE, (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"balloonevalterm", "bevalterm",P_BOOL|P_VI_DEF|P_NO_MKRC,
 #ifdef FEAT_BEVAL_TERM
 			    (char_u *)&p_bevalterm, PV_NONE,
-			    did_set_balloonevalterm,
+			    did_set_balloonevalterm, NULL,
 			    {(char_u *)FALSE, (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    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, did_set_optexpr,
+			    (char_u *)&p_bexpr, PV_BEXPR, did_set_optexpr, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"beautify",    "bf",   P_BOOL|P_VI_DEF,
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"belloff",      "bo",  P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
-			    (char_u *)&p_bo, PV_NONE, did_set_belloff,
+			    (char_u *)&p_bo, PV_NONE, did_set_belloff, expand_set_belloff,
 			    {(char_u *)"", (char_u *)0L} SCTX_INIT},
     {"binary",	    "bin",  P_BOOL|P_VI_DEF|P_RSTAT,
-			    (char_u *)&p_bin, PV_BIN, did_set_binary,
+			    (char_u *)&p_bin, PV_BIN, did_set_binary, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"bioskey",	    "biosk",P_BOOL|P_VI_DEF,
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)TRUE, (char_u *)0L} SCTX_INIT},
     {"bomb",	    NULL,   P_BOOL|P_NO_MKRC|P_VI_DEF|P_RSTAT,
 			    (char_u *)&p_bomb, PV_BOMB,
-			    did_set_eof_eol_fixeol_bomb,
+			    did_set_eof_eol_fixeol_bomb, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"breakat",	    "brk",  P_STRING|P_VI_DEF|P_RALL|P_FLAGLIST,
 #ifdef FEAT_LINEBREAK
-			    (char_u *)&p_breakat, PV_NONE, did_set_breakat,
+			    (char_u *)&p_breakat, PV_NONE, did_set_breakat, NULL,
 			    {(char_u *)" \t!@*-+;:,./?", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"breakindent",   "bri",  P_BOOL|P_VI_DEF|P_VIM|P_RWIN,
 #ifdef FEAT_LINEBREAK
-			    (char_u *)VAR_WIN, PV_BRI, NULL,
+			    (char_u *)VAR_WIN, PV_BRI, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
@@ -513,80 +518,80 @@ static struct vimoption options[] =
 						  |P_ONECOMMA|P_NODUP,
 #ifdef FEAT_LINEBREAK
 			    (char_u *)VAR_WIN, PV_BRIOPT,
-			    did_set_breakindentopt,
+			    did_set_breakindentopt, expand_set_breakindentopt,
 			    {(char_u *)"", (char_u *)NULL}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)"", (char_u *)NULL}
 #endif
 			    SCTX_INIT},
     {"browsedir",   "bsdir",P_STRING|P_VI_DEF,
 #ifdef FEAT_BROWSE
-			    (char_u *)&p_bsdir, PV_NONE, did_set_browsedir,
+			    (char_u *)&p_bsdir, PV_NONE, did_set_browsedir, expand_set_browsedir,
 			    {(char_u *)"last", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"bufhidden",   "bh",   P_STRING|P_ALLOCED|P_VI_DEF|P_NOGLOB,
-			    (char_u *)&p_bh, PV_BH, did_set_bufhidden,
+			    (char_u *)&p_bh, PV_BH, did_set_bufhidden, expand_set_bufhidden,
 			    {(char_u *)"", (char_u *)0L}
 			    SCTX_INIT},
     {"buflisted",   "bl",   P_BOOL|P_VI_DEF|P_NOGLOB,
-			    (char_u *)&p_bl, PV_BL, did_set_buflisted,
+			    (char_u *)&p_bl, PV_BL, did_set_buflisted, NULL,
 			    {(char_u *)1L, (char_u *)0L}
 			    SCTX_INIT},
     {"buftype",	    "bt",   P_STRING|P_ALLOCED|P_VI_DEF|P_NOGLOB,
-			    (char_u *)&p_bt, PV_BT, did_set_buftype,
+			    (char_u *)&p_bt, PV_BT, did_set_buftype, expand_set_buftype,
 			    {(char_u *)"", (char_u *)0L}
 			    SCTX_INIT},
     {"casemap",	    "cmp",   P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP,
-			    (char_u *)&p_cmp, PV_NONE, did_set_casemap,
+			    (char_u *)&p_cmp, PV_NONE, did_set_casemap, expand_set_casemap,
 			    {(char_u *)"internal,keepascii", (char_u *)0L}
 			    SCTX_INIT},
     {"cdhome",	    "cdh",  P_BOOL|P_VI_DEF|P_VIM|P_SECURE,
-			    (char_u *)&p_cdh, PV_NONE, NULL,
+			    (char_u *)&p_cdh, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L}
 			    SCTX_INIT},
     {"cdpath",	    "cd",   P_STRING|P_EXPAND|P_VI_DEF|P_SECURE|P_COMMA|P_NODUP,
-			    (char_u *)&p_cdpath, PV_NONE, NULL,
+			    (char_u *)&p_cdpath, PV_NONE, NULL, NULL,
 			    {(char_u *)",,", (char_u *)0L}
 			    SCTX_INIT},
     {"cedit",	    NULL,   P_STRING,
-			    (char_u *)&p_cedit, PV_NONE, did_set_cedit,
+			    (char_u *)&p_cedit, PV_NONE, did_set_cedit, NULL,
 			    {(char_u *)"", (char_u *)CTRL_F_STR}
 			    SCTX_INIT},
     {"charconvert",  "ccv", P_STRING|P_VI_DEF|P_SECURE,
 #if defined(FEAT_EVAL)
-			    (char_u *)&p_ccv, PV_NONE, did_set_optexpr,
+			    (char_u *)&p_ccv, PV_NONE, did_set_optexpr, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"cindent",	    "cin",  P_BOOL|P_VI_DEF|P_VIM,
-			    (char_u *)&p_cin, PV_CIN, NULL,
+			    (char_u *)&p_cin, PV_CIN, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"cinkeys",	    "cink", P_STRING|P_ALLOCED|P_VI_DEF|P_ONECOMMA|P_NODUP,
-			    (char_u *)&p_cink, PV_CINK, NULL,
+			    (char_u *)&p_cink, PV_CINK, NULL, NULL,
 			    {INDENTKEYS_DEFAULT, (char_u *)0L} SCTX_INIT},
     {"cinoptions",  "cino", P_STRING|P_ALLOCED|P_VI_DEF|P_ONECOMMA|P_NODUP,
-			    (char_u *)&p_cino, PV_CINO, did_set_cinoptions,
+			    (char_u *)&p_cino, PV_CINO, did_set_cinoptions, NULL,
 			    {(char_u *)"", (char_u *)0L} SCTX_INIT},
     {"cinscopedecls", "cinsd", P_STRING|P_ALLOCED|P_VI_DEF|P_ONECOMMA|P_NODUP,
-			    (char_u *)&p_cinsd, PV_CINSD, NULL,
+			    (char_u *)&p_cinsd, PV_CINSD, NULL, NULL,
 			    {(char_u *)"public,protected,private", (char_u *)0L}
 			    SCTX_INIT},
     {"cinwords",    "cinw", P_STRING|P_ALLOCED|P_VI_DEF|P_ONECOMMA|P_NODUP,
-			    (char_u *)&p_cinw, PV_CINW, NULL,
+			    (char_u *)&p_cinw, PV_CINW, NULL, NULL,
 			    {(char_u *)"if,else,while,do,for,switch",
 				(char_u *)0L}
 			    SCTX_INIT},
     {"clipboard",   "cb",   P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP,
 #ifdef FEAT_CLIPBOARD
-			    (char_u *)&p_cb, PV_NONE, did_set_clipboard,
+			    (char_u *)&p_cb, PV_NONE, did_set_clipboard, expand_set_clipboard,
 # ifdef FEAT_XCLIPBOARD
 			    {(char_u *)"autoselect,exclude:cons\\|linux",
 							       (char_u *)0L}
@@ -594,343 +599,343 @@ static struct vimoption options[] =
 			    {(char_u *)"", (char_u *)0L}
 # endif
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"cmdheight",   "ch",   P_NUM|P_VI_DEF|P_RALL,
-			    (char_u *)&p_ch, PV_NONE, did_set_cmdheight,
+			    (char_u *)&p_ch, PV_NONE, did_set_cmdheight, NULL,
 			    {(char_u *)1L, (char_u *)0L} SCTX_INIT},
     {"cmdwinheight", "cwh", P_NUM|P_VI_DEF,
-			    (char_u *)&p_cwh, PV_NONE, NULL,
+			    (char_u *)&p_cwh, PV_NONE, NULL, NULL,
 			    {(char_u *)7L, (char_u *)0L} SCTX_INIT},
     {"colorcolumn", "cc",   P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP|P_RWIN,
 #ifdef FEAT_SYN_HL
-			    (char_u *)VAR_WIN, PV_CC, did_set_colorcolumn,
+			    (char_u *)VAR_WIN, PV_CC, did_set_colorcolumn, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)"", (char_u *)0L} SCTX_INIT},
     {"columns",	    "co",   P_NUM|P_NODEFAULT|P_NO_MKRC|P_VI_DEF|P_RCLR,
-			    (char_u *)&Columns, PV_NONE, NULL,
+			    (char_u *)&Columns, PV_NONE, NULL, NULL,
 			    {(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, did_set_comments,
+			    (char_u *)&p_com, PV_COM, did_set_comments, NULL,
 			    {(char_u *)"s1:/*,mb:*,ex:*/,://,b:#,:%,:XCOMM,n:>,fb:-",
 				(char_u *)0L}
 			    SCTX_INIT},
     {"commentstring", "cms", P_STRING|P_ALLOCED|P_VI_DEF|P_CURSWANT,
 #ifdef FEAT_FOLDING
-			    (char_u *)&p_cms, PV_CMS, did_set_commentstring,
+			    (char_u *)&p_cms, PV_CMS, did_set_commentstring, NULL,
 			    {(char_u *)"/*%s*/", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
 			    // P_PRI_MKRC isn't needed here, optval_default()
 			    // always returns TRUE for 'compatible'
     {"compatible",  "cp",   P_BOOL|P_RALL,
-			    (char_u *)&p_cp, PV_NONE, did_set_compatible,
+			    (char_u *)&p_cp, PV_NONE, did_set_compatible, NULL,
 			    {(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, did_set_complete,
+			    (char_u *)&p_cpt, PV_CPT, did_set_complete, expand_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,
+    {"concealcursor","cocu", P_STRING|P_ALLOCED|P_RWIN|P_VI_DEF|P_FLAGLIST,
 #ifdef FEAT_CONCEAL
-			    (char_u *)VAR_WIN, PV_COCU, did_set_concealcursor,
+			    (char_u *)VAR_WIN, PV_COCU, did_set_concealcursor, expand_set_concealcursor,
 			    {(char_u *)"", (char_u *)NULL}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"conceallevel","cole", P_NUM|P_RWIN|P_VI_DEF,
 #ifdef FEAT_CONCEAL
-			    (char_u *)VAR_WIN, PV_COLE, did_set_conceallevel,
+			    (char_u *)VAR_WIN, PV_COLE, did_set_conceallevel, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)0L, (char_u *)0L}
 			    SCTX_INIT},
     {"completefunc", "cfu", P_STRING|P_ALLOCED|P_VI_DEF|P_SECURE|P_FUNC,
 #ifdef FEAT_COMPL_FUNC
-			    (char_u *)&p_cfu, PV_CFU, did_set_completefunc,
+			    (char_u *)&p_cfu, PV_CFU, did_set_completefunc, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"completeopt",   "cot",  P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP,
-			    (char_u *)&p_cot, PV_NONE, did_set_completeopt,
+			    (char_u *)&p_cot, PV_NONE, did_set_completeopt, expand_set_completeopt,
 			    {(char_u *)"menu,preview", (char_u *)0L}
 			    SCTX_INIT},
-    {"completepopup", "cpp", P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
+    {"completepopup", "cpp", P_STRING|P_VI_DEF|P_COMMA|P_NODUP|P_COLON,
 #if defined(FEAT_PROP_POPUP) && defined(FEAT_QUICKFIX)
-			    (char_u *)&p_cpp, PV_NONE, did_set_completepopup,
+			    (char_u *)&p_cpp, PV_NONE, did_set_completepopup, expand_set_popupoption,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"completeslash",   "csl",  P_STRING|P_VI_DEF|P_VIM,
 #if defined(BACKSLASH_IN_FILENAME)
-			    (char_u *)&p_csl, PV_CSL, did_set_completeslash,
+			    (char_u *)&p_csl, PV_CSL, did_set_completeslash, expand_set_completeslash,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"confirm",     "cf",   P_BOOL|P_VI_DEF,
 #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
-			    (char_u *)&p_confirm, PV_NONE, NULL,
+			    (char_u *)&p_confirm, PV_NONE, NULL, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"conskey",	    "consk",P_BOOL|P_VI_DEF,
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"copyindent",  "ci",   P_BOOL|P_VI_DEF|P_VIM,
-			    (char_u *)&p_ci, PV_CI, NULL,
+			    (char_u *)&p_ci, PV_CI, NULL, 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, did_set_cpoptions,
+			    (char_u *)&p_cpo, PV_NONE, did_set_cpoptions, expand_set_cpoptions,
 			    {(char_u *)CPO_VI, (char_u *)CPO_VIM}
 			    SCTX_INIT},
     {"cryptmethod", "cm",   P_STRING|P_ALLOCED|P_VI_DEF,
 #ifdef FEAT_CRYPT
-			    (char_u *)&p_cm, PV_CM, did_set_cryptmethod,
+			    (char_u *)&p_cm, PV_CM, did_set_cryptmethod, expand_set_cryptmethod,
 			    {(char_u *)"blowfish2", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"cscopepathcomp", "cspc", P_NUM|P_VI_DEF|P_VIM,
 #ifdef FEAT_CSCOPE
-			    (char_u *)&p_cspc, PV_NONE, NULL,
+			    (char_u *)&p_cspc, PV_NONE, NULL, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)0L, (char_u *)0L} SCTX_INIT},
     {"cscopeprg",   "csprg", P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
 #ifdef FEAT_CSCOPE
-			    (char_u *)&p_csprg, PV_NONE, NULL,
+			    (char_u *)&p_csprg, PV_NONE, NULL, NULL,
 			    {(char_u *)"cscope", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"cscopequickfix", "csqf", P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP,
 #if defined(FEAT_CSCOPE) && defined(FEAT_QUICKFIX)
 			    (char_u *)&p_csqf, PV_NONE,
-			    did_set_cscopequickfix,
+			    did_set_cscopequickfix, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"cscoperelative", "csre", P_BOOL|P_VI_DEF|P_VIM,
 #ifdef FEAT_CSCOPE
-			    (char_u *)&p_csre, PV_NONE, NULL,
+			    (char_u *)&p_csre, PV_NONE, NULL, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)0L, (char_u *)0L} SCTX_INIT},
     {"cscopetag",   "cst",  P_BOOL|P_VI_DEF|P_VIM,
 #ifdef FEAT_CSCOPE
-			    (char_u *)&p_cst, PV_NONE, NULL,
+			    (char_u *)&p_cst, PV_NONE, NULL, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)0L, (char_u *)0L} SCTX_INIT},
     {"cscopetagorder", "csto", P_NUM|P_VI_DEF|P_VIM,
 #ifdef FEAT_CSCOPE
-			    (char_u *)&p_csto, PV_NONE, NULL,
+			    (char_u *)&p_csto, PV_NONE, NULL, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)0L, (char_u *)0L} SCTX_INIT},
     {"cscopeverbose", "csverb", P_BOOL|P_VI_DEF|P_VIM,
 #ifdef FEAT_CSCOPE
-			    (char_u *)&p_csverbose, PV_NONE, NULL,
+			    (char_u *)&p_csverbose, PV_NONE, NULL, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)0L, (char_u *)0L} SCTX_INIT},
     {"cursorbind",  "crb",  P_BOOL|P_VI_DEF,
-			    (char_u *)VAR_WIN, PV_CRBIND, NULL,
+			    (char_u *)VAR_WIN, PV_CRBIND, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"cursorcolumn", "cuc", P_BOOL|P_VI_DEF|P_RWINONLY,
 #ifdef FEAT_SYN_HL
-			    (char_u *)VAR_WIN, PV_CUC, NULL,
+			    (char_u *)VAR_WIN, PV_CUC, NULL, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"cursorline",   "cul", P_BOOL|P_VI_DEF|P_RWINONLY,
 #ifdef FEAT_SYN_HL
-			    (char_u *)VAR_WIN, PV_CUL, NULL,
+			    (char_u *)VAR_WIN, PV_CUL, NULL, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"cursorlineopt", "culopt", P_STRING|P_VI_DEF|P_RWIN|P_ONECOMMA|P_NODUP,
 #ifdef FEAT_SYN_HL
 			    (char_u *)VAR_WIN, PV_CULOPT,
-			    did_set_cursorlineopt,
+			    did_set_cursorlineopt, expand_set_cursorlineopt,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)"both", (char_u *)0L} SCTX_INIT},
     {"debug",	    NULL,   P_STRING|P_VI_DEF,
-			    (char_u *)&p_debug, PV_NONE, did_set_debug,
+			    (char_u *)&p_debug, PV_NONE, did_set_debug, expand_set_debug,
 			    {(char_u *)"", (char_u *)0L} SCTX_INIT},
     {"define",	    "def",  P_STRING|P_ALLOCED|P_VI_DEF|P_CURSWANT,
 #ifdef FEAT_FIND_ID
-			    (char_u *)&p_def, PV_DEF, NULL,
+			    (char_u *)&p_def, PV_DEF, NULL, NULL,
 			    {(char_u *)"^\\s*#\\s*define", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"delcombine", "deco",  P_BOOL|P_VI_DEF|P_VIM,
-			    (char_u *)&p_deco, PV_NONE, NULL,
+			    (char_u *)&p_deco, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"dictionary",  "dict", P_STRING|P_EXPAND|P_VI_DEF|P_ONECOMMA|P_NODUP|P_NDNAME,
-			    (char_u *)&p_dict, PV_DICT, NULL,
+			    (char_u *)&p_dict, PV_DICT, NULL, NULL,
 			    {(char_u *)"", (char_u *)0L} SCTX_INIT},
     {"diff",	    NULL,   P_BOOL|P_VI_DEF|P_RWIN|P_NOGLOB,
 #ifdef FEAT_DIFF
-			    (char_u *)VAR_WIN, PV_DIFF, did_set_diff,
+			    (char_u *)VAR_WIN, PV_DIFF, did_set_diff, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(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, did_set_optexpr,
+			    (char_u *)&p_dex, PV_NONE, did_set_optexpr, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
-    {"diffopt",	    "dip",  P_STRING|P_ALLOCED|P_VI_DEF|P_RWIN|P_ONECOMMA
+    {"diffopt",	    "dip",  P_STRING|P_ALLOCED|P_VI_DEF|P_RWIN|P_ONECOMMA|P_COLON
 								     |P_NODUP,
 #ifdef FEAT_DIFF
-			    (char_u *)&p_dip, PV_NONE, did_set_diffopt,
+			    (char_u *)&p_dip, PV_NONE, did_set_diffopt, expand_set_diffopt,
 			    {(char_u *)"internal,filler,closeoff",
 								(char_u *)NULL}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)"", (char_u *)NULL}
 #endif
 			    SCTX_INIT},
     {"digraph",	    "dg",   P_BOOL|P_VI_DEF|P_VIM,
 #ifdef FEAT_DIGRAPHS
-			    (char_u *)&p_dg, PV_NONE, NULL,
+			    (char_u *)&p_dg, PV_NONE, NULL, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"directory",   "dir",  P_STRING|P_EXPAND|P_VI_DEF|P_ONECOMMA
 							    |P_NODUP|P_SECURE,
-			    (char_u *)&p_dir, PV_NONE, NULL,
+			    (char_u *)&p_dir, PV_NONE, NULL, NULL,
 			    {(char_u *)DFLT_DIR, (char_u *)0L} SCTX_INIT},
     {"display",	    "dy",   P_STRING|P_VI_DEF|P_ONECOMMA|P_RALL|P_NODUP,
-			    (char_u *)&p_dy, PV_NONE, did_set_display,
+			    (char_u *)&p_dy, PV_NONE, did_set_display, expand_set_display,
 			    {(char_u *)"", (char_u *)0L} SCTX_INIT},
     {"eadirection", "ead",  P_STRING|P_VI_DEF,
-			    (char_u *)&p_ead, PV_NONE, did_set_eadirection,
+			    (char_u *)&p_ead, PV_NONE, did_set_eadirection, expand_set_eadirection,
 			    {(char_u *)"both", (char_u *)0L}
 			    SCTX_INIT},
     {"edcompatible","ed",   P_BOOL|P_VI_DEF,
-			    (char_u *)&p_ed, PV_NONE, NULL,
+			    (char_u *)&p_ed, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"emoji",      "emo",   P_BOOL|P_VI_DEF|P_RCLR,
-			    (char_u *)&p_emoji, PV_NONE, did_set_ambiwidth,
+			    (char_u *)&p_emoji, PV_NONE, did_set_ambiwidth, NULL,
 			    {(char_u *)TRUE, (char_u *)0L}
 			    SCTX_INIT},
     {"encoding",    "enc",  P_STRING|P_VI_DEF|P_RCLR|P_NO_ML,
-			    (char_u *)&p_enc, PV_NONE, did_set_encoding,
+			    (char_u *)&p_enc, PV_NONE, did_set_encoding, expand_set_encoding,
 			    {(char_u *)ENC_DFLT, (char_u *)0L}
 			    SCTX_INIT},
     {"endoffile",   "eof",  P_BOOL|P_NO_MKRC|P_VI_DEF|P_RSTAT,
 			    (char_u *)&p_eof, PV_EOF,
-			    did_set_eof_eol_fixeol_bomb,
+			    did_set_eof_eol_fixeol_bomb, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"endofline",   "eol",  P_BOOL|P_NO_MKRC|P_VI_DEF|P_RSTAT,
 			    (char_u *)&p_eol, PV_EOL,
-			    did_set_eof_eol_fixeol_bomb,
+			    did_set_eof_eol_fixeol_bomb, NULL,
 			    {(char_u *)TRUE, (char_u *)0L} SCTX_INIT},
     {"equalalways", "ea",   P_BOOL|P_VI_DEF|P_RALL,
-			    (char_u *)&p_ea, PV_NONE, did_set_equalalways,
+			    (char_u *)&p_ea, PV_NONE, did_set_equalalways, NULL,
 			    {(char_u *)TRUE, (char_u *)0L} SCTX_INIT},
     {"equalprg",    "ep",   P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
-			    (char_u *)&p_ep, PV_EP, NULL,
+			    (char_u *)&p_ep, PV_EP, NULL, NULL,
 			    {(char_u *)"", (char_u *)0L} SCTX_INIT},
     {"errorbells",  "eb",   P_BOOL|P_VI_DEF,
-			    (char_u *)&p_eb, PV_NONE, NULL,
+			    (char_u *)&p_eb, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"errorfile",   "ef",   P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
 #ifdef FEAT_QUICKFIX
-			    (char_u *)&p_ef, PV_NONE, NULL,
+			    (char_u *)&p_ef, PV_NONE, NULL, NULL,
 			    {(char_u *)DFLT_ERRORFILE, (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"errorformat", "efm",  P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP,
 #ifdef FEAT_QUICKFIX
-			    (char_u *)&p_efm, PV_EFM, NULL,
+			    (char_u *)&p_efm, PV_EFM, NULL, NULL,
 			    {(char_u *)DFLT_EFM, (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"esckeys",	    "ek",   P_BOOL|P_VIM,
-			    (char_u *)&p_ek, PV_NONE, NULL,
+			    (char_u *)&p_ek, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)TRUE} SCTX_INIT},
     {"eventignore", "ei",   P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP,
-			    (char_u *)&p_ei, PV_NONE, did_set_eventignore,
+			    (char_u *)&p_ei, PV_NONE, did_set_eventignore, expand_set_eventignore,
 			    {(char_u *)"", (char_u *)0L} SCTX_INIT},
     {"expandtab",   "et",   P_BOOL|P_VI_DEF|P_VIM,
-			    (char_u *)&p_et, PV_ET, NULL,
+			    (char_u *)&p_et, PV_ET, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"exrc",	    "ex",   P_BOOL|P_VI_DEF|P_SECURE,
-			    (char_u *)&p_exrc, PV_NONE, NULL,
+			    (char_u *)&p_exrc, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"fileencoding","fenc", P_STRING|P_ALLOCED|P_VI_DEF|P_RSTAT|P_RBUF
 								   |P_NO_MKRC,
-			    (char_u *)&p_fenc, PV_FENC, did_set_encoding,
+			    (char_u *)&p_fenc, PV_FENC, did_set_encoding, expand_set_encoding,
 			    {(char_u *)"", (char_u *)0L}
 			    SCTX_INIT},
     {"fileencodings","fencs", P_STRING|P_VI_DEF|P_ONECOMMA,
-			    (char_u *)&p_fencs, PV_NONE, NULL,
+			    (char_u *)&p_fencs, PV_NONE, NULL, expand_set_encoding,
 			    {(char_u *)"ucs-bom", (char_u *)0L}
 			    SCTX_INIT},
     {"fileformat",  "ff",   P_STRING|P_ALLOCED|P_VI_DEF|P_RSTAT|P_NO_MKRC
 								  |P_CURSWANT,
-			    (char_u *)&p_ff, PV_FF, did_set_fileformat,
+			    (char_u *)&p_ff, PV_FF, did_set_fileformat, expand_set_fileformat,
 			    {(char_u *)DFLT_FF, (char_u *)0L} SCTX_INIT},
     {"fileformats", "ffs",  P_STRING|P_VIM|P_ONECOMMA|P_NODUP,
-			    (char_u *)&p_ffs, PV_NONE, did_set_fileformats,
+			    (char_u *)&p_ffs, PV_NONE, did_set_fileformats, expand_set_fileformat,
 			    {(char_u *)DFLT_FFS_VI, (char_u *)DFLT_FFS_VIM}
 			    SCTX_INIT},
     {"fileignorecase", "fic", P_BOOL|P_VI_DEF,
-			    (char_u *)&p_fic, PV_NONE, NULL,
+			    (char_u *)&p_fic, PV_NONE, NULL, NULL,
 			    {
 #ifdef CASE_INSENSITIVE_FILENAME
 				    (char_u *)TRUE,
@@ -940,190 +945,190 @@ static struct vimoption options[] =
 					(char_u *)0L} SCTX_INIT},
     {"filetype",    "ft",   P_STRING|P_EXPAND|P_ALLOCED|P_VI_DEF|P_NOGLOB|P_NFNAME,
 			    (char_u *)&p_ft, PV_FT,
-			    did_set_filetype_or_syntax,
+			    did_set_filetype_or_syntax, NULL,
 			    {(char_u *)"", (char_u *)0L}
 			    SCTX_INIT},
     {"fillchars",   "fcs",  P_STRING|P_VI_DEF|P_RALL|P_ONECOMMA|P_NODUP,
-			    (char_u *)&p_fcs, PV_FCS, did_set_chars_option,
+			    (char_u *)&p_fcs, PV_FCS, did_set_chars_option, expand_set_chars_option,
 			    {(char_u *)"vert:|,fold:-,eob:~,lastline:@",
 								  (char_u *)0L}
 			    SCTX_INIT},
     {"fixendofline",  "fixeol", P_BOOL|P_VI_DEF|P_RSTAT,
 			    (char_u *)&p_fixeol, PV_FIXEOL,
-			    did_set_eof_eol_fixeol_bomb,
+			    did_set_eof_eol_fixeol_bomb, NULL,
 			    {(char_u *)TRUE, (char_u *)0L} SCTX_INIT},
     {"fkmap",	    "fk",   P_BOOL|P_VI_DEF,
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"flash",	    "fl",   P_BOOL|P_VI_DEF,
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"foldclose",   "fcl",  P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP|P_RWIN,
 #ifdef FEAT_FOLDING
-			    (char_u *)&p_fcl, PV_NONE, did_set_foldclose,
+			    (char_u *)&p_fcl, PV_NONE, did_set_foldclose, expand_set_foldclose,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"foldcolumn",  "fdc",  P_NUM|P_VI_DEF|P_RWIN,
 #ifdef FEAT_FOLDING
-			    (char_u *)VAR_WIN, PV_FDC, did_set_foldcolumn,
+			    (char_u *)VAR_WIN, PV_FDC, did_set_foldcolumn, NULL,
 			    {(char_u *)FALSE, (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"foldenable",  "fen",  P_BOOL|P_VI_DEF|P_RWIN,
 #ifdef FEAT_FOLDING
-			    (char_u *)VAR_WIN, PV_FEN, NULL,
+			    (char_u *)VAR_WIN, PV_FEN, NULL, NULL,
 			    {(char_u *)TRUE, (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    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, did_set_foldexpr,
+			    (char_u *)VAR_WIN, PV_FDE, did_set_foldexpr, NULL,
 			    {(char_u *)"0", (char_u *)NULL}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"foldignore",  "fdi",  P_STRING|P_ALLOCED|P_VIM|P_VI_DEF|P_RWIN,
 #ifdef FEAT_FOLDING
-			    (char_u *)VAR_WIN, PV_FDI, did_set_foldignore,
+			    (char_u *)VAR_WIN, PV_FDI, did_set_foldignore, NULL,
 			    {(char_u *)"#", (char_u *)NULL}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"foldlevel",   "fdl",  P_NUM|P_VI_DEF|P_RWIN,
 #ifdef FEAT_FOLDING
-			    (char_u *)VAR_WIN, PV_FDL, did_set_foldlevel,
+			    (char_u *)VAR_WIN, PV_FDL, did_set_foldlevel, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"foldlevelstart","fdls", P_NUM|P_VI_DEF|P_CURSWANT,
 #ifdef FEAT_FOLDING
-			    (char_u *)&p_fdls, PV_NONE, NULL,
+			    (char_u *)&p_fdls, PV_NONE, NULL, NULL,
 			    {(char_u *)-1L, (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"foldmarker",  "fmr",  P_STRING|P_ALLOCED|P_VIM|P_VI_DEF|
 						    P_RWIN|P_ONECOMMA|P_NODUP,
 #ifdef FEAT_FOLDING
-			    (char_u *)VAR_WIN, PV_FMR, did_set_foldmarker,
+			    (char_u *)VAR_WIN, PV_FMR, did_set_foldmarker, NULL,
 			    {(char_u *)"{{{,}}}", (char_u *)NULL}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"foldmethod",  "fdm",  P_STRING|P_ALLOCED|P_VIM|P_VI_DEF|P_RWIN,
 #ifdef FEAT_FOLDING
-			    (char_u *)VAR_WIN, PV_FDM, did_set_foldmethod,
+			    (char_u *)VAR_WIN, PV_FDM, did_set_foldmethod, expand_set_foldmethod,
 			    {(char_u *)"manual", (char_u *)NULL}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"foldminlines","fml",  P_NUM|P_VI_DEF|P_RWIN,
 #ifdef FEAT_FOLDING
-			    (char_u *)VAR_WIN, PV_FML, did_set_foldminlines,
+			    (char_u *)VAR_WIN, PV_FML, did_set_foldminlines, NULL,
 			    {(char_u *)1L, (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"foldnestmax", "fdn",  P_NUM|P_VI_DEF|P_RWIN,
 #ifdef FEAT_FOLDING
-			    (char_u *)VAR_WIN, PV_FDN, did_set_foldnestmax,
+			    (char_u *)VAR_WIN, PV_FDN, did_set_foldnestmax, NULL,
 			    {(char_u *)20L, (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"foldopen",    "fdo",  P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP|P_CURSWANT,
 #ifdef FEAT_FOLDING
-			    (char_u *)&p_fdo, PV_NONE, did_set_foldopen,
+			    (char_u *)&p_fdo, PV_NONE, did_set_foldopen, expand_set_foldopen,
 		 {(char_u *)"block,hor,mark,percent,quickfix,search,tag,undo",
 						 (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    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, did_set_optexpr,
+			    (char_u *)VAR_WIN, PV_FDT, did_set_optexpr, NULL,
 			    {(char_u *)"foldtext()", (char_u *)NULL}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"formatexpr", "fex",   P_STRING|P_ALLOCED|P_VI_DEF|P_VIM|P_MLE,
 #ifdef FEAT_EVAL
-			    (char_u *)&p_fex, PV_FEX, did_set_optexpr,
+			    (char_u *)&p_fex, PV_FEX, did_set_optexpr, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"formatoptions","fo",  P_STRING|P_ALLOCED|P_VIM|P_FLAGLIST,
-			    (char_u *)&p_fo, PV_FO, did_set_formatoptions,
+			    (char_u *)&p_fo, PV_FO, did_set_formatoptions, expand_set_formatoptions,
 			    {(char_u *)DFLT_FO_VI, (char_u *)DFLT_FO_VIM}
 			    SCTX_INIT},
     {"formatlistpat","flp", P_STRING|P_ALLOCED|P_VI_DEF,
-			    (char_u *)&p_flp, PV_FLP, NULL,
+			    (char_u *)&p_flp, PV_FLP, NULL, NULL,
 			    {(char_u *)"^\\s*\\d\\+[\\]:.)}\\t ]\\s*",
 						 (char_u *)0L} SCTX_INIT},
     {"formatprg",   "fp",   P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
-			    (char_u *)&p_fp, PV_FP, NULL,
+			    (char_u *)&p_fp, PV_FP, NULL, NULL,
 			    {(char_u *)"", (char_u *)0L} SCTX_INIT},
     {"fsync",       "fs",   P_BOOL|P_SECURE|P_VI_DEF,
 #ifdef HAVE_FSYNC
-			    (char_u *)&p_fs, PV_NONE, NULL,
+			    (char_u *)&p_fs, PV_NONE, NULL, NULL,
 			    {(char_u *)TRUE, (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"gdefault",    "gd",   P_BOOL|P_VI_DEF|P_VIM,
-			    (char_u *)&p_gd, PV_NONE, NULL,
+			    (char_u *)&p_gd, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"graphic",	    "gr",   P_BOOL|P_VI_DEF,
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"grepformat",  "gfm",  P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP,
 #ifdef FEAT_QUICKFIX
-			    (char_u *)&p_gefm, PV_NONE, NULL,
+			    (char_u *)&p_gefm, PV_NONE, NULL, NULL,
 			    {(char_u *)DFLT_GREPFORMAT, (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"grepprg",	    "gp",   P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
 #ifdef FEAT_QUICKFIX
-			    (char_u *)&p_gp, PV_GP, NULL,
+			    (char_u *)&p_gp, PV_GP, NULL, NULL,
 			    {
 # if defined(MSWIN)
 			    // may be changed to "grep -n" in os_win32.c
@@ -1139,14 +1144,14 @@ static struct vimoption options[] =
 # endif
 			    (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"guicursor",    "gcr", P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP,
 #ifdef CURSOR_SHAPE
 			    (char_u *)&p_guicursor, PV_NONE,
-			    did_set_guicursor,
+			    did_set_guicursor, NULL,
 			    {
 # 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",
@@ -1155,36 +1160,36 @@ static struct vimoption options[] =
 # endif
 				    (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"guifont",	    "gfn",  P_STRING|P_VI_DEF|P_RCLR|P_ONECOMMA|P_NODUP,
 #ifdef FEAT_GUI
-			    (char_u *)&p_guifont, PV_NONE, did_set_guifont,
+			    (char_u *)&p_guifont, PV_NONE, did_set_guifont, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"guifontset",  "gfs",  P_STRING|P_VI_DEF|P_RCLR|P_ONECOMMA,
 #if defined(FEAT_GUI) && defined(FEAT_XFONTSET)
 			    (char_u *)&p_guifontset, PV_NONE,
-			    did_set_guifontset,
+			    did_set_guifontset, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"guifontwide", "gfw",  P_STRING|P_VI_DEF|P_RCLR|P_ONECOMMA|P_NODUP,
 #if defined(FEAT_GUI)
 			    (char_u *)&p_guifontwide, PV_NONE,
-			    did_set_guifontwide,
+			    did_set_guifontwide, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
@@ -1193,10 +1198,10 @@ static struct vimoption options[] =
     {"guiligatures", "gli", P_STRING|P_VI_DEF|P_RCLR|P_ONECOMMA|P_NODUP,
 #if defined(FEAT_GUI_GTK)
 			    (char_u *)&p_guiligatures, PV_NONE,
-			    did_set_guiligatures,
+			    did_set_guiligatures, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
@@ -1204,215 +1209,215 @@ static struct vimoption options[] =
 
     {"guiheadroom", "ghr",  P_NUM|P_VI_DEF,
 #if defined(FEAT_GUI_GTK) || defined(FEAT_GUI_X11)
-			    (char_u *)&p_ghr, PV_NONE, NULL,
+			    (char_u *)&p_ghr, PV_NONE, NULL, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)50L, (char_u *)0L} SCTX_INIT},
     {"guioptions",  "go",   P_STRING|P_VI_DEF|P_RALL|P_FLAGLIST,
 #if defined(FEAT_GUI)
-			    (char_u *)&p_go, PV_NONE, did_set_guioptions,
+			    (char_u *)&p_go, PV_NONE, did_set_guioptions, expand_set_guioptions,
 # if defined(UNIX)
 			    {(char_u *)"aegimrLtT", (char_u *)0L}
 # else
 			    {(char_u *)"egmrLtT", (char_u *)0L}
 # endif
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"guipty",	    NULL,   P_BOOL|P_VI_DEF,
 #if defined(FEAT_GUI)
-			    (char_u *)&p_guipty, PV_NONE, NULL,
+			    (char_u *)&p_guipty, PV_NONE, NULL, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)TRUE, (char_u *)0L} SCTX_INIT},
     {"guitablabel",  "gtl", P_STRING|P_VI_DEF|P_RWIN|P_MLE,
 #if defined(FEAT_GUI_TABLINE)
-			    (char_u *)&p_gtl, PV_NONE, did_set_guitablabel,
+			    (char_u *)&p_gtl, PV_NONE, did_set_guitablabel, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"guitabtooltip",  "gtt", P_STRING|P_VI_DEF|P_RWIN,
 #if defined(FEAT_GUI_TABLINE)
-			    (char_u *)&p_gtt, PV_NONE, NULL,
+			    (char_u *)&p_gtt, PV_NONE, NULL, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"hardtabs",    "ht",   P_NUM|P_VI_DEF,
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L} SCTX_INIT},
     {"helpfile",    "hf",   P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
-			    (char_u *)&p_hf, PV_NONE, did_set_helpfile,
+			    (char_u *)&p_hf, PV_NONE, did_set_helpfile, NULL,
 			    {(char_u *)DFLT_HELPFILE, (char_u *)0L}
 			    SCTX_INIT},
     {"helpheight",  "hh",   P_NUM|P_VI_DEF,
 			    (char_u *)&p_hh, PV_NONE,
-			    did_set_winheight_helpheight,
+			    did_set_winheight_helpheight, NULL,
 			    {(char_u *)20L, (char_u *)0L} SCTX_INIT},
     {"helplang",    "hlg",  P_STRING|P_VI_DEF|P_ONECOMMA,
 #ifdef FEAT_MULTI_LANG
-			    (char_u *)&p_hlg, PV_NONE, did_set_helplang,
+			    (char_u *)&p_hlg, PV_NONE, did_set_helplang, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"hidden",	    "hid",  P_BOOL|P_VI_DEF,
-			    (char_u *)&p_hid, PV_NONE, NULL,
+			    (char_u *)&p_hid, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
-    {"highlight",   "hl",   P_STRING|P_VI_DEF|P_RCLR|P_ONECOMMA|P_NODUP,
-			    (char_u *)&p_hl, PV_NONE, did_set_highlight,
+    {"highlight",   "hl",   P_STRING|P_VI_DEF|P_RCLR|P_ONECOMMA|P_NODUP|P_COLON,
+			    (char_u *)&p_hl, PV_NONE, did_set_highlight, expand_set_highlight,
 			    {(char_u *)HIGHLIGHT_INIT, (char_u *)0L}
 			    SCTX_INIT},
     {"history",	    "hi",   P_NUM|P_VIM,
-			    (char_u *)&p_hi, PV_NONE, NULL,
+			    (char_u *)&p_hi, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)50L} SCTX_INIT},
     {"hkmap",	    "hk",   P_BOOL|P_VI_DEF|P_VIM,
 #ifdef FEAT_RIGHTLEFT
-			    (char_u *)&p_hkmap, PV_NONE, NULL,
+			    (char_u *)&p_hkmap, PV_NONE, NULL, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"hkmapp",	    "hkp",  P_BOOL|P_VI_DEF|P_VIM,
 #ifdef FEAT_RIGHTLEFT
-			    (char_u *)&p_hkmapp, PV_NONE, NULL,
+			    (char_u *)&p_hkmapp, PV_NONE, NULL, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"hlsearch",    "hls",  P_BOOL|P_VI_DEF|P_VIM|P_RALL,
 #if defined(FEAT_SEARCH_EXTRA)
-			    (char_u *)&p_hls, PV_NONE, did_set_hlsearch,
+			    (char_u *)&p_hls, PV_NONE, did_set_hlsearch, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"icon",	    NULL,   P_BOOL|P_VI_DEF,
-			    (char_u *)&p_icon, PV_NONE, did_set_title_icon,
+			    (char_u *)&p_icon, PV_NONE, did_set_title_icon, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"iconstring",  NULL,   P_STRING|P_VI_DEF|P_MLE,
 			    (char_u *)&p_iconstring, PV_NONE,
-			    did_set_iconstring,
+			    did_set_iconstring, NULL,
 			    {(char_u *)"", (char_u *)0L} SCTX_INIT},
     {"ignorecase",  "ic",   P_BOOL|P_VI_DEF,
-			    (char_u *)&p_ic, PV_NONE, did_set_ignorecase,
+			    (char_u *)&p_ic, PV_NONE, did_set_ignorecase, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"imactivatefunc","imaf",P_STRING|P_VI_DEF|P_SECURE|P_FUNC,
 #if defined(FEAT_EVAL) && \
 	(defined(FEAT_XIM) || defined(IME_WITHOUT_XIM) || defined(VIMDLL))
 			    (char_u *)&p_imaf, PV_NONE,
-			    did_set_imactivatefunc,
+			    did_set_imactivatefunc, NULL,
 			    {(char_u *)"", (char_u *)NULL}
 # else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 # endif
 			    SCTX_INIT},
     {"imactivatekey","imak",P_STRING|P_VI_DEF,
 #if defined(FEAT_XIM) && defined(FEAT_GUI_GTK)
 			    (char_u *)&p_imak, PV_NONE,
-			    did_set_imactivatekey,
+			    did_set_imactivatekey, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)"", (char_u *)0L} SCTX_INIT},
     {"imcmdline",   "imc",  P_BOOL|P_VI_DEF,
-			    (char_u *)&p_imcmdline, PV_NONE, NULL,
+			    (char_u *)&p_imcmdline, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"imdisable",   "imd",  P_BOOL|P_VI_DEF,
 #if defined(HAVE_INPUT_METHOD)
 			    (char_u *)&p_imdisable, PV_NONE,
-			    did_set_imdisable,
+			    did_set_imdisable, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)FALSE, (char_u *)0L}
 			    SCTX_INIT},
     {"iminsert",    "imi",  P_NUM|P_VI_DEF,
-			    (char_u *)&p_iminsert, PV_IMI, did_set_iminsert,
+			    (char_u *)&p_iminsert, PV_IMI, did_set_iminsert, NULL,
 			    {(char_u *)B_IMODE_NONE, (char_u *)0L}
 			    SCTX_INIT},
     {"imsearch",    "ims",  P_NUM|P_VI_DEF,
-			    (char_u *)&p_imsearch, PV_IMS, did_set_imsearch,
+			    (char_u *)&p_imsearch, PV_IMS, did_set_imsearch, NULL,
 			    {(char_u *)B_IMODE_USE_INSERT, (char_u *)0L}
 			    SCTX_INIT},
     {"imstatusfunc","imsf",P_STRING|P_VI_DEF|P_SECURE|P_FUNC,
 #if defined(FEAT_EVAL) && \
 	(defined(FEAT_XIM) || defined(IME_WITHOUT_XIM) || defined(VIMDLL))
-			    (char_u *)&p_imsf, PV_NONE, did_set_imstatusfunc,
+			    (char_u *)&p_imsf, PV_NONE, did_set_imstatusfunc, NULL,
 			    {(char_u *)"", (char_u *)NULL}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"imstyle",	    "imst", P_NUM|P_VI_DEF|P_SECURE,
 #if defined(FEAT_XIM) && defined(FEAT_GUI_GTK)
-			    (char_u *)&p_imst, PV_NONE, did_set_imstyle,
+			    (char_u *)&p_imst, PV_NONE, did_set_imstyle, NULL,
 			    {(char_u *)IM_OVER_THE_SPOT, (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"include",	    "inc",  P_STRING|P_ALLOCED|P_VI_DEF,
 #ifdef FEAT_FIND_ID
-			    (char_u *)&p_inc, PV_INC, NULL,
+			    (char_u *)&p_inc, PV_INC, NULL, NULL,
 			    {(char_u *)"^\\s*#\\s*include", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    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, did_set_optexpr,
+			    (char_u *)&p_inex, PV_INEX, did_set_optexpr, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"incsearch",   "is",   P_BOOL|P_VI_DEF|P_VIM,
-			    (char_u *)&p_is, PV_NONE, NULL,
+			    (char_u *)&p_is, PV_NONE, NULL, NULL,
 			    {(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, did_set_optexpr,
+			    (char_u *)&p_inde, PV_INDE, did_set_optexpr, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"indentkeys", "indk",  P_STRING|P_ALLOCED|P_VI_DEF|P_ONECOMMA|P_NODUP,
 #if defined(FEAT_EVAL)
-			    (char_u *)&p_indk, PV_INDK, NULL,
+			    (char_u *)&p_indk, PV_INDK, NULL, NULL,
 			    {INDENTKEYS_DEFAULT, (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"infercase",   "inf",  P_BOOL|P_VI_DEF,
-			    (char_u *)&p_inf, PV_INF, NULL,
+			    (char_u *)&p_inf, PV_INF, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"insertmode",  "im",   P_BOOL|P_VI_DEF|P_VIM,
-			    (char_u *)&p_im, PV_NONE, did_set_insertmode,
+			    (char_u *)&p_im, PV_NONE, did_set_insertmode, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"isfname",	    "isf",  P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
-			    (char_u *)&p_isf, PV_NONE, did_set_isopt,
+			    (char_u *)&p_isf, PV_NONE, did_set_isopt, NULL,
 			    {
 #ifdef BACKSLASH_IN_FILENAME
 				// Excluded are: & and ^ are special in cmd.exe
@@ -1429,7 +1434,7 @@ static struct vimoption options[] =
 #endif
 				(char_u *)0L} SCTX_INIT},
     {"isident",	    "isi",  P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
-			    (char_u *)&p_isi, PV_NONE, did_set_isopt,
+			    (char_u *)&p_isi, PV_NONE, did_set_isopt, NULL,
 			    {
 #if defined(MSWIN)
 			    (char_u *)"@,48-57,_,128-167,224-235",
@@ -1438,7 +1443,7 @@ static struct vimoption options[] =
 #endif
 				(char_u *)0L} SCTX_INIT},
     {"iskeyword",   "isk",  P_STRING|P_ALLOCED|P_VIM|P_COMMA|P_NODUP,
-			    (char_u *)&p_isk, PV_ISK, did_set_isopt,
+			    (char_u *)&p_isk, PV_ISK, did_set_isopt, NULL,
 			    {
 				(char_u *)"@,48-57,_",
 #if defined(MSWIN)
@@ -1448,7 +1453,7 @@ static struct vimoption options[] =
 #endif
 			    } SCTX_INIT},
     {"isprint",	    "isp",  P_STRING|P_VI_DEF|P_RALL|P_COMMA|P_NODUP,
-			    (char_u *)&p_isp, PV_NONE, did_set_isopt,
+			    (char_u *)&p_isp, PV_NONE, did_set_isopt, NULL,
 			    {
 #if defined(MSWIN) || defined(VMS)
 			    (char_u *)"@,~-255",
@@ -1457,38 +1462,38 @@ static struct vimoption options[] =
 #endif
 				(char_u *)0L} SCTX_INIT},
     {"joinspaces",  "js",   P_BOOL|P_VI_DEF|P_VIM,
-			    (char_u *)&p_js, PV_NONE, NULL,
+			    (char_u *)&p_js, PV_NONE, NULL, NULL,
 			    {(char_u *)TRUE, (char_u *)0L} SCTX_INIT},
     {"jumpoptions", "jop",  P_STRING|P_VI_DEF|P_VIM|P_ONECOMMA|P_NODUP,
-			    (char_u *)&p_jop, PV_NONE, did_set_jumpoptions,
+			    (char_u *)&p_jop, PV_NONE, did_set_jumpoptions, expand_set_jumpoptions,
 			    {(char_u *)"", (char_u *)0L} SCTX_INIT},
     {"key",	    NULL,   P_STRING|P_ALLOCED|P_VI_DEF|P_NO_MKRC,
 #ifdef FEAT_CRYPT
-			    (char_u *)&p_key, PV_KEY, did_set_cryptkey,
+			    (char_u *)&p_key, PV_KEY, did_set_cryptkey, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"keymap",	    "kmp",  P_STRING|P_ALLOCED|P_VI_DEF|P_RBUF|P_RSTAT|P_NFNAME|P_PRI_MKRC,
 #ifdef FEAT_KEYMAP
-			    (char_u *)&p_keymap, PV_KMAP, did_set_keymap,
+			    (char_u *)&p_keymap, PV_KMAP, did_set_keymap, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"keymodel",    "km",   P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP,
-			    (char_u *)&p_km, PV_NONE, did_set_keymodel,
+			    (char_u *)&p_km, PV_NONE, did_set_keymodel, expand_set_keymodel,
 			    {(char_u *)"", (char_u *)0L} SCTX_INIT},
-    {"keyprotocol", "kpc",  P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP,
-			    (char_u *)&p_kpc, PV_NONE, did_set_keyprotocol,
+    {"keyprotocol", "kpc",  P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP|P_COLON,
+			    (char_u *)&p_kpc, PV_NONE, did_set_keyprotocol, expand_set_keyprotocol,
 			    {(char_u *)"kitty:kitty,foot:kitty,wezterm:kitty,xterm:mok2", (char_u *)0L}
 			    SCTX_INIT},
     {"keywordprg",  "kp",   P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
-			    (char_u *)&p_kp, PV_KP, NULL,
+			    (char_u *)&p_kp, PV_KP, NULL, NULL,
 			    {
 #if defined(MSWIN)
 			    (char_u *)":help",
@@ -1502,49 +1507,49 @@ static struct vimoption options[] =
 				(char_u *)0L} SCTX_INIT},
     {"langmap",     "lmap", P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP|P_SECURE,
 #ifdef FEAT_LANGMAP
-			    (char_u *)&p_langmap, PV_NONE, did_set_langmap,
+			    (char_u *)&p_langmap, PV_NONE, did_set_langmap, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"langmenu",    "lm",   P_STRING|P_VI_DEF|P_NFNAME,
 #if defined(FEAT_MENU) && defined(FEAT_MULTI_LANG)
-			    (char_u *)&p_lm, PV_NONE, NULL,
+			    (char_u *)&p_lm, PV_NONE, NULL, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)"", (char_u *)0L} SCTX_INIT},
     {"langnoremap",  "lnr",   P_BOOL|P_VI_DEF,
 #ifdef FEAT_LANGMAP
-			    (char_u *)&p_lnr, PV_NONE, did_set_langnoremap,
+			    (char_u *)&p_lnr, PV_NONE, did_set_langnoremap, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"langremap",  "lrm",   P_BOOL|P_VI_DEF,
 #ifdef FEAT_LANGMAP
-			    (char_u *)&p_lrm, PV_NONE, did_set_langremap,
+			    (char_u *)&p_lrm, PV_NONE, did_set_langremap, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)TRUE, (char_u *)0L} SCTX_INIT},
     {"laststatus",  "ls",   P_NUM|P_VI_DEF|P_RALL,
-			    (char_u *)&p_ls, PV_NONE, did_set_laststatus,
+			    (char_u *)&p_ls, PV_NONE, did_set_laststatus, NULL,
 			    {(char_u *)1L, (char_u *)0L} SCTX_INIT},
     {"lazyredraw",  "lz",   P_BOOL|P_VI_DEF,
-			    (char_u *)&p_lz, PV_NONE, NULL,
+			    (char_u *)&p_lz, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"linebreak",   "lbr",  P_BOOL|P_VI_DEF|P_RWIN,
 #ifdef FEAT_LINEBREAK
-			    (char_u *)VAR_WIN, PV_LBR, NULL,
+			    (char_u *)VAR_WIN, PV_LBR, NULL, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"lines",	    NULL,   P_NUM|P_NODEFAULT|P_NO_MKRC|P_VI_DEF|P_RCLR,
-			    (char_u *)&Rows, PV_NONE, NULL,
+			    (char_u *)&Rows, PV_NONE, NULL, NULL,
 			    {
 #if defined(MSWIN)
 			    (char_u *)25L,
@@ -1555,9 +1560,9 @@ static struct vimoption options[] =
     {"linespace",   "lsp",  P_NUM|P_VI_DEF|P_RCLR,
 #ifdef FEAT_GUI
 			    (char_u *)&p_linespace, PV_NONE,
-			    did_set_linespace,
+			    did_set_linespace, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 #ifdef FEAT_GUI_MSWIN
 			    {(char_u *)1L, (char_u *)0L}
@@ -1566,135 +1571,135 @@ static struct vimoption options[] =
 #endif
 			    SCTX_INIT},
     {"lisp",	    NULL,   P_BOOL|P_VI_DEF,
-			    (char_u *)&p_lisp, PV_LISP, did_set_lisp,
+			    (char_u *)&p_lisp, PV_LISP, did_set_lisp, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"lispoptions", "lop",  P_STRING|P_ALLOCED|P_VI_DEF|P_ONECOMMA|P_NODUP,
-			    (char_u *)&p_lop, PV_LOP, did_set_lispoptions,
+			    (char_u *)&p_lop, PV_LOP, did_set_lispoptions, expand_set_lispoptions,
 			    {(char_u *)"", (char_u *)0L} SCTX_INIT},
     {"lispwords",   "lw",   P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP,
-			    (char_u *)&p_lispwords, PV_LW, NULL,
+			    (char_u *)&p_lispwords, PV_LW, NULL, NULL,
 			    {(char_u *)LISPWORD_VALUE, (char_u *)0L} SCTX_INIT},
     {"list",	    NULL,   P_BOOL|P_VI_DEF|P_RWIN,
-			    (char_u *)VAR_WIN, PV_LIST, NULL,
+			    (char_u *)VAR_WIN, PV_LIST, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"listchars",   "lcs",  P_STRING|P_VI_DEF|P_RALL|P_ONECOMMA|P_NODUP,
-			    (char_u *)&p_lcs, PV_LCS, did_set_chars_option,
+			    (char_u *)&p_lcs, PV_LCS, did_set_chars_option, expand_set_chars_option,
 			    {(char_u *)"eol:$", (char_u *)0L} SCTX_INIT},
     {"loadplugins", "lpl",  P_BOOL|P_VI_DEF,
-			    (char_u *)&p_lpl, PV_NONE, NULL,
+			    (char_u *)&p_lpl, PV_NONE, NULL, NULL,
 			    {(char_u *)TRUE, (char_u *)0L} SCTX_INIT},
     {"luadll",      NULL,   P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
 #if defined(DYNAMIC_LUA)
-			    (char_u *)&p_luadll, PV_NONE, NULL,
+			    (char_u *)&p_luadll, PV_NONE, NULL, NULL,
 			    {(char_u *)DYNAMIC_LUA_DLL, (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"macatsui",    NULL,   P_BOOL|P_VI_DEF|P_RCLR,
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)"", (char_u *)0L}
 			    SCTX_INIT},
     {"magic",	    NULL,   P_BOOL|P_VI_DEF,
-			    (char_u *)&p_magic, PV_NONE, NULL,
+			    (char_u *)&p_magic, PV_NONE, NULL, NULL,
 			    {(char_u *)TRUE, (char_u *)0L} SCTX_INIT},
     {"makeef",	    "mef",  P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
 #ifdef FEAT_QUICKFIX
-			    (char_u *)&p_mef, PV_NONE, NULL,
+			    (char_u *)&p_mef, PV_NONE, NULL, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"makeencoding","menc", P_STRING|P_VI_DEF,
-			    (char_u *)&p_menc, PV_MENC, did_set_encoding,
+			    (char_u *)&p_menc, PV_MENC, did_set_encoding, expand_set_encoding,
 			    {(char_u *)"", (char_u *)0L}
 			    SCTX_INIT},
     {"makeprg",	    "mp",   P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
 #ifdef FEAT_QUICKFIX
-			    (char_u *)&p_mp, PV_MP, NULL,
+			    (char_u *)&p_mp, PV_MP, NULL, NULL,
 # ifdef VMS
 			    {(char_u *)"MMS", (char_u *)0L}
 # else
 			    {(char_u *)"make", (char_u *)0L}
 # endif
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"matchpairs",  "mps",  P_STRING|P_ALLOCED|P_VI_DEF|P_ONECOMMA|P_NODUP,
-			    (char_u *)&p_mps, PV_MPS, did_set_matchpairs,
+			    (char_u *)&p_mps, PV_MPS, did_set_matchpairs, NULL,
 			    {(char_u *)"(:),{:},[:]", (char_u *)0L}
 			    SCTX_INIT},
     {"matchtime",   "mat",  P_NUM|P_VI_DEF,
-			    (char_u *)&p_mat, PV_NONE, NULL,
+			    (char_u *)&p_mat, PV_NONE, NULL, NULL,
 			    {(char_u *)5L, (char_u *)0L} SCTX_INIT},
     {"maxcombine",  "mco",  P_NUM|P_VI_DEF|P_CURSWANT,
-			    (char_u *)&p_mco, PV_NONE, did_set_maxcombine,
+			    (char_u *)&p_mco, PV_NONE, did_set_maxcombine, NULL,
 			    {(char_u *)2, (char_u *)0L} SCTX_INIT},
     {"maxfuncdepth", "mfd", P_NUM|P_VI_DEF,
 #ifdef FEAT_EVAL
-			    (char_u *)&p_mfd, PV_NONE, NULL,
+			    (char_u *)&p_mfd, PV_NONE, NULL, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)100L, (char_u *)0L} SCTX_INIT},
     {"maxmapdepth", "mmd",  P_NUM|P_VI_DEF,
-			    (char_u *)&p_mmd, PV_NONE, NULL,
+			    (char_u *)&p_mmd, PV_NONE, NULL, NULL,
 			    {(char_u *)1000L, (char_u *)0L} SCTX_INIT},
     {"maxmem",	    "mm",   P_NUM|P_VI_DEF,
-			    (char_u *)&p_mm, PV_NONE, NULL,
+			    (char_u *)&p_mm, PV_NONE, NULL, NULL,
 			    {(char_u *)DFLT_MAXMEM, (char_u *)0L}
 			    SCTX_INIT},
     {"maxmempattern","mmp", P_NUM|P_VI_DEF,
-			    (char_u *)&p_mmp, PV_NONE, NULL,
+			    (char_u *)&p_mmp, PV_NONE, NULL, NULL,
 			    {(char_u *)1000L, (char_u *)0L} SCTX_INIT},
     {"maxmemtot",   "mmt",  P_NUM|P_VI_DEF,
-			    (char_u *)&p_mmt, PV_NONE, NULL,
+			    (char_u *)&p_mmt, PV_NONE, NULL, NULL,
 			    {(char_u *)DFLT_MAXMEMTOT, (char_u *)0L}
 			    SCTX_INIT},
     {"menuitems",   "mis",  P_NUM|P_VI_DEF,
 #ifdef FEAT_MENU
-			    (char_u *)&p_mis, PV_NONE, NULL,
+			    (char_u *)&p_mis, PV_NONE, NULL, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)25L, (char_u *)0L} SCTX_INIT},
     {"mesg",	    NULL,   P_BOOL|P_VI_DEF,
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"mkspellmem",  "msm",  P_STRING|P_VI_DEF|P_EXPAND|P_SECURE,
 #ifdef FEAT_SPELL
-			    (char_u *)&p_msm, PV_NONE, did_set_mkspellmem,
+			    (char_u *)&p_msm, PV_NONE, did_set_mkspellmem, NULL,
 			    {(char_u *)"460000,2000,500", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"modeline",    "ml",   P_BOOL|P_VIM,
-			    (char_u *)&p_ml, PV_ML, NULL,
+			    (char_u *)&p_ml, PV_ML, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)TRUE} SCTX_INIT},
     {"modelineexpr", "mle",  P_BOOL|P_VI_DEF|P_SECURE,
-			    (char_u *)&p_mle, PV_NONE, NULL,
+			    (char_u *)&p_mle, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"modelines",   "mls",  P_NUM|P_VI_DEF,
-			    (char_u *)&p_mls, PV_NONE, NULL,
+			    (char_u *)&p_mls, PV_NONE, NULL, NULL,
 			    {(char_u *)5L, (char_u *)0L} SCTX_INIT},
     {"modifiable",  "ma",   P_BOOL|P_VI_DEF|P_NOGLOB,
-			    (char_u *)&p_ma, PV_MA, did_set_modifiable,
+			    (char_u *)&p_ma, PV_MA, did_set_modifiable, NULL,
 			    {(char_u *)TRUE, (char_u *)0L} SCTX_INIT},
     {"modified",    "mod",  P_BOOL|P_NO_MKRC|P_VI_DEF|P_RSTAT,
-			    (char_u *)&p_mod, PV_MOD, did_set_modified,
+			    (char_u *)&p_mod, PV_MOD, did_set_modified, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"more",	    NULL,   P_BOOL|P_VIM,
-			    (char_u *)&p_more, PV_NONE, NULL,
+			    (char_u *)&p_more, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)TRUE} SCTX_INIT},
     {"mouse",	    NULL,   P_STRING|P_VI_DEF|P_FLAGLIST,
-			    (char_u *)&p_mouse, PV_NONE, did_set_mouse,
+			    (char_u *)&p_mouse, PV_NONE, did_set_mouse, expand_set_mouse,
 			    {
 #if defined(MSWIN)
 				(char_u *)"a",
@@ -1704,20 +1709,20 @@ static struct vimoption options[] =
 				(char_u *)0L} SCTX_INIT},
     {"mousefocus",   "mousef", P_BOOL|P_VI_DEF,
 #ifdef FEAT_GUI
-			    (char_u *)&p_mousef, PV_NONE, NULL,
+			    (char_u *)&p_mousef, PV_NONE, NULL, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"mousehide",   "mh",   P_BOOL|P_VI_DEF,
 #ifdef FEAT_GUI
-			    (char_u *)&p_mh, PV_NONE, did_set_mousehide,
+			    (char_u *)&p_mh, PV_NONE, did_set_mousehide, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)TRUE, (char_u *)0L} SCTX_INIT},
     {"mousemodel",  "mousem", P_STRING|P_VI_DEF,
-			    (char_u *)&p_mousem, PV_NONE, did_set_mousemodel,
+			    (char_u *)&p_mousem, PV_NONE, did_set_mousemodel, expand_set_mousemodel,
 			    {
 #if defined(MSWIN)
 				(char_u *)"popup",
@@ -1731,127 +1736,127 @@ static struct vimoption options[] =
 				(char_u *)0L} SCTX_INIT},
     {"mousemoveevent",   "mousemev",   P_BOOL|P_VI_DEF,
 #ifdef FEAT_GUI
-			    (char_u *)&p_mousemev, PV_NONE, NULL,
+			    (char_u *)&p_mousemev, PV_NONE, NULL, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"mouseshape",  "mouses",  P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP,
 #ifdef FEAT_MOUSESHAPE
 			    (char_u *)&p_mouseshape, PV_NONE,
-			    did_set_mouseshape,
+			    did_set_mouseshape, NULL,
 			    {(char_u *)"i-r:beam,s:updown,sd:udsizing,vs:leftright,vd:lrsizing,m:no,ml:up-arrow,v:rightup-arrow", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"mousetime",   "mouset",	P_NUM|P_VI_DEF,
-			    (char_u *)&p_mouset, PV_NONE, NULL,
+			    (char_u *)&p_mouset, PV_NONE, NULL, NULL,
 			    {(char_u *)500L, (char_u *)0L} SCTX_INIT},
     {"mzschemedll", NULL,   P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
 #if defined(DYNAMIC_MZSCHEME)
-			    (char_u *)&p_mzschemedll, PV_NONE, NULL,
+			    (char_u *)&p_mzschemedll, PV_NONE, NULL, NULL,
 			    {(char_u *)DYNAMIC_MZSCH_DLL, (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"mzschemegcdll", NULL, P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
 #if defined(DYNAMIC_MZSCHEME)
-			    (char_u *)&p_mzschemegcdll, PV_NONE, NULL,
+			    (char_u *)&p_mzschemegcdll, PV_NONE, NULL, NULL,
 			    {(char_u *)DYNAMIC_MZGC_DLL, (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"mzquantum",  "mzq",   P_NUM,
 #ifdef FEAT_MZSCHEME
-			    (char_u *)&p_mzq, PV_NONE, did_set_mzquantum,
+			    (char_u *)&p_mzq, PV_NONE, did_set_mzquantum, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)100L, (char_u *)100L} SCTX_INIT},
     {"novice",	    NULL,   P_BOOL|P_VI_DEF,
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"nrformats",   "nf",   P_STRING|P_ALLOCED|P_VI_DEF|P_ONECOMMA|P_NODUP,
-			    (char_u *)&p_nf, PV_NF, did_set_nrformats,
+			    (char_u *)&p_nf, PV_NF, did_set_nrformats, expand_set_nrformats,
 			    {(char_u *)"bin,octal,hex", (char_u *)0L}
 			    SCTX_INIT},
     {"number",	    "nu",   P_BOOL|P_VI_DEF|P_RWIN,
 			    (char_u *)VAR_WIN, PV_NU,
-			    did_set_number_relativenumber,
+			    did_set_number_relativenumber, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"numberwidth", "nuw",  P_NUM|P_RWIN|P_VIM,
 #ifdef FEAT_LINEBREAK
-			    (char_u *)VAR_WIN, PV_NUW, did_set_numberwidth,
+			    (char_u *)VAR_WIN, PV_NUW, did_set_numberwidth, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)8L, (char_u *)4L} SCTX_INIT},
     {"omnifunc",    "ofu",  P_STRING|P_ALLOCED|P_VI_DEF|P_SECURE|P_FUNC,
 #ifdef FEAT_COMPL_FUNC
-			    (char_u *)&p_ofu, PV_OFU, did_set_omnifunc,
+			    (char_u *)&p_ofu, PV_OFU, did_set_omnifunc, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"open",	    NULL,   P_BOOL|P_VI_DEF,
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"opendevice",  "odev", P_BOOL|P_VI_DEF,
 #if defined(MSWIN)
-			    (char_u *)&p_odev, PV_NONE, NULL,
+			    (char_u *)&p_odev, PV_NONE, NULL, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)FALSE, (char_u *)FALSE}
 			    SCTX_INIT},
     {"operatorfunc", "opfunc", P_STRING|P_VI_DEF|P_SECURE|P_FUNC,
 			    (char_u *)&p_opfunc, PV_NONE,
-			    did_set_operatorfunc,
+			    did_set_operatorfunc, NULL,
 			    {(char_u *)"", (char_u *)0L} SCTX_INIT},
     {"optimize",    "opt",  P_BOOL|P_VI_DEF,
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"osfiletype",  "oft",  P_STRING|P_ALLOCED|P_VI_DEF,
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L} SCTX_INIT},
     {"packpath",    "pp",   P_STRING|P_VI_DEF|P_EXPAND|P_ONECOMMA|P_NODUP
 								    |P_SECURE,
-			    (char_u *)&p_pp, PV_NONE, NULL,
+			    (char_u *)&p_pp, PV_NONE, NULL, NULL,
 			    {(char_u *)DFLT_RUNTIMEPATH, (char_u *)0L}
 			    SCTX_INIT},
     {"paragraphs",  "para", P_STRING|P_VI_DEF,
-			    (char_u *)&p_para, PV_NONE, NULL,
+			    (char_u *)&p_para, PV_NONE, NULL, NULL,
 			    {(char_u *)"IPLPPPQPP TPHPLIPpLpItpplpipbp",
 				(char_u *)0L} SCTX_INIT},
     {"paste",	    NULL,   P_BOOL|P_VI_DEF|P_PRI_MKRC,
-			    (char_u *)&p_paste, PV_NONE, did_set_paste,
+			    (char_u *)&p_paste, PV_NONE, did_set_paste, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"pastetoggle", "pt",   P_STRING|P_VI_DEF,
-			    (char_u *)&p_pt, PV_NONE, did_set_pastetoggle,
+			    (char_u *)&p_pt, PV_NONE, did_set_pastetoggle, NULL,
 			    {(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, did_set_optexpr,
+			    (char_u *)&p_pex, PV_NONE, did_set_optexpr, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"patchmode",   "pm",   P_STRING|P_VI_DEF|P_NFNAME,
 			    (char_u *)&p_pm, PV_NONE,
-			    did_set_backupext_or_patchmode,
+			    did_set_backupext_or_patchmode, NULL,
 			    {(char_u *)"", (char_u *)0L} SCTX_INIT},
     {"path",	    "pa",   P_STRING|P_EXPAND|P_VI_DEF|P_COMMA|P_NODUP,
-			    (char_u *)&p_path, PV_PATH, NULL,
+			    (char_u *)&p_path, PV_PATH, NULL, NULL,
 			    {
 #if defined(AMIGA) || defined(MSWIN)
 			    (char_u *)".,,",
@@ -1861,70 +1866,70 @@ static struct vimoption options[] =
 				(char_u *)0L} SCTX_INIT},
     {"perldll",     NULL,   P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
 #if defined(DYNAMIC_PERL)
-			    (char_u *)&p_perldll, PV_NONE, NULL,
+			    (char_u *)&p_perldll, PV_NONE, NULL, NULL,
 			    {(char_u *)DYNAMIC_PERL_DLL, (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"preserveindent", "pi", P_BOOL|P_VI_DEF|P_VIM,
-			    (char_u *)&p_pi, PV_PI, NULL,
+			    (char_u *)&p_pi, PV_PI, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"previewheight", "pvh", P_NUM|P_VI_DEF,
 #if defined(FEAT_QUICKFIX)
-			    (char_u *)&p_pvh, PV_NONE, NULL,
+			    (char_u *)&p_pvh, PV_NONE, NULL, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)12L, (char_u *)0L} SCTX_INIT},
-    {"previewpopup", "pvp", P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
+    {"previewpopup", "pvp", P_STRING|P_VI_DEF|P_COMMA|P_NODUP|P_COLON,
 #ifdef FEAT_PROP_POPUP
-			    (char_u *)&p_pvp, PV_NONE, did_set_previewpopup,
+			    (char_u *)&p_pvp, PV_NONE, did_set_previewpopup, expand_set_popupoption,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"previewwindow", "pvw", P_BOOL|P_VI_DEF|P_RSTAT|P_NOGLOB,
 #if defined(FEAT_QUICKFIX)
-			    (char_u *)VAR_WIN, PV_PVW, did_set_previewwindow,
+			    (char_u *)VAR_WIN, PV_PVW, did_set_previewwindow, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"printdevice", "pdev", P_STRING|P_VI_DEF|P_SECURE,
 #ifdef FEAT_PRINTER
-			    (char_u *)&p_pdev, PV_NONE, NULL,
+			    (char_u *)&p_pdev, PV_NONE, NULL, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"printencoding", "penc", P_STRING|P_VI_DEF,
 #ifdef FEAT_POSTSCRIPT
 			    (char_u *)&p_penc, PV_NONE,
-			    did_set_printencoding,
+			    did_set_printencoding, expand_set_encoding,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"printexpr", "pexpr",  P_STRING|P_VI_DEF|P_SECURE,
 #ifdef FEAT_POSTSCRIPT
-			    (char_u *)&p_pexpr, PV_NONE, did_set_optexpr,
+			    (char_u *)&p_pexpr, PV_NONE, did_set_optexpr, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"printfont", "pfn",    P_STRING|P_VI_DEF,
 #ifdef FEAT_PRINTER
-			    (char_u *)&p_pfn, PV_NONE, NULL,
+			    (char_u *)&p_pfn, PV_NONE, NULL, NULL,
 			    {
 # ifdef MSWIN
 				(char_u *)"Courier_New:h10",
@@ -1933,253 +1938,253 @@ static struct vimoption options[] =
 # endif
 				(char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"printheader", "pheader",  P_STRING|P_VI_DEF|P_GETTEXT,
 #ifdef FEAT_PRINTER
-			    (char_u *)&p_header, PV_NONE, NULL,
+			    (char_u *)&p_header, PV_NONE, NULL, NULL,
 			    // untranslated to avoid problems when 'encoding'
 			    // is changed
 			    {(char_u *)"%<%f%h%m%=Page %N", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
-   {"printmbcharset", "pmbcs",  P_STRING|P_VI_DEF,
+    {"printmbcharset", "pmbcs",  P_STRING|P_VI_DEF,
 #if defined(FEAT_POSTSCRIPT)
-			    (char_u *)&p_pmcs, PV_NONE, NULL,
+			    (char_u *)&p_pmcs, PV_NONE, NULL, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"printmbfont", "pmbfn",  P_STRING|P_VI_DEF,
 #if defined(FEAT_POSTSCRIPT)
-			    (char_u *)&p_pmfn, PV_NONE, parse_printmbfont,
+			    (char_u *)&p_pmfn, PV_NONE, parse_printmbfont, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"printoptions", "popt", P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP,
 #ifdef FEAT_PRINTER
-			    (char_u *)&p_popt, PV_NONE, parse_printoptions,
+			    (char_u *)&p_popt, PV_NONE, parse_printoptions, expand_set_printoptions,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"prompt",	    NULL,   P_BOOL|P_VI_DEF,
-			    (char_u *)&p_prompt, PV_NONE, NULL,
+			    (char_u *)&p_prompt, PV_NONE, NULL, NULL,
 			    {(char_u *)TRUE, (char_u *)0L} SCTX_INIT},
     {"pumheight",   "ph",   P_NUM|P_VI_DEF,
-			    (char_u *)&p_ph, PV_NONE, NULL,
+			    (char_u *)&p_ph, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L} SCTX_INIT},
     {"pumwidth",    "pw",   P_NUM|P_VI_DEF,
-			    (char_u *)&p_pw, PV_NONE, NULL,
+			    (char_u *)&p_pw, PV_NONE, NULL, NULL,
 			    {(char_u *)15L, (char_u *)15L} SCTX_INIT},
     {"pythonthreedll",  NULL,   P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
 #if defined(DYNAMIC_PYTHON3)
-			    (char_u *)&p_py3dll, PV_NONE, NULL,
+			    (char_u *)&p_py3dll, PV_NONE, NULL, NULL,
 			    {(char_u *)DYNAMIC_PYTHON3_DLL, (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"pythonthreehome", NULL,   P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
 #if defined(FEAT_PYTHON3)
-			    (char_u *)&p_py3home, PV_NONE, NULL,
+			    (char_u *)&p_py3home, PV_NONE, NULL, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"pythondll",   NULL,   P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
 #if defined(DYNAMIC_PYTHON)
-			    (char_u *)&p_pydll, PV_NONE, NULL,
+			    (char_u *)&p_pydll, PV_NONE, NULL, NULL,
 			    {(char_u *)DYNAMIC_PYTHON_DLL, (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"pythonhome",  NULL,   P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
 #if defined(FEAT_PYTHON)
-			    (char_u *)&p_pyhome, PV_NONE, NULL,
+			    (char_u *)&p_pyhome, PV_NONE, NULL, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"pyxversion", "pyx",   P_NUM|P_VI_DEF|P_SECURE,
 #if defined(FEAT_PYTHON) || defined(FEAT_PYTHON3)
-			    (char_u *)&p_pyx, PV_NONE, did_set_pyxversion,
+			    (char_u *)&p_pyx, PV_NONE, did_set_pyxversion, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)DEFAULT_PYTHON_VER, (char_u *)0L}
 			    SCTX_INIT},
     {"quickfixtextfunc", "qftf", P_STRING|P_ALLOCED|P_VI_DEF|P_VIM|P_SECURE|P_FUNC,
 #if defined(FEAT_QUICKFIX) && defined(FEAT_EVAL)
 			    (char_u *)&p_qftf, PV_NONE,
-			    did_set_quickfixtextfunc,
+			    did_set_quickfixtextfunc, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)NULL}
 #endif
 			    SCTX_INIT},
     {"quoteescape", "qe",   P_STRING|P_ALLOCED|P_VI_DEF,
-			    (char_u *)&p_qe, PV_QE, NULL,
+			    (char_u *)&p_qe, PV_QE, NULL, NULL,
 			    {(char_u *)"\\", (char_u *)0L} SCTX_INIT},
     {"readonly",    "ro",   P_BOOL|P_VI_DEF|P_RSTAT|P_NOGLOB,
-			    (char_u *)&p_ro, PV_RO, did_set_readonly,
+			    (char_u *)&p_ro, PV_RO, did_set_readonly, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"redraw",	    NULL,   P_BOOL|P_VI_DEF,
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"redrawtime",  "rdt",  P_NUM|P_VI_DEF,
 #ifdef FEAT_RELTIME
-			    (char_u *)&p_rdt, PV_NONE, NULL,
+			    (char_u *)&p_rdt, PV_NONE, NULL, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)2000L, (char_u *)0L} SCTX_INIT},
     {"regexpengine", "re",  P_NUM|P_VI_DEF,
-			    (char_u *)&p_re, PV_NONE, NULL,
+			    (char_u *)&p_re, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L} SCTX_INIT},
     {"relativenumber", "rnu", P_BOOL|P_VI_DEF|P_RWIN,
 			    (char_u *)VAR_WIN, PV_RNU,
-			    did_set_number_relativenumber,
+			    did_set_number_relativenumber, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"remap",	    NULL,   P_BOOL|P_VI_DEF,
-			    (char_u *)&p_remap, PV_NONE, NULL,
+			    (char_u *)&p_remap, PV_NONE, NULL, NULL,
 			    {(char_u *)TRUE, (char_u *)0L} SCTX_INIT},
     {"renderoptions", "rop", P_STRING|P_ONECOMMA|P_RCLR|P_VI_DEF,
 #ifdef FEAT_RENDER_OPTIONS
-			    (char_u *)&p_rop, PV_NONE, did_set_renderoptions,
+			    (char_u *)&p_rop, PV_NONE, did_set_renderoptions, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"report",	    NULL,   P_NUM|P_VI_DEF,
-			    (char_u *)&p_report, PV_NONE, NULL,
+			    (char_u *)&p_report, PV_NONE, NULL, NULL,
 			    {(char_u *)2L, (char_u *)0L} SCTX_INIT},
     {"restorescreen", "rs", P_BOOL|P_VI_DEF,
 #ifdef MSWIN
-			    (char_u *)&p_rs, PV_NONE, NULL,
+			    (char_u *)&p_rs, PV_NONE, NULL, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)TRUE, (char_u *)0L} SCTX_INIT},
     {"revins",	    "ri",   P_BOOL|P_VI_DEF|P_VIM,
 #ifdef FEAT_RIGHTLEFT
-			    (char_u *)&p_ri, PV_NONE, NULL,
+			    (char_u *)&p_ri, PV_NONE, NULL, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"rightleft",   "rl",   P_BOOL|P_VI_DEF|P_RWIN,
 #ifdef FEAT_RIGHTLEFT
-			    (char_u *)VAR_WIN, PV_RL, NULL,
+			    (char_u *)VAR_WIN, PV_RL, NULL, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"rightleftcmd", "rlc", P_STRING|P_ALLOCED|P_VI_DEF|P_RWIN,
 #ifdef FEAT_RIGHTLEFT
-			    (char_u *)VAR_WIN, PV_RLC, did_set_rightleftcmd,
+			    (char_u *)VAR_WIN, PV_RLC, did_set_rightleftcmd, expand_set_rightleftcmd,
 			    {(char_u *)"search", (char_u *)NULL}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"rubydll",     NULL,   P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
 #if defined(DYNAMIC_RUBY)
-			    (char_u *)&p_rubydll, PV_NONE, NULL,
+			    (char_u *)&p_rubydll, PV_NONE, NULL, NULL,
 			    {(char_u *)DYNAMIC_RUBY_DLL, (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"ruler",	    "ru",   P_BOOL|P_VI_DEF|P_VIM|P_RSTAT,
-			    (char_u *)&p_ru, PV_NONE, NULL,
+			    (char_u *)&p_ru, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"rulerformat", "ruf",  P_STRING|P_VI_DEF|P_ALLOCED|P_RSTAT|P_MLE,
 #ifdef FEAT_STL_OPT
-			    (char_u *)&p_ruf, PV_NONE, did_set_rulerformat,
+			    (char_u *)&p_ruf, PV_NONE, did_set_rulerformat, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)"", (char_u *)0L} SCTX_INIT},
     {"runtimepath", "rtp",  P_STRING|P_VI_DEF|P_EXPAND|P_ONECOMMA|P_NODUP
 								    |P_SECURE,
-			    (char_u *)&p_rtp, PV_NONE, NULL,
+			    (char_u *)&p_rtp, PV_NONE, NULL, NULL,
 			    {(char_u *)DFLT_RUNTIMEPATH, (char_u *)0L}
 			    SCTX_INIT},
     {"scroll",	    "scr",  P_NUM|P_NO_MKRC|P_VI_DEF,
-			    (char_u *)VAR_WIN, PV_SCROLL, NULL,
+			    (char_u *)VAR_WIN, PV_SCROLL, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L} SCTX_INIT},
     {"scrollbind",  "scb",  P_BOOL|P_VI_DEF,
-			    (char_u *)VAR_WIN, PV_SCBIND, did_set_scrollbind,
+			    (char_u *)VAR_WIN, PV_SCBIND, did_set_scrollbind, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"scrollfocus", "scf",  P_BOOL|P_VI_DEF,
 #if defined(MSWIN) && defined(FEAT_GUI)
-			    (char_u *)&p_scf, PV_NONE, NULL,
+			    (char_u *)&p_scf, PV_NONE, NULL, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"scrolljump",  "sj",   P_NUM|P_VI_DEF|P_VIM,
-			    (char_u *)&p_sj, PV_NONE, NULL,
+			    (char_u *)&p_sj, PV_NONE, NULL, NULL,
 			    {(char_u *)1L, (char_u *)0L} SCTX_INIT},
     {"scrolloff",   "so",   P_NUM|P_VI_DEF|P_VIM|P_RALL,
-			    (char_u *)&p_so, PV_SO, NULL,
+			    (char_u *)&p_so, PV_SO, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L} SCTX_INIT},
     {"scrollopt",   "sbo",  P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP,
-			    (char_u *)&p_sbo, PV_NONE, did_set_scrollopt,
+			    (char_u *)&p_sbo, PV_NONE, did_set_scrollopt, expand_set_scrollopt,
 			    {(char_u *)"ver,jump", (char_u *)0L}
 			    SCTX_INIT},
     {"sections",    "sect", P_STRING|P_VI_DEF,
-			    (char_u *)&p_sections, PV_NONE, NULL,
+			    (char_u *)&p_sections, PV_NONE, NULL, NULL,
 			    {(char_u *)"SHNHH HUnhsh", (char_u *)0L}
 			    SCTX_INIT},
     {"secure",	    NULL,   P_BOOL|P_VI_DEF|P_SECURE,
-			    (char_u *)&p_secure, PV_NONE, NULL,
+			    (char_u *)&p_secure, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"selection",   "sel",  P_STRING|P_VI_DEF,
-			    (char_u *)&p_sel, PV_NONE, did_set_selection,
+			    (char_u *)&p_sel, PV_NONE, did_set_selection, expand_set_selection,
 			    {(char_u *)"inclusive", (char_u *)0L}
 			    SCTX_INIT},
     {"selectmode",  "slm",  P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP,
-			    (char_u *)&p_slm, PV_NONE, did_set_selectmode,
+			    (char_u *)&p_slm, PV_NONE, did_set_selectmode, expand_set_selectmode,
 			    {(char_u *)"", (char_u *)0L} SCTX_INIT},
     {"sessionoptions", "ssop", P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP,
 #ifdef FEAT_SESSION
 			    (char_u *)&p_ssop, PV_NONE,
-			    did_set_sessionoptions,
+			    did_set_sessionoptions, expand_set_sessionoptions,
 	 {(char_u *)"blank,buffers,curdir,folds,help,options,tabpages,winsize,terminal",
 							       (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"shell",	    "sh",   P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
-			    (char_u *)&p_sh, PV_NONE, NULL,
+			    (char_u *)&p_sh, PV_NONE, NULL, NULL,
 			    {
 #ifdef VMS
 			    (char_u *)"-",
@@ -2192,7 +2197,7 @@ static struct vimoption options[] =
 #endif // VMS
 				(char_u *)0L} SCTX_INIT},
     {"shellcmdflag","shcf", P_STRING|P_VI_DEF|P_SECURE,
-			    (char_u *)&p_shcf, PV_NONE, NULL,
+			    (char_u *)&p_shcf, PV_NONE, NULL, NULL,
 			    {
 #if defined(MSWIN)
 			    (char_u *)"/c",
@@ -2202,7 +2207,7 @@ static struct vimoption options[] =
 				(char_u *)0L} SCTX_INIT},
     {"shellpipe",   "sp",   P_STRING|P_VI_DEF|P_SECURE,
 #ifdef FEAT_QUICKFIX
-			    (char_u *)&p_sp, PV_NONE, NULL,
+			    (char_u *)&p_sp, PV_NONE, NULL, NULL,
 			    {
 #if defined(UNIX)
 			    (char_u *)"| tee",
@@ -2211,35 +2216,35 @@ static struct vimoption options[] =
 #endif
 				(char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"shellquote",  "shq",  P_STRING|P_VI_DEF|P_SECURE,
-			    (char_u *)&p_shq, PV_NONE, NULL,
+			    (char_u *)&p_shq, PV_NONE, NULL, NULL,
 			    {(char_u *)"", (char_u *)0L} SCTX_INIT},
     {"shellredir",  "srr",  P_STRING|P_VI_DEF|P_SECURE,
-			    (char_u *)&p_srr, PV_NONE, NULL,
+			    (char_u *)&p_srr, PV_NONE, NULL, NULL,
 			    {(char_u *)">", (char_u *)0L} SCTX_INIT},
     {"shellslash",  "ssl",   P_BOOL|P_VI_DEF,
 #ifdef BACKSLASH_IN_FILENAME
-			    (char_u *)&p_ssl, PV_NONE, did_set_shellslash,
+			    (char_u *)&p_ssl, PV_NONE, did_set_shellslash, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"shelltemp",   "stmp", P_BOOL,
-			    (char_u *)&p_stmp, PV_NONE, NULL,
+			    (char_u *)&p_stmp, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)TRUE} SCTX_INIT},
     {"shelltype",   "st",   P_NUM|P_VI_DEF,
 #ifdef AMIGA
-			    (char_u *)&p_st, PV_NONE, NULL,
+			    (char_u *)&p_st, PV_NONE, NULL, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)0L, (char_u *)0L} SCTX_INIT},
     {"shellxquote", "sxq",  P_STRING|P_VI_DEF|P_SECURE,
-			    (char_u *)&p_sxq, PV_NONE, NULL,
+			    (char_u *)&p_sxq, PV_NONE, NULL, NULL,
 			    {
 #if defined(UNIX) && defined(USE_SYSTEM)
 			    (char_u *)"\"",
@@ -2248,7 +2253,7 @@ static struct vimoption options[] =
 #endif
 				(char_u *)0L} SCTX_INIT},
     {"shellxescape", "sxe", P_STRING|P_VI_DEF|P_SECURE,
-			    (char_u *)&p_sxe, PV_NONE, NULL,
+			    (char_u *)&p_sxe, PV_NONE, NULL, NULL,
 			    {
 #if defined(MSWIN)
 			    (char_u *)"\"&|<>()@^",
@@ -2257,28 +2262,28 @@ static struct vimoption options[] =
 #endif
 				(char_u *)0L} SCTX_INIT},
     {"shiftround",  "sr",   P_BOOL|P_VI_DEF|P_VIM,
-			    (char_u *)&p_sr, PV_NONE, NULL,
+			    (char_u *)&p_sr, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"shiftwidth",  "sw",   P_NUM|P_VI_DEF,
 			    (char_u *)&p_sw, PV_SW,
-			    did_set_shiftwidth_tabstop,
+			    did_set_shiftwidth_tabstop, NULL,
 			    {(char_u *)8L, (char_u *)0L} SCTX_INIT},
     {"shortmess",   "shm",  P_STRING|P_VIM|P_FLAGLIST,
-			    (char_u *)&p_shm, PV_NONE, did_set_shortmess,
+			    (char_u *)&p_shm, PV_NONE, did_set_shortmess, expand_set_shortmess,
 			    {(char_u *)"S", (char_u *)"filnxtToOS"}
 			    SCTX_INIT},
     {"shortname",   "sn",   P_BOOL|P_VI_DEF,
-			    (char_u *)&p_sn, PV_SN, NULL,
+			    (char_u *)&p_sn, PV_SN, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"showbreak",   "sbr",  P_STRING|P_VI_DEF|P_RALL,
 #ifdef FEAT_LINEBREAK
-			    (char_u *)&p_sbr, PV_SBR, did_set_showbreak,
+			    (char_u *)&p_sbr, PV_SBR, did_set_showbreak, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)"", (char_u *)0L} SCTX_INIT},
     {"showcmd",	    "sc",   P_BOOL|P_VIM,
-			    (char_u *)&p_sc, PV_NONE, NULL,
+			    (char_u *)&p_sc, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE,
 #ifdef UNIX
 				(char_u *)FALSE
@@ -2287,182 +2292,182 @@ static struct vimoption options[] =
 #endif
 				} SCTX_INIT},
     {"showcmdloc",  "sloc", P_STRING|P_RSTAT,
-			    (char_u *)&p_sloc, PV_NONE, did_set_showcmdloc,
+			    (char_u *)&p_sloc, PV_NONE, did_set_showcmdloc, expand_set_showcmdloc,
 			    {(char_u *)"last", (char_u *)"last"} SCTX_INIT},
     {"showfulltag", "sft",  P_BOOL|P_VI_DEF,
-			    (char_u *)&p_sft, PV_NONE, NULL,
+			    (char_u *)&p_sft, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"showmatch",   "sm",   P_BOOL|P_VI_DEF,
-			    (char_u *)&p_sm, PV_NONE, NULL,
+			    (char_u *)&p_sm, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"showmode",    "smd",  P_BOOL|P_VIM,
-			    (char_u *)&p_smd, PV_NONE, NULL,
+			    (char_u *)&p_smd, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)TRUE} SCTX_INIT},
     {"showtabline", "stal", P_NUM|P_VI_DEF|P_RALL,
-			    (char_u *)&p_stal, PV_NONE, did_set_showtabline,
+			    (char_u *)&p_stal, PV_NONE, did_set_showtabline, NULL,
 			    {(char_u *)1L, (char_u *)0L} SCTX_INIT},
     {"sidescroll",  "ss",   P_NUM|P_VI_DEF,
-			    (char_u *)&p_ss, PV_NONE, NULL,
+			    (char_u *)&p_ss, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L} SCTX_INIT},
     {"sidescrolloff", "siso", P_NUM|P_VI_DEF|P_VIM|P_RBUF,
-			    (char_u *)&p_siso, PV_SISO, NULL,
+			    (char_u *)&p_siso, PV_SISO, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L} SCTX_INIT},
     {"signcolumn",   "scl",  P_STRING|P_ALLOCED|P_VI_DEF|P_RCLR,
 #ifdef FEAT_SIGNS
-			    (char_u *)VAR_WIN, PV_SCL, did_set_signcolumn,
+			    (char_u *)VAR_WIN, PV_SCL, did_set_signcolumn, expand_set_signcolumn,
 			    {(char_u *)"auto", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"slowopen",    "slow", P_BOOL|P_VI_DEF,
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"smartcase",   "scs",  P_BOOL|P_VI_DEF|P_VIM,
-			    (char_u *)&p_scs, PV_NONE, NULL,
+			    (char_u *)&p_scs, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"smartindent", "si",   P_BOOL|P_VI_DEF|P_VIM,
-			    (char_u *)&p_si, PV_SI, NULL,
+			    (char_u *)&p_si, PV_SI, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"smarttab",    "sta",  P_BOOL|P_VI_DEF|P_VIM,
-			    (char_u *)&p_sta, PV_NONE, NULL,
+			    (char_u *)&p_sta, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"smoothscroll", "sms", P_BOOL|P_VI_DEF|P_RWIN,
-			    (char_u *)VAR_WIN, PV_SMS, did_set_smoothscroll,
+			    (char_u *)VAR_WIN, PV_SMS, did_set_smoothscroll, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"softtabstop", "sts",  P_NUM|P_VI_DEF|P_VIM,
-			    (char_u *)&p_sts, PV_STS, NULL,
+			    (char_u *)&p_sts, PV_STS, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L} SCTX_INIT},
     {"sourceany",   NULL,   P_BOOL|P_VI_DEF,
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"spell",	    NULL,   P_BOOL|P_VI_DEF|P_RWIN,
 #ifdef FEAT_SPELL
-			    (char_u *)VAR_WIN, PV_SPELL, did_set_spell,
+			    (char_u *)VAR_WIN, PV_SPELL, did_set_spell, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"spellcapcheck", "spc", P_STRING|P_ALLOCED|P_VI_DEF|P_RBUF,
 #ifdef FEAT_SPELL
-			    (char_u *)&p_spc, PV_SPC, did_set_spellcapcheck,
+			    (char_u *)&p_spc, PV_SPC, did_set_spellcapcheck, NULL,
 			    {(char_u *)"[.?!]\\_[\\])'\"	 ]\\+", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"spellfile",   "spf",  P_STRING|P_EXPAND|P_ALLOCED|P_VI_DEF|P_SECURE
 								  |P_ONECOMMA,
 #ifdef FEAT_SPELL
-			    (char_u *)&p_spf, PV_SPF, did_set_spellfile,
+			    (char_u *)&p_spf, PV_SPF, did_set_spellfile, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"spelllang",   "spl",  P_STRING|P_ALLOCED|P_VI_DEF|P_ONECOMMA
 							     |P_RBUF|P_EXPAND,
 #ifdef FEAT_SPELL
-			    (char_u *)&p_spl, PV_SPL, did_set_spelllang,
+			    (char_u *)&p_spl, PV_SPL, did_set_spelllang, NULL,
 			    {(char_u *)"en", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"spelloptions", "spo",  P_STRING|P_ALLOCED|P_VI_DEF
 						    |P_ONECOMMA|P_NODUP|P_RBUF,
 #ifdef FEAT_SPELL
-			    (char_u *)&p_spo, PV_SPO, did_set_spelloptions,
+			    (char_u *)&p_spo, PV_SPO, did_set_spelloptions, expand_set_spelloptions,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"spellsuggest", "sps", P_STRING|P_VI_DEF|P_EXPAND|P_SECURE|P_ONECOMMA,
 #ifdef FEAT_SPELL
-			    (char_u *)&p_sps, PV_NONE, did_set_spellsuggest,
+			    (char_u *)&p_sps, PV_NONE, did_set_spellsuggest, expand_set_spellsuggest,
 			    {(char_u *)"best", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"splitbelow",  "sb",   P_BOOL|P_VI_DEF,
-			    (char_u *)&p_sb, PV_NONE, NULL,
+			    (char_u *)&p_sb, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"splitkeep",   "spk",  P_STRING,
-			    (char_u *)&p_spk, PV_NONE, did_set_splitkeep,
+			    (char_u *)&p_spk, PV_NONE, did_set_splitkeep, expand_set_splitkeep,
 			    {(char_u *)"cursor", (char_u *)"cursor"} SCTX_INIT},
     {"splitright",  "spr",  P_BOOL|P_VI_DEF,
-			    (char_u *)&p_spr, PV_NONE, NULL,
+			    (char_u *)&p_spr, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"startofline", "sol",  P_BOOL|P_VI_DEF|P_VIM,
-			    (char_u *)&p_sol, PV_NONE, NULL,
+			    (char_u *)&p_sol, PV_NONE, NULL, NULL,
 			    {(char_u *)TRUE, (char_u *)0L} SCTX_INIT},
     {"statusline"  ,"stl",  P_STRING|P_VI_DEF|P_ALLOCED|P_RSTAT|P_MLE,
 #ifdef FEAT_STL_OPT
-			    (char_u *)&p_stl, PV_STL, did_set_statusline,
+			    (char_u *)&p_stl, PV_STL, did_set_statusline, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)"", (char_u *)0L} SCTX_INIT},
     {"suffixes",    "su",   P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP,
-			    (char_u *)&p_su, PV_NONE, NULL,
+			    (char_u *)&p_su, PV_NONE, NULL, NULL,
 			    {(char_u *)".bak,~,.o,.h,.info,.swp,.obj",
 				(char_u *)0L} SCTX_INIT},
     {"suffixesadd", "sua",  P_STRING|P_VI_DEF|P_ALLOCED|P_ONECOMMA|P_NODUP,
-			    (char_u *)&p_sua, PV_SUA, NULL,
+			    (char_u *)&p_sua, PV_SUA, NULL, NULL,
 			    {(char_u *)"", (char_u *)0L}
 			    SCTX_INIT},
     {"swapfile",    "swf",  P_BOOL|P_VI_DEF|P_RSTAT,
-			    (char_u *)&p_swf, PV_SWF, did_set_swapfile,
+			    (char_u *)&p_swf, PV_SWF, did_set_swapfile, NULL,
 			    {(char_u *)TRUE, (char_u *)0L} SCTX_INIT},
     {"swapsync",    "sws",  P_STRING|P_VI_DEF,
-			    (char_u *)&p_sws, PV_NONE, did_set_swapsync,
+			    (char_u *)&p_sws, PV_NONE, did_set_swapsync, expand_set_swapsync,
 			    {(char_u *)"fsync", (char_u *)0L} SCTX_INIT},
     {"switchbuf",   "swb",  P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP,
-			    (char_u *)&p_swb, PV_NONE, did_set_switchbuf,
+			    (char_u *)&p_swb, PV_NONE, did_set_switchbuf, expand_set_switchbuf,
 			    {(char_u *)"", (char_u *)0L} SCTX_INIT},
     {"synmaxcol",   "smc",  P_NUM|P_VI_DEF|P_RBUF,
 #ifdef FEAT_SYN_HL
-			    (char_u *)&p_smc, PV_SMC, NULL,
+			    (char_u *)&p_smc, PV_SMC, NULL, NULL,
 			    {(char_u *)3000L, (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"syntax",	    "syn",  P_STRING|P_ALLOCED|P_VI_DEF|P_NOGLOB|P_NFNAME,
 #ifdef FEAT_SYN_HL
 			    (char_u *)&p_syn, PV_SYN,
-			    did_set_filetype_or_syntax,
+			    did_set_filetype_or_syntax, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"tabline",	    "tal",  P_STRING|P_VI_DEF|P_RALL|P_MLE,
 #ifdef FEAT_STL_OPT
-			    (char_u *)&p_tal, PV_NONE, did_set_tabline,
+			    (char_u *)&p_tal, PV_NONE, did_set_tabline, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)"", (char_u *)0L} SCTX_INIT},
     {"tabpagemax",  "tpm",  P_NUM|P_VI_DEF,
-			    (char_u *)&p_tpm, PV_NONE, NULL,
+			    (char_u *)&p_tpm, PV_NONE, NULL, NULL,
 			    {(char_u *)10L, (char_u *)0L} SCTX_INIT},
     {"tabstop",	    "ts",   P_NUM|P_VI_DEF|P_RBUF,
 			    (char_u *)&p_ts, PV_TS,
-			    did_set_shiftwidth_tabstop,
+			    did_set_shiftwidth_tabstop, NULL,
 			    {(char_u *)8L, (char_u *)0L} SCTX_INIT},
     {"tagbsearch",  "tbs",   P_BOOL|P_VI_DEF,
-			    (char_u *)&p_tbs, PV_NONE, NULL,
+			    (char_u *)&p_tbs, PV_NONE, NULL, NULL,
 #ifdef VMS	// binary searching doesn't appear to work on VMS
 			    {(char_u *)0L, (char_u *)0L}
 #else
@@ -2470,25 +2475,25 @@ static struct vimoption options[] =
 #endif
 			    SCTX_INIT},
     {"tagcase",	    "tc",   P_STRING|P_VIM,
-			    (char_u *)&p_tc, PV_TC, did_set_tagcase,
+			    (char_u *)&p_tc, PV_TC, did_set_tagcase, expand_set_tagcase,
 			    {(char_u *)"followic", (char_u *)"followic"} SCTX_INIT},
     {"tagfunc",    "tfu",   P_STRING|P_ALLOCED|P_VI_DEF|P_SECURE|P_FUNC,
 #ifdef FEAT_EVAL
-			    (char_u *)&p_tfu, PV_TFU, did_set_tagfunc,
+			    (char_u *)&p_tfu, PV_TFU, did_set_tagfunc, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"taglength",   "tl",   P_NUM|P_VI_DEF,
-			    (char_u *)&p_tl, PV_NONE, NULL,
+			    (char_u *)&p_tl, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L} SCTX_INIT},
     {"tagrelative", "tr",   P_BOOL|P_VIM,
-			    (char_u *)&p_tr, PV_NONE, NULL,
+			    (char_u *)&p_tr, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)TRUE} SCTX_INIT},
     {"tags",	    "tag",  P_STRING|P_EXPAND|P_VI_DEF|P_ONECOMMA|P_NODUP,
-			    (char_u *)&p_tags, PV_TAGS, NULL,
+			    (char_u *)&p_tags, PV_TAGS, NULL, NULL,
 			    {
 #if defined(FEAT_EMACS_TAGS) && !defined(CASE_INSENSITIVE_FILENAME)
 			    (char_u *)"./tags,./TAGS,tags,TAGS",
@@ -2497,85 +2502,85 @@ static struct vimoption options[] =
 #endif
 				(char_u *)0L} SCTX_INIT},
     {"tagstack",    "tgst", P_BOOL|P_VI_DEF,
-			    (char_u *)&p_tgst, PV_NONE, NULL,
+			    (char_u *)&p_tgst, PV_NONE, NULL, NULL,
 			    {(char_u *)TRUE, (char_u *)0L} SCTX_INIT},
     {"tcldll",      NULL,   P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
 #if defined(DYNAMIC_TCL)
-			    (char_u *)&p_tcldll, PV_NONE, NULL,
+			    (char_u *)&p_tcldll, PV_NONE, NULL, NULL,
 			    {(char_u *)DYNAMIC_TCL_DLL, (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"term",	    NULL,   P_STRING|P_EXPAND|P_NODEFAULT|P_NO_MKRC|P_VI_DEF|P_RALL,
-			    (char_u *)&T_NAME, PV_NONE, did_set_term,
+			    (char_u *)&T_NAME, PV_NONE, did_set_term, NULL,
 			    {(char_u *)"", (char_u *)0L} SCTX_INIT},
     {"termbidi", "tbidi",   P_BOOL|P_VI_DEF,
 #ifdef FEAT_ARABIC
-			    (char_u *)&p_tbidi, PV_NONE, NULL,
+			    (char_u *)&p_tbidi, PV_NONE, NULL, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"termencoding", "tenc", P_STRING|P_VI_DEF|P_RCLR,
-			    (char_u *)&p_tenc, PV_NONE, did_set_encoding,
+			    (char_u *)&p_tenc, PV_NONE, did_set_encoding, expand_set_encoding,
 			    {(char_u *)"", (char_u *)0L}
 			    SCTX_INIT},
     {"termguicolors", "tgc", P_BOOL|P_VI_DEF|P_VIM|P_RCLR,
 #ifdef FEAT_TERMGUICOLORS
-			    (char_u *)&p_tgc, PV_NONE, did_set_termguicolors,
+			    (char_u *)&p_tgc, PV_NONE, did_set_termguicolors, NULL,
 			    {(char_u *)FALSE, (char_u *)FALSE}
 #else
-			    (char_u*)NULL, PV_NONE, NULL,
+			    (char_u*)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)FALSE}
 #endif
 			    SCTX_INIT},
     {"termwinkey", "twk",   P_STRING|P_ALLOCED|P_RWIN|P_VI_DEF,
 #ifdef FEAT_TERMINAL
-			    (char_u *)VAR_WIN, PV_TWK, did_set_termwinkey,
+			    (char_u *)VAR_WIN, PV_TWK, did_set_termwinkey, NULL,
 			    {(char_u *)"", (char_u *)NULL}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"termwinscroll", "twsl", P_NUM|P_VI_DEF|P_VIM|P_RBUF,
 #ifdef FEAT_TERMINAL
-			    (char_u *)&p_twsl, PV_TWSL, NULL,
+			    (char_u *)&p_twsl, PV_TWSL, NULL, NULL,
 			    {(char_u *)10000L, (char_u *)10000L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"termwinsize", "tws",  P_STRING|P_ALLOCED|P_RWIN|P_VI_DEF,
 #ifdef FEAT_TERMINAL
-			    (char_u *)VAR_WIN, PV_TWS, did_set_termwinsize,
+			    (char_u *)VAR_WIN, PV_TWS, did_set_termwinsize, NULL,
 			    {(char_u *)"", (char_u *)NULL}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"termwintype", "twt",  P_STRING|P_ALLOCED|P_VI_DEF,
 #if defined(MSWIN) && defined(FEAT_TERMINAL)
-			    (char_u *)&p_twt, PV_NONE, did_set_termwintype,
+			    (char_u *)&p_twt, PV_NONE, did_set_termwintype, expand_set_termwintype,
 			    {(char_u *)"", (char_u *)NULL}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"terse",	    NULL,   P_BOOL|P_VI_DEF,
-			    (char_u *)&p_terse, PV_NONE, did_set_terse,
+			    (char_u *)&p_terse, PV_NONE, did_set_terse, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"textauto",    "ta",   P_BOOL|P_VIM,
-			    (char_u *)&p_ta, PV_NONE, did_set_textauto,
+			    (char_u *)&p_ta, PV_NONE, did_set_textauto, NULL,
 			    {(char_u *)DFLT_TEXTAUTO, (char_u *)TRUE}
 			    SCTX_INIT},
     {"textmode",    "tx",   P_BOOL|P_VI_DEF|P_NO_MKRC,
-			    (char_u *)&p_tx, PV_TX, did_set_textmode,
+			    (char_u *)&p_tx, PV_TX, did_set_textmode, NULL,
 			    {
 #ifdef USE_CRNL
 			    (char_u *)TRUE,
@@ -2584,108 +2589,108 @@ static struct vimoption options[] =
 #endif
 				(char_u *)0L} SCTX_INIT},
     {"textwidth",   "tw",   P_NUM|P_VI_DEF|P_VIM|P_RBUF,
-			    (char_u *)&p_tw, PV_TW, did_set_textwidth,
+			    (char_u *)&p_tw, PV_TW, did_set_textwidth, NULL,
 			    {(char_u *)0L, (char_u *)0L} SCTX_INIT},
     {"thesaurus",   "tsr",  P_STRING|P_EXPAND|P_VI_DEF|P_ONECOMMA|P_NODUP|P_NDNAME,
-			    (char_u *)&p_tsr, PV_TSR, NULL,
+			    (char_u *)&p_tsr, PV_TSR, NULL, NULL,
 			    {(char_u *)"", (char_u *)0L} SCTX_INIT},
     {"thesaurusfunc", "tsrfu",  P_STRING|P_ALLOCED|P_VI_DEF|P_SECURE|P_FUNC,
 #ifdef FEAT_COMPL_FUNC
 			    (char_u *)&p_tsrfu, PV_TSRFU,
-			    did_set_thesaurusfunc,
+			    did_set_thesaurusfunc, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"tildeop",	    "top",  P_BOOL|P_VI_DEF|P_VIM,
-			    (char_u *)&p_to, PV_NONE, NULL,
+			    (char_u *)&p_to, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"timeout",	    "to",   P_BOOL|P_VI_DEF,
-			    (char_u *)&p_timeout, PV_NONE, NULL,
+			    (char_u *)&p_timeout, PV_NONE, NULL, NULL,
 			    {(char_u *)TRUE, (char_u *)0L} SCTX_INIT},
     {"timeoutlen",  "tm",   P_NUM|P_VI_DEF,
-			    (char_u *)&p_tm, PV_NONE, NULL,
+			    (char_u *)&p_tm, PV_NONE, NULL, NULL,
 			    {(char_u *)1000L, (char_u *)0L} SCTX_INIT},
     {"title",	    NULL,   P_BOOL|P_VI_DEF,
-			    (char_u *)&p_title, PV_NONE, did_set_title_icon,
+			    (char_u *)&p_title, PV_NONE, did_set_title_icon, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"titlelen",    NULL,   P_NUM|P_VI_DEF,
-			    (char_u *)&p_titlelen, PV_NONE, did_set_titlelen,
+			    (char_u *)&p_titlelen, PV_NONE, did_set_titlelen, NULL,
 			    {(char_u *)85L, (char_u *)0L} SCTX_INIT},
     {"titleold",    NULL,   P_STRING|P_VI_DEF|P_GETTEXT|P_SECURE|P_NO_MKRC,
-			    (char_u *)&p_titleold, PV_NONE, NULL,
+			    (char_u *)&p_titleold, PV_NONE, NULL, NULL,
 			    {(char_u *)N_("Thanks for flying Vim"),
 							       (char_u *)0L}
 			    SCTX_INIT},
     {"titlestring", NULL,   P_STRING|P_VI_DEF|P_MLE,
 			    (char_u *)&p_titlestring, PV_NONE,
-			    did_set_titlestring,
+			    did_set_titlestring, NULL,
 			    {(char_u *)"", (char_u *)0L} SCTX_INIT},
     {"toolbar",     "tb",   P_STRING|P_ONECOMMA|P_VI_DEF|P_NODUP,
 #if defined(FEAT_TOOLBAR) && !defined(FEAT_GUI_MSWIN)
-			    (char_u *)&p_toolbar, PV_NONE, did_set_toolbar,
+			    (char_u *)&p_toolbar, PV_NONE, did_set_toolbar, expand_set_toolbar,
 			    {(char_u *)"icons,tooltips", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"toolbariconsize",	"tbis", P_STRING|P_VI_DEF,
 #if defined(FEAT_TOOLBAR) && defined(FEAT_GUI_GTK)
 			    (char_u *)&p_tbis, PV_NONE,
-			    did_set_toolbariconsize,
+			    did_set_toolbariconsize, expand_set_toolbariconsize,
 			    {(char_u *)"small", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"ttimeout",    NULL,   P_BOOL|P_VI_DEF|P_VIM,
-			    (char_u *)&p_ttimeout, PV_NONE, NULL,
+			    (char_u *)&p_ttimeout, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"ttimeoutlen", "ttm",  P_NUM|P_VI_DEF,
-			    (char_u *)&p_ttm, PV_NONE, NULL,
+			    (char_u *)&p_ttm, PV_NONE, NULL, NULL,
 			    {(char_u *)-1L, (char_u *)0L} SCTX_INIT},
     {"ttybuiltin",  "tbi",  P_BOOL|P_VI_DEF,
-			    (char_u *)&p_tbi, PV_NONE, NULL,
+			    (char_u *)&p_tbi, PV_NONE, NULL, NULL,
 			    {(char_u *)TRUE, (char_u *)0L} SCTX_INIT},
     {"ttyfast",	    "tf",   P_BOOL|P_NO_MKRC|P_VI_DEF,
-			    (char_u *)&p_tf, PV_NONE, NULL,
+			    (char_u *)&p_tf, PV_NONE, NULL, NULL,
 			    {(char_u *)TRUE, (char_u *)0L} SCTX_INIT},
     {"ttymouse",    "ttym", P_STRING|P_NODEFAULT|P_NO_MKRC|P_VI_DEF,
 #if defined(UNIX) || defined(VMS)
-			    (char_u *)&p_ttym, PV_NONE, did_set_ttymouse,
+			    (char_u *)&p_ttym, PV_NONE, did_set_ttymouse, expand_set_ttymouse,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)"", (char_u *)0L} SCTX_INIT},
     {"ttyscroll",   "tsl",  P_NUM|P_VI_DEF,
-			    (char_u *)&p_ttyscroll, PV_NONE, NULL,
+			    (char_u *)&p_ttyscroll, PV_NONE, NULL, NULL,
 			    {(char_u *)999L, (char_u *)0L} SCTX_INIT},
     {"ttytype",	    "tty",  P_STRING|P_EXPAND|P_NODEFAULT|P_NO_MKRC|P_VI_DEF|P_RALL,
-			    (char_u *)&T_NAME, PV_NONE, did_set_term,
+			    (char_u *)&T_NAME, PV_NONE, did_set_term, NULL,
 			    {(char_u *)"", (char_u *)0L} SCTX_INIT},
     {"undodir",     "udir", P_STRING|P_EXPAND|P_ONECOMMA|P_NODUP|P_SECURE
 								    |P_VI_DEF,
 #ifdef FEAT_PERSISTENT_UNDO
-			    (char_u *)&p_udir, PV_NONE, NULL,
+			    (char_u *)&p_udir, PV_NONE, NULL, NULL,
 			    {(char_u *)".", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"undofile",    "udf",  P_BOOL|P_VI_DEF|P_VIM,
 #ifdef FEAT_PERSISTENT_UNDO
-			    (char_u *)&p_udf, PV_UDF, did_set_undofile,
+			    (char_u *)&p_udf, PV_UDF, did_set_undofile, NULL,
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 #endif
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"undolevels",  "ul",   P_NUM|P_VI_DEF,
-			    (char_u *)&p_ul, PV_UL, did_set_undolevels,
+			    (char_u *)&p_ul, PV_UL, did_set_undolevels, NULL,
 			    {
 #if defined(UNIX) || defined(MSWIN) || defined(VMS)
 			    (char_u *)1000L,
@@ -2694,61 +2699,61 @@ static struct vimoption options[] =
 #endif
 				(char_u *)0L} SCTX_INIT},
     {"undoreload",  "ur",   P_NUM|P_VI_DEF,
-			    (char_u *)&p_ur, PV_NONE, NULL,
+			    (char_u *)&p_ur, PV_NONE, NULL, NULL,
 			    { (char_u *)10000L, (char_u *)0L} SCTX_INIT},
     {"updatecount", "uc",   P_NUM|P_VI_DEF,
-			    (char_u *)&p_uc, PV_NONE, did_set_updatecount,
+			    (char_u *)&p_uc, PV_NONE, did_set_updatecount, NULL,
 			    {(char_u *)200L, (char_u *)0L} SCTX_INIT},
     {"updatetime",  "ut",   P_NUM|P_VI_DEF,
-			    (char_u *)&p_ut, PV_NONE, NULL,
+			    (char_u *)&p_ut, PV_NONE, NULL, NULL,
 			    {(char_u *)4000L, (char_u *)0L} SCTX_INIT},
     {"varsofttabstop", "vsts",  P_STRING|P_VI_DEF|P_VIM|P_COMMA,
 #ifdef FEAT_VARTABS
 			    (char_u *)&p_vsts, PV_VSTS,
-			    did_set_varsofttabstop,
+			    did_set_varsofttabstop, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)"", (char_u *)NULL}
 #endif
 			    SCTX_INIT},
     {"vartabstop",  "vts",  P_STRING|P_VI_DEF|P_VIM|P_RBUF|P_COMMA,
 #ifdef FEAT_VARTABS
-			    (char_u *)&p_vts, PV_VTS, did_set_vartabstop,
+			    (char_u *)&p_vts, PV_VTS, did_set_vartabstop, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)"", (char_u *)NULL}
 #endif
 			    SCTX_INIT},
     {"verbose",	    "vbs",  P_NUM|P_VI_DEF,
-			    (char_u *)&p_verbose, PV_NONE, NULL,
+			    (char_u *)&p_verbose, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L} SCTX_INIT},
     {"verbosefile", "vfile", P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
-			    (char_u *)&p_vfile, PV_NONE, did_set_verbosefile,
+			    (char_u *)&p_vfile, PV_NONE, did_set_verbosefile, NULL,
 			    {(char_u *)"", (char_u *)0L} SCTX_INIT},
     {"viewdir",     "vdir", P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
 #ifdef FEAT_SESSION
-			    (char_u *)&p_vdir, PV_NONE, NULL,
+			    (char_u *)&p_vdir, PV_NONE, NULL, NULL,
 			    {(char_u *)DFLT_VDIR, (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"viewoptions", "vop",  P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP,
 #ifdef FEAT_SESSION
-			    (char_u *)&p_vop, PV_NONE, did_set_viewoptions,
+			    (char_u *)&p_vop, PV_NONE, did_set_viewoptions, expand_set_sessionoptions,
 			    {(char_u *)"folds,options,cursor,curdir",
 								  (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"viminfo",	    "vi",   P_STRING|P_ONECOMMA|P_NODUP|P_SECURE,
 #ifdef FEAT_VIMINFO
-			    (char_u *)&p_viminfo, PV_NONE, did_set_viminfo,
+			    (char_u *)&p_viminfo, PV_NONE, did_set_viminfo, NULL,
 #if defined(MSWIN)
 			    {(char_u *)"", (char_u *)"'100,<50,s10,h,rA:,rB:"}
 #elif defined(AMIGA)
@@ -2758,104 +2763,104 @@ static struct vimoption options[] =
 			    {(char_u *)"", (char_u *)"'100,<50,s10,h"}
 #endif
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"viminfofile", "vif",  P_STRING|P_EXPAND|P_ONECOMMA|P_NODUP
 							    |P_SECURE|P_VI_DEF,
 #ifdef FEAT_VIMINFO
-			    (char_u *)&p_viminfofile, PV_NONE, NULL,
+			    (char_u *)&p_viminfofile, PV_NONE, NULL, NULL,
 			    {(char_u *)"", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"virtualedit", "ve",   P_STRING|P_ONECOMMA|P_NODUP|P_VI_DEF
 							    |P_VIM|P_CURSWANT,
-			    (char_u *)&p_ve, PV_VE, did_set_virtualedit,
+			    (char_u *)&p_ve, PV_VE, did_set_virtualedit, expand_set_virtualedit,
 			    {(char_u *)"", (char_u *)""}
 			    SCTX_INIT},
     {"visualbell",  "vb",   P_BOOL|P_VI_DEF,
-			    (char_u *)&p_vb, PV_NONE, NULL,
+			    (char_u *)&p_vb, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"w300",	    NULL,   P_NUM|P_VI_DEF,
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L} SCTX_INIT},
     {"w1200",	    NULL,   P_NUM|P_VI_DEF,
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L} SCTX_INIT},
     {"w9600",	    NULL,   P_NUM|P_VI_DEF,
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L} SCTX_INIT},
     {"warn",	    NULL,   P_BOOL|P_VI_DEF,
-			    (char_u *)&p_warn, PV_NONE, NULL,
+			    (char_u *)&p_warn, PV_NONE, NULL, NULL,
 			    {(char_u *)TRUE, (char_u *)0L} SCTX_INIT},
     {"weirdinvert", "wiv",  P_BOOL|P_VI_DEF|P_RCLR,
-			    (char_u *)&p_wiv, PV_NONE, did_set_weirdinvert,
+			    (char_u *)&p_wiv, PV_NONE, did_set_weirdinvert, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"whichwrap",   "ww",   P_STRING|P_VIM|P_ONECOMMA|P_FLAGLIST,
-			    (char_u *)&p_ww, PV_NONE, did_set_whichwrap,
+			    (char_u *)&p_ww, PV_NONE, did_set_whichwrap, expand_set_whichwrap,
 			    {(char_u *)"", (char_u *)"b,s"} SCTX_INIT},
     {"wildchar",    "wc",   P_NUM|P_VIM,
-			    (char_u *)&p_wc, PV_NONE, NULL,
+			    (char_u *)&p_wc, PV_NONE, NULL, NULL,
 			    {(char_u *)(long)Ctrl_E, (char_u *)(long)TAB}
 			    SCTX_INIT},
     {"wildcharm",   "wcm",  P_NUM|P_VI_DEF,
-			    (char_u *)&p_wcm, PV_NONE, NULL,
+			    (char_u *)&p_wcm, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L} SCTX_INIT},
     {"wildignore",  "wig",  P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP,
-			    (char_u *)&p_wig, PV_NONE, NULL,
+			    (char_u *)&p_wig, PV_NONE, NULL, NULL,
 			    {(char_u *)"", (char_u *)0L} SCTX_INIT},
     {"wildignorecase", "wic", P_BOOL|P_VI_DEF,
-			    (char_u *)&p_wic, PV_NONE, NULL,
+			    (char_u *)&p_wic, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"wildmenu",    "wmnu", P_BOOL|P_VI_DEF,
-			    (char_u *)&p_wmnu, PV_NONE, NULL,
+			    (char_u *)&p_wmnu, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
-    {"wildmode",    "wim",  P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP,
-			    (char_u *)&p_wim, PV_NONE, did_set_wildmode,
+    {"wildmode",    "wim",  P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP|P_COLON,
+			    (char_u *)&p_wim, PV_NONE, did_set_wildmode, expand_set_wildmode,
 			    {(char_u *)"full", (char_u *)0L} SCTX_INIT},
     {"wildoptions", "wop",  P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP,
-			    (char_u *)&p_wop, PV_NONE, did_set_wildoptions,
+			    (char_u *)&p_wop, PV_NONE, did_set_wildoptions, expand_set_wildoptions,
 			    {(char_u *)"", (char_u *)0L}
 			    SCTX_INIT},
     {"winaltkeys",  "wak",  P_STRING|P_VI_DEF,
 #ifdef FEAT_WAK
-			    (char_u *)&p_wak, PV_NONE, did_set_winaltkeys,
+			    (char_u *)&p_wak, PV_NONE, did_set_winaltkeys, expand_set_winaltkeys,
 			    {(char_u *)"menu", (char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)NULL, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"wincolor", "wcr",	    P_STRING|P_ALLOCED|P_VI_DEF|P_RWIN,
-			    (char_u *)VAR_WIN, PV_WCR, did_set_wincolor,
+			    (char_u *)VAR_WIN, PV_WCR, did_set_wincolor, expand_set_wincolor,
 			    {(char_u *)"", (char_u *)NULL}
 			    SCTX_INIT},
     {"window",	    "wi",   P_NUM|P_VI_DEF,
-			    (char_u *)&p_window, PV_NONE, did_set_window,
+			    (char_u *)&p_window, PV_NONE, did_set_window, NULL,
 			    {(char_u *)0L, (char_u *)0L} SCTX_INIT},
     {"winheight",   "wh",   P_NUM|P_VI_DEF,
 			    (char_u *)&p_wh, PV_NONE,
-			    did_set_winheight_helpheight,
+			    did_set_winheight_helpheight, NULL,
 			    {(char_u *)1L, (char_u *)0L} SCTX_INIT},
     {"winfixheight", "wfh", P_BOOL|P_VI_DEF|P_RSTAT,
-			    (char_u *)VAR_WIN, PV_WFH, NULL,
+			    (char_u *)VAR_WIN, PV_WFH, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"winfixwidth", "wfw", P_BOOL|P_VI_DEF|P_RSTAT,
-			    (char_u *)VAR_WIN, PV_WFW, NULL,
+			    (char_u *)VAR_WIN, PV_WFW, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"winminheight", "wmh", P_NUM|P_VI_DEF,
-			    (char_u *)&p_wmh, PV_NONE, did_set_winminheight,
+			    (char_u *)&p_wmh, PV_NONE, did_set_winminheight, NULL,
 			    {(char_u *)1L, (char_u *)0L} SCTX_INIT},
     {"winminwidth", "wmw", P_NUM|P_VI_DEF,
-			    (char_u *)&p_wmw, PV_NONE, did_set_winminwidth,
+			    (char_u *)&p_wmw, PV_NONE, did_set_winminwidth, NULL,
 			    {(char_u *)1L, (char_u *)0L} SCTX_INIT},
     {"winptydll", NULL,	    P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
 #if defined(MSWIN) && defined(FEAT_TERMINAL)
-			    (char_u *)&p_winptydll, PV_NONE, NULL, {
+			    (char_u *)&p_winptydll, PV_NONE, NULL, NULL, {
 # ifdef _WIN64
 			    (char_u *)"winpty64.dll",
 # else
@@ -2863,30 +2868,30 @@ static struct vimoption options[] =
 # endif
 				(char_u *)0L}
 #else
-			    (char_u *)NULL, PV_NONE, NULL,
+			    (char_u *)NULL, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L}
 #endif
 			    SCTX_INIT},
     {"winwidth",   "wiw",   P_NUM|P_VI_DEF,
-			    (char_u *)&p_wiw, PV_NONE, did_set_winwidth,
+			    (char_u *)&p_wiw, PV_NONE, did_set_winwidth, NULL,
 			    {(char_u *)20L, (char_u *)0L} SCTX_INIT},
     {"wrap",	    NULL,   P_BOOL|P_VI_DEF|P_RWIN,
-			    (char_u *)VAR_WIN, PV_WRAP, did_set_wrap,
+			    (char_u *)VAR_WIN, PV_WRAP, did_set_wrap, NULL,
 			    {(char_u *)TRUE, (char_u *)0L} SCTX_INIT},
     {"wrapmargin",  "wm",   P_NUM|P_VI_DEF,
-			    (char_u *)&p_wm, PV_WM, NULL,
+			    (char_u *)&p_wm, PV_WM, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L} SCTX_INIT},
     {"wrapscan",    "ws",   P_BOOL|P_VI_DEF,
-			    (char_u *)&p_ws, PV_NONE, NULL,
+			    (char_u *)&p_ws, PV_NONE, NULL, NULL,
 			    {(char_u *)TRUE, (char_u *)0L} SCTX_INIT},
     {"write",	    NULL,   P_BOOL|P_VI_DEF,
-			    (char_u *)&p_write, PV_NONE, NULL,
+			    (char_u *)&p_write, PV_NONE, NULL, NULL,
 			    {(char_u *)TRUE, (char_u *)0L} SCTX_INIT},
     {"writeany",    "wa",   P_BOOL|P_VI_DEF,
-			    (char_u *)&p_wa, PV_NONE, NULL,
+			    (char_u *)&p_wa, PV_NONE, NULL, NULL,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"writebackup", "wb",   P_BOOL|P_VI_DEF|P_VIM,
-			    (char_u *)&p_wb, PV_NONE, NULL,
+			    (char_u *)&p_wb, PV_NONE, NULL, NULL,
 			    {
 #ifdef FEAT_WRITEBACKUP
 			    (char_u *)TRUE,
@@ -2895,16 +2900,16 @@ static struct vimoption options[] =
 #endif
 				(char_u *)0L} SCTX_INIT},
     {"writedelay",  "wd",   P_NUM|P_VI_DEF,
-			    (char_u *)&p_wd, PV_NONE, NULL,
+			    (char_u *)&p_wd, PV_NONE, NULL, NULL,
 			    {(char_u *)0L, (char_u *)0L} SCTX_INIT},
     {"xtermcodes",  NULL,   P_BOOL|P_VI_DEF,
-			    (char_u *)&p_xtermcodes, PV_NONE, NULL,
+			    (char_u *)&p_xtermcodes, PV_NONE, NULL, NULL,
 			    {(char_u *)TRUE, (char_u *)0L} SCTX_INIT},
 
 // terminal output codes
 #define p_term(sss, vvv) \
 			    {sss, NULL, P_STRING|P_VI_DEF|P_RALL|P_SECURE, \
-			    (char_u *)&vvv, PV_NONE, did_set_term_option, \
+			    (char_u *)&vvv, PV_NONE, did_set_term_option, NULL, \
 			    {(char_u *)"", (char_u *)0L} SCTX_INIT},
 
     p_term("t_AB", T_CAB)
@@ -3000,7 +3005,7 @@ static struct vimoption options[] =
 // terminal key codes are not in here
 
     // end marker
-    {NULL, NULL, 0, NULL, PV_NONE, NULL, {NULL, NULL} SCTX_INIT}
+    {NULL, NULL, 0, NULL, PV_NONE, NULL, NULL, {NULL, NULL} SCTX_INIT}
 };
 
 #define OPTION_COUNT ARRAY_LENGTH(options)