option.c
上传用户:gddssl
上传日期:2007-01-06
资源大小:1003k
文件大小:133k
源码类别:

编辑器/阅读器

开发平台:

DOS

  1. /* vi:set ts=8 sts=4 sw=4:
  2.  *
  3.  * VIM - Vi IMproved by Bram Moolenaar
  4.  *
  5.  * Do ":help uganda"  in Vim to read copying and usage conditions.
  6.  * Do ":help credits" in Vim to see a list of people who contributed.
  7.  */
  8. /*
  9.  * Code to handle user-settable options. This is all pretty much table-
  10.  * driven. Checklist for adding a new option:
  11.  * - Put it in the options array below (copy an existing entry).
  12.  * - For a global option: Add a variable for it in option.h.
  13.  * - For a buffer or window local option:
  14.  *   - Add a PV_XX entry to the enum below.
  15.  *   - Add a variable to the window or buffer struct in structs.h.
  16.  *   - For a window option, add some code to win_copy_options().
  17.  *   - For a buffer option, add some code to buf_copy_options().
  18.  *   - For a buffer string option, add code to check_buf_options().
  19.  * - If it's a numeric option, add any necessary bounds checks to do_set().
  20.  * - If it's a list of flags, add some code in do_set(), search for WW_ALL.
  21.  * - When adding an option with expansion (P_EXPAND), but with a different
  22.  *   default for Vi and Vim (no P_VI_DEF), add some code at VIMEXP.
  23.  * - Add documentation!  One line in doc/help.txt, full description in
  24.  *   options.txt, and any other related places.
  25.  */
  26. #include "vim.h"
  27. struct vimoption
  28. {
  29.     char *fullname; /* full option name */
  30.     char *shortname; /* permissible abbreviation */
  31.     short_u flags; /* see below */
  32.     char_u *var; /* pointer to variable */
  33.     char_u *def_val[2]; /* default values for variable (vi and vim) */
  34. };
  35. #define VI_DEFAULT  0     /* def_val[VI_DEFAULT] is Vi default value */
  36. #define VIM_DEFAULT 1     /* def_val[VIM_DEFAULT] is Vim default value */
  37. /*
  38.  * Flags
  39.  *
  40.  * Note: P_EXPAND and P_IND can never be used at the same time.
  41.  * Note: P_IND cannot be used for a terminal option.
  42.  */
  43. #define P_BOOL 0x01 /* the option is boolean */
  44. #define P_NUM 0x02 /* the option is numeric */
  45. #define P_STRING 0x04 /* the option is a string */
  46. #define P_ALLOCED 0x08 /* the string option is in allocated memory,
  47.     must use vim_free() when assigning new
  48.     value. Not set if default is the same. */
  49. #define P_EXPAND 0x10 /* environment expansion */
  50. #define P_IND 0x20 /* indirect, is in curwin or curbuf */
  51. #define P_NODEFAULT 0x40 /* has no default value */
  52. #define P_DEF_ALLOCED 0x80 /* default value is in allocated memory, must
  53.     use vim_free() when assigning new value */
  54. #define P_WAS_SET 0x100 /* option has been set/reset */
  55. #define P_NO_MKRC 0x200 /* don't include in :mkvimrc output */
  56. #define P_VI_DEF 0x400 /* Use Vi default for Vim */
  57. #define P_VIM 0x800 /* Vim option, reset when 'cp' set */
  58. #define P_RSTAT 0x1000 /* when changed, redraw status lines */
  59. #define P_RBUF 0x2000 /* when changed, redraw current buffer */
  60. #define P_RALL 0x4000 /* when changed, redraw all */
  61. #define P_COMMA 0x8000 /* comma separated list */
  62. /*
  63.  * The options that are in curwin or curbuf have P_IND set and a var field
  64.  * that contains one of the enum values below.
  65.  */
  66. enum indirect_options
  67. {
  68.     PV_AI = 1,
  69.     PV_BIN,
  70.     PV_CIN,
  71.     PV_CINK,
  72.     PV_CINO,
  73.     PV_CINW,
  74.     PV_COM,
  75.     PV_CPT,
  76.     PV_EOL,
  77.     PV_ET,
  78.     PV_FE,
  79.     PV_FF,
  80.     PV_FO,
  81.     PV_FT,
  82.     PV_INF,
  83.     PV_ISK,
  84.     PV_LBR,
  85.     PV_LISP,
  86.     PV_LIST,
  87.     PV_ML,
  88.     PV_MPS,
  89.     PV_MOD,
  90.     PV_NF,
  91.     PV_NU,
  92.     PV_RL,
  93.     PV_RO,
  94.     PV_SCROLL,
  95.     PV_SI,
  96.     PV_SN,
  97.     PV_STS,
  98.     PV_SWF,
  99.     PV_SYN,
  100.     PV_SW,
  101.     PV_TS,
  102.     PV_TW,
  103.     PV_TX,
  104.     PV_WM,
  105.     PV_WRAP
  106. };
  107. /*
  108.  * options[] is initialized here.
  109.  * The order of the options MUST be alphabetic for ":set all" and findoption().
  110.  * All option names MUST start with a lowercase letter (for findoption()).
  111.  * Exception: "t_" options are at the end.
  112.  * The options with a NULL variable are 'hidden': a set command for them is
  113.  * ignored and they are not printed.
  114.  */
  115. static struct vimoption options[] =
  116. {
  117.     {"aleph",     "al",   P_NUM|P_VI_DEF,
  118. #ifdef RIGHTLEFT
  119.     (char_u *)&p_aleph,
  120. #else
  121.     (char_u *)NULL,
  122. #endif
  123.     {
  124. #if (defined(MSDOS) || defined(WIN32) || defined(OS2)) && !defined(USE_GUI_WIN32)
  125.     (char_u *)128L,
  126. #else
  127.     (char_u *)224L,
  128. #endif
  129.     (char_u *)0L}},
  130.     {"allowrevins", "ari",  P_BOOL|P_VI_DEF|P_VIM,
  131. #ifdef RIGHTLEFT
  132.     (char_u *)&p_ari,
  133. #else
  134.     (char_u *)NULL,
  135. #endif
  136.     {(char_u *)FALSE, (char_u *)0L}},
  137.     {"altkeymap",   "akm",  P_BOOL|P_VI_DEF,
  138. #ifdef FKMAP
  139.     (char_u *)&p_altkeymap,
  140. #else
  141.     (char_u *)NULL,
  142. #endif
  143.     {(char_u *)FALSE, (char_u *)0L}},
  144.     {"autoindent",  "ai",   P_BOOL|P_IND|P_VI_DEF,
  145.     (char_u *)PV_AI,
  146.     {(char_u *)FALSE, (char_u *)0L}},
  147.     {"autoprint",   "ap",   P_BOOL|P_VI_DEF,
  148.     (char_u *)NULL,
  149.     {(char_u *)FALSE, (char_u *)0L}},
  150.     {"autowrite",   "aw",   P_BOOL|P_VI_DEF,
  151.     (char_u *)&p_aw,
  152.     {(char_u *)FALSE, (char_u *)0L}},
  153.     {"background",  "bg",   P_STRING|P_VI_DEF|P_RALL,
  154.     (char_u *)&p_bg,
  155.     {
  156. #if (defined(MSDOS) || defined(OS2) || defined(WIN32)) && !defined(USE_GUI)
  157.     (char_u *)"dark",
  158. #else
  159.     (char_u *)"light",
  160. #endif
  161.     (char_u *)0L}},
  162.     {"backspace",   "bs",   P_NUM|P_VI_DEF|P_VIM,
  163.     (char_u *)&p_bs,
  164.     {(char_u *)0L, (char_u *)0L}},
  165.     {"backup",     "bk",   P_BOOL|P_VI_DEF|P_VIM,
  166.     (char_u *)&p_bk,
  167.     {(char_u *)FALSE, (char_u *)0L}},
  168.     {"backupdir",   "bdir", P_STRING|P_EXPAND|P_VI_DEF|P_COMMA,
  169.     (char_u *)&p_bdir,
  170.     {(char_u *)DEF_BDIR, (char_u *)0L}},
  171.     {"backupext",   "bex",  P_STRING|P_VI_DEF,
  172.     (char_u *)&p_bex,
  173.     {
  174. #ifdef VMS
  175.     (char_u *)"_",
  176. #else
  177.     (char_u *)"~",
  178. #endif
  179.     (char_u *)0L}},
  180.     {"beautify",    "bf",   P_BOOL|P_VI_DEF,
  181.     (char_u *)NULL,
  182.     {(char_u *)FALSE, (char_u *)0L}},
  183.     {"binary",     "bin",  P_BOOL|P_IND|P_VI_DEF|P_RSTAT,
  184.     (char_u *)PV_BIN,
  185.     {(char_u *)FALSE, (char_u *)0L}},
  186.     {"bioskey",     "biosk",P_BOOL|P_VI_DEF,
  187. #ifdef MSDOS
  188.     (char_u *)&p_biosk,
  189. #else
  190.     (char_u *)NULL,
  191. #endif
  192.     {(char_u *)TRUE, (char_u *)0L}},
  193.     {"breakat",     "brk",  P_STRING|P_VI_DEF|P_RALL,
  194.     (char_u *)&p_breakat,
  195.     {(char_u *)" t!@*-+_;:,./?", (char_u *)0L}},
  196.     {"browsedir",   "bsdir",P_STRING|P_VI_DEF,
  197. #ifdef USE_BROWSE
  198.     (char_u *)&p_bsdir,
  199. #else
  200.     (char_u *)NULL,
  201. #endif
  202.     {(char_u *)"last", (char_u *)0L}},
  203.     {"cindent",     "cin",  P_BOOL|P_IND|P_VI_DEF|P_VIM,
  204. #ifdef CINDENT
  205.     (char_u *)PV_CIN,
  206. #else
  207.     (char_u *)NULL,
  208. #endif
  209.     {(char_u *)FALSE, (char_u *)0L}},
  210.     {"cinkeys",     "cink", P_STRING|P_IND|P_ALLOCED|P_VI_DEF|P_COMMA,
  211. #ifdef CINDENT
  212.     (char_u *)PV_CINK,
  213.     {(char_u *)"0{,0},:,0#,!^F,o,O,e", (char_u *)0L}
  214. #else
  215.     (char_u *)NULL,
  216.     {(char_u *)0L, (char_u *)0L}
  217. #endif
  218.     },
  219.     {"cinoptions",  "cino", P_STRING|P_IND|P_ALLOCED|P_VI_DEF|P_COMMA,
  220. #ifdef CINDENT
  221.     (char_u *)PV_CINO,
  222. #else
  223.     (char_u *)NULL,
  224. #endif
  225.     {(char_u *)"", (char_u *)0L}},
  226.     {"cinwords",    "cinw", P_STRING|P_IND|P_ALLOCED|P_VI_DEF|P_COMMA,
  227. #if defined(SMARTINDENT) || defined(CINDENT)
  228.     (char_u *)PV_CINW,
  229.     {(char_u *)"if,else,while,do,for,switch",
  230. (char_u *)0L}
  231. #else
  232.     (char_u *)NULL,
  233.     {(char_u *)0L, (char_u *)0L}
  234. #endif
  235.     },
  236.     {"cmdheight",   "ch",   P_NUM|P_VI_DEF|P_RALL,
  237.     (char_u *)&p_ch,
  238.     {(char_u *)1L, (char_u *)0L}},
  239.     {"columns",     "co",   P_NUM|P_NODEFAULT|P_NO_MKRC|P_VI_DEF|P_RALL,
  240.     (char_u *)&Columns,
  241.     {(char_u *)80L, (char_u *)0L}},
  242.     {"comments",    "com",  P_STRING|P_IND|P_ALLOCED|P_VI_DEF|P_COMMA,
  243.     (char_u *)PV_COM,
  244.     {(char_u *)"sr:/*,mb:*,el:*/,://,b:#,:%,:XCOMM,n:>,fb:-",
  245. (char_u *)0L}},
  246.     {"compatible",  "cp",   P_BOOL|P_RALL,
  247.     (char_u *)&p_cp,
  248.     {(char_u *)TRUE, (char_u *)FALSE}},
  249.     {"complete",    "cpt",  P_STRING|P_IND|P_ALLOCED|P_VI_DEF|P_COMMA,
  250. #ifdef INSERT_EXPAND
  251.     (char_u *)PV_CPT,
  252.     {(char_u *)".,b", (char_u *)0L}
  253. #else
  254.     (char_u *)NULL,
  255.     {(char_u *)0L, (char_u *)0L}
  256. #endif
  257.     },
  258.     {"confirm",     "cf",   P_BOOL|P_VI_DEF,
  259. #if defined(GUI_DIALOG) || defined(CON_DIALOG)
  260.     (char_u *)&p_confirm,
  261. #else
  262.     (char_u *)NULL,
  263. #endif
  264.     {(char_u *)FALSE, (char_u *)0L}},
  265.     {"cpoptions",   "cpo",  P_STRING|P_VIM|P_RALL,
  266.     (char_u *)&p_cpo,
  267.     {(char_u *)CPO_ALL, (char_u *)CPO_DEFAULT}},
  268.     {"cscopeprg",   "csprg", P_STRING|P_EXPAND|P_VI_DEF,
  269. #ifdef USE_CSCOPE
  270.     (char_u *)&p_csprg,
  271.     {(char_u *)"cscope", (char_u *)0L}
  272. #else
  273.     (char_u *)NULL,
  274.     {(char_u *)0L, (char_u *)0L}
  275. #endif
  276.     },
  277.     {"cscopetag",   "cst",  P_BOOL|P_VI_DEF|P_VIM,
  278. #ifdef USE_CSCOPE
  279.     (char_u *)&p_cst,
  280. #else
  281.     (char_u *)NULL,
  282. #endif
  283.     {(char_u *)0L, (char_u *)0L}},
  284.     {"cscopetagorder", "csto", P_NUM|P_VI_DEF|P_VIM,
  285. #ifdef USE_CSCOPE
  286.     (char_u *)&p_csto,
  287. #else
  288.     (char_u *)NULL,
  289. #endif
  290.     {(char_u *)0L, (char_u *)0L}},
  291.     {"cscopeverbose", "csverb", P_BOOL|P_VI_DEF|P_VIM,
  292. #ifdef USE_CSCOPE
  293.     (char_u *)&p_csverbose,
  294. #else
  295.     (char_u *)NULL,
  296. #endif
  297.     {(char_u *)0L, (char_u *)0L}},
  298.     {"define",     "def",  P_STRING|P_VI_DEF,
  299.     (char_u *)&p_def,
  300.     {(char_u *)"^#\s*define", (char_u *)0L}},
  301.     {"dictionary",  "dict", P_STRING|P_EXPAND|P_VI_DEF|P_COMMA,
  302.     (char_u *)&p_dict,
  303.     {(char_u *)"", (char_u *)0L}},
  304.     {"digraph",     "dg",   P_BOOL|P_VI_DEF|P_VIM,
  305. #ifdef DIGRAPHS
  306.     (char_u *)&p_dg,
  307. #else
  308.     (char_u *)NULL,
  309. #endif
  310.     {(char_u *)FALSE, (char_u *)0L}},
  311.     {"directory",   "dir",  P_STRING|P_EXPAND|P_VI_DEF|P_COMMA,
  312.     (char_u *)&p_dir,
  313.     {(char_u *)DEF_DIR, (char_u *)0L}},
  314.     {"edcompatible","ed",   P_BOOL|P_VI_DEF,
  315.     (char_u *)&p_ed,
  316.     {(char_u *)FALSE, (char_u *)0L}},
  317.     {"endofline",   "eol",  P_BOOL|P_IND|P_NO_MKRC|P_VI_DEF|P_RSTAT,
  318.     (char_u *)PV_EOL,
  319.     {(char_u *)TRUE, (char_u *)0L}},
  320.     {"equalalways", "ea",   P_BOOL|P_VI_DEF|P_RALL,
  321.     (char_u *)&p_ea,
  322.     {(char_u *)TRUE, (char_u *)0L}},
  323.     {"equalprg",    "ep",   P_STRING|P_EXPAND|P_VI_DEF,
  324.     (char_u *)&p_ep,
  325.     {(char_u *)"", (char_u *)0L}},
  326.     {"errorbells",  "eb",   P_BOOL|P_VI_DEF,
  327.     (char_u *)&p_eb,
  328.     {(char_u *)FALSE, (char_u *)0L}},
  329.     {"errorfile",   "ef",   P_STRING|P_EXPAND|P_VI_DEF,
  330. #ifdef QUICKFIX
  331.     (char_u *)&p_ef,
  332.     {(char_u *)ERRORFILE, (char_u *)0L}
  333. #else
  334.     (char_u *)NULL,
  335.     {(char_u *)NULL, (char_u *)0L}
  336. #endif
  337.     },
  338.     {"errorformat", "efm",  P_STRING|P_VI_DEF|P_COMMA,
  339. #ifdef QUICKFIX
  340.     (char_u *)&p_efm,
  341.     {(char_u *)EFM_DFLT, (char_u *)0L},
  342. #else
  343.     (char_u *)NULL,
  344.     {(char_u *)NULL, (char_u *)0L}
  345. #endif
  346.     },
  347.     {"esckeys",     "ek",   P_BOOL|P_VIM,
  348.     (char_u *)&p_ek,
  349.     {(char_u *)FALSE, (char_u *)TRUE}},
  350.     {"eventignore", "ei",   P_STRING|P_VI_DEF|P_COMMA,
  351. #ifdef AUTOCMD
  352.     (char_u *)&p_ei,
  353. #else
  354.     (char_u *)NULL,
  355. #endif
  356.     {(char_u *)"", (char_u *)0L}},
  357.     {"expandtab",   "et",   P_BOOL|P_IND|P_VI_DEF|P_VIM,
  358.     (char_u *)PV_ET,
  359.     {(char_u *)FALSE, (char_u *)0L}},
  360.     {"exrc",     "ex",   P_BOOL|P_VI_DEF,
  361.     (char_u *)&p_exrc,
  362.     {(char_u *)FALSE, (char_u *)0L}},
  363.     {"fileencoding", "fe",   P_STRING|P_IND|P_ALLOCED|P_VI_DEF|P_RSTAT,
  364. #ifdef MULTI_BYTE
  365.     (char_u *)PV_FE,
  366.     {(char_u *)FE_DFLT, (char_u *)0L}
  367. #else
  368.     (char_u *)NULL,
  369.     {(char_u *)0L, (char_u *)0L}
  370. #endif
  371.     },
  372.     {"fileformat",  "ff",   P_STRING|P_IND|P_ALLOCED|P_VI_DEF|P_RSTAT,
  373.     (char_u *)PV_FF,
  374.     {(char_u *)FF_DFLT, (char_u *)0L}},
  375.     {"fileformats", "ffs",  P_STRING|P_VIM|P_COMMA,
  376.     (char_u *)&p_ffs,
  377.     {(char_u *)FFS_VI, (char_u *)FFS_DFLT}},
  378.     {"filetype", "ft",     P_STRING|P_IND|P_ALLOCED|P_VI_DEF,
  379. #ifdef WANT_FILETYPE
  380.     (char_u *)PV_FT,
  381.     {(char_u *)FT_DFLT, (char_u *)0L}
  382. #else
  383.     (char_u *)NULL,
  384.     {(char_u *)0L, (char_u *)0L}
  385. #endif
  386.     },
  387.     {"fkmap",     "fk",   P_BOOL|P_VI_DEF,
  388. #ifdef FKMAP
  389.     (char_u *)&p_fkmap,
  390. #else
  391.     (char_u *)NULL,
  392. #endif
  393.     {(char_u *)FALSE, (char_u *)0L}},
  394.     {"flash",     "fl",   P_BOOL|P_VI_DEF,
  395.     (char_u *)NULL,
  396.     {(char_u *)FALSE, (char_u *)0L}},
  397.     {"formatoptions","fo",  P_STRING|P_IND|P_ALLOCED|P_VIM,
  398.     (char_u *)PV_FO,
  399.     {(char_u *)FO_DFLT_VI, (char_u *)FO_DFLT}},
  400.     {"formatprg",   "fp",   P_STRING|P_EXPAND|P_VI_DEF,
  401.     (char_u *)&p_fp,
  402.     {(char_u *)"", (char_u *)0L}},
  403.     {"gdefault",    "gd",   P_BOOL|P_VI_DEF|P_VIM,
  404.     (char_u *)&p_gd,
  405.     {(char_u *)FALSE, (char_u *)0L}},
  406.     {"graphic",     "gr",   P_BOOL|P_VI_DEF,
  407.     (char_u *)NULL,
  408.     {(char_u *)FALSE, (char_u *)0L}},
  409.     {"grepformat",  "gfm",  P_STRING|P_VI_DEF|P_COMMA,
  410. #ifdef QUICKFIX
  411.     (char_u *)&p_gefm,
  412.     {(char_u *)GEFM_DFLT, (char_u *)0L},
  413. #else
  414.     (char_u *)NULL,
  415.     {(char_u *)NULL, (char_u *)0L}
  416. #endif
  417.     },
  418.     {"grepprg",     "gp",   P_STRING|P_EXPAND|P_VI_DEF,
  419. #ifdef QUICKFIX
  420.     (char_u *)&p_gp,
  421.     {
  422. # ifdef WIN32
  423.     (char_u *)"findstr /n",
  424. # else
  425.     (char_u *)"grep -n",
  426. # endif
  427.     (char_u *)0L},
  428. #else
  429.     (char_u *)NULL,
  430.     {(char_u *)NULL, (char_u *)0L}
  431. #endif
  432.     },
  433.     {"guicursor",    "gcr",  P_STRING|P_VI_DEF|P_COMMA,
  434. #ifdef CURSOR_SHAPE
  435.     (char_u *)&p_guicursor,
  436.     {
  437. # ifdef USE_GUI
  438. (char_u *)"n-v-c:block-Cursor,ve:ver35-Cursor,o:hor50-Cursor,i-ci:ver25-Cursor,r-cr:hor20-Cursor,sm:block-Cursor-blinkwait175-blinkoff150-blinkon175",
  439. # else /* MSDOS or Win32 console */
  440. (char_u *)"n-v-c:block,o:hor50,i-ci:hor10,r-cr:hor30,sm:block",
  441. # endif
  442.     (char_u *)0L}
  443. #else
  444.     (char_u *)NULL,
  445.     {(char_u *)NULL, (char_u *)0L}
  446. #endif
  447.     },
  448.     {"guifont",     "gfn",  P_STRING|P_VI_DEF|P_RALL|P_COMMA,
  449. #ifdef USE_GUI
  450.     (char_u *)&p_guifont,
  451.     {(char_u *)"", (char_u *)0L}
  452. #else
  453.     (char_u *)NULL,
  454.     {(char_u *)NULL, (char_u *)0L}
  455. #endif
  456.     },
  457.     {"guioptions",  "go",   P_STRING|P_VI_DEF|P_RALL,
  458. #if defined(USE_GUI) || defined(USE_CLIPBOARD)
  459.     (char_u *)&p_guioptions,
  460. # ifdef UNIX
  461.     {(char_u *)"agimrt", (char_u *)0L}
  462. # else
  463.     {(char_u *)"gmrt", (char_u *)0L}
  464. # endif
  465. #else
  466.     (char_u *)NULL,
  467.     {(char_u *)NULL, (char_u *)0L}
  468. #endif
  469.     },
  470.     {"guipty",     NULL,   P_BOOL|P_VI_DEF,
  471. #if defined(USE_GUI)
  472.     (char_u *)&p_guipty,
  473. #else
  474.     (char_u *)NULL,
  475. #endif
  476.     {(char_u *)TRUE, (char_u *)0L}},
  477.     {"hardtabs",    "ht",   P_NUM|P_VI_DEF,
  478.     (char_u *)NULL,
  479.     {(char_u *)0L, (char_u *)0L}},
  480.     {"helpfile",    "hf",   P_STRING|P_EXPAND|P_VI_DEF,
  481.     (char_u *)&p_hf,
  482.     {(char_u *)VIM_HLP, (char_u *)0L}},
  483.     {"helpheight",  "hh",   P_NUM|P_VI_DEF,
  484.     (char_u *)&p_hh,
  485.     {(char_u *)20L, (char_u *)0L}},
  486.     {"hidden",     "hid",  P_BOOL|P_VI_DEF,
  487.     (char_u *)&p_hid,
  488.     {(char_u *)FALSE, (char_u *)0L}},
  489.     {"highlight",   "hl",   P_STRING|P_VI_DEF|P_RALL|P_COMMA,
  490.     (char_u *)&p_hl,
  491.     {(char_u *)"8:SpecialKey,@:NonText,d:Directory,e:ErrorMsg,i:IncSearch,l:Search,m:MoreMsg,M:ModeMsg,n:LineNr,r:Question,s:StatusLine,S:StatusLineNC,t:Title,v:Visual,w:WarningMsg",
  492. (char_u *)0L}},
  493.     {"hlsearch",    "hls",  P_BOOL|P_VI_DEF|P_VIM|P_RALL,
  494.     (char_u *)&p_hls,
  495.     {(char_u *)FALSE, (char_u *)0L}},
  496.     {"history",     "hi",   P_NUM|P_VIM,
  497.     (char_u *)&p_hi,
  498.     {(char_u *)0L, (char_u *)20L}},
  499.     {"hkmap",     "hk",   P_BOOL|P_VI_DEF|P_VIM,
  500. #ifdef RIGHTLEFT
  501.     (char_u *)&p_hkmap,
  502. #else
  503.     (char_u *)NULL,
  504. #endif
  505.     {(char_u *)FALSE, (char_u *)0L}},
  506.     {"hkmapp",     "hkp",  P_BOOL|P_VI_DEF|P_VIM,
  507. #ifdef RIGHTLEFT
  508.     (char_u *)&p_hkmapp,
  509. #else
  510.     (char_u *)NULL,
  511. #endif
  512.     {(char_u *)FALSE, (char_u *)0L}},
  513.     {"icon",     NULL,   P_BOOL|P_VI_DEF,
  514.     (char_u *)&p_icon,
  515.     {(char_u *)FALSE, (char_u *)0L}},
  516.     {"iconstring",  NULL,   P_STRING|P_VI_DEF,
  517.     (char_u *)&p_iconstring,
  518.     {(char_u *)"", (char_u *)0L}},
  519.     {"ignorecase",  "ic",   P_BOOL|P_VI_DEF,
  520.     (char_u *)&p_ic,
  521.     {(char_u *)FALSE, (char_u *)0L}},
  522.     {"include",     "inc",  P_STRING|P_VI_DEF,
  523.     (char_u *)&p_inc,
  524.     {(char_u *)"^#\s*include", (char_u *)0L}},
  525.     {"incsearch",   "is",   P_BOOL|P_VI_DEF|P_VIM,
  526.     (char_u *)&p_is,
  527.     {(char_u *)FALSE, (char_u *)0L}},
  528.     {"infercase",   "inf",  P_BOOL|P_IND|P_VI_DEF,
  529.     (char_u *)PV_INF,
  530.     {(char_u *)FALSE, (char_u *)0L}},
  531.     {"insertmode",  "im",   P_BOOL|P_VI_DEF|P_VIM,
  532.     (char_u *)&p_im,
  533.     {(char_u *)FALSE, (char_u *)0L}},
  534.     {"isfname",     "isf",  P_STRING|P_VI_DEF|P_COMMA,
  535.     (char_u *)&p_isf,
  536.     {
  537. #ifdef BACKSLASH_IN_FILENAME
  538.     (char_u *)"@,48-57,/,.,-,_,+,,,$,:,\",
  539. #else
  540. # ifdef AMIGA
  541.     (char_u *)"@,48-57,/,.,-,_,+,,,$,:",
  542. # else /* UNIX */
  543.     (char_u *)"@,48-57,/,.,-,_,+,,,$,~",
  544. # endif
  545. #endif
  546. (char_u *)0L}},
  547.     {"isident",     "isi",  P_STRING|P_VI_DEF|P_COMMA,
  548.     (char_u *)&p_isi,
  549.     {
  550. #if defined(MSDOS) || defined(WIN32) || defined(OS2)
  551.     (char_u *)"@,48-57,_,128-167,224-235",
  552. #else
  553.     (char_u *)"@,48-57,_,192-255",
  554. #endif
  555. (char_u *)0L}},
  556.     {"iskeyword",   "isk",  P_STRING|P_IND|P_ALLOCED|P_VIM|P_COMMA,
  557.     (char_u *)PV_ISK,
  558.     {(char_u *)"@,48-57,_",
  559. # if defined(MSDOS) || defined(WIN32) || defined(OS2)
  560. (char_u *)"@,48-57,_,128-167,224-235"
  561. # else
  562. (char_u *)"@,48-57,_,192-255"
  563. # endif
  564. }},
  565.     {"isprint",     "isp",  P_STRING|P_VI_DEF|P_RALL|P_COMMA,
  566.     (char_u *)&p_isp,
  567.     {
  568. #if defined(MSDOS) || defined(WIN32) || defined(OS2)
  569.     (char_u *)"@,~-255",
  570. #else
  571.     (char_u *)"@,161-255",
  572. #endif
  573. (char_u *)0L}},
  574.     {"joinspaces",  "js",   P_BOOL|P_VI_DEF|P_VIM,
  575.     (char_u *)&p_js,
  576.     {(char_u *)TRUE, (char_u *)0L}},
  577.     {"keywordprg",  "kp",   P_STRING|P_EXPAND|P_VI_DEF,
  578.     (char_u *)&p_kp,
  579.     {
  580. #if defined(MSDOS) || defined(WIN32)
  581.     (char_u *)"",
  582. #else
  583. #ifdef VMS
  584.     (char_u *)"help",
  585. #else
  586. # if defined(OS2)
  587.     (char_u *)"view /",
  588. # else
  589. #  ifdef USEMAN_S
  590.     (char_u *)"man -s",
  591. #  else
  592.     (char_u *)"man",
  593. #  endif
  594. # endif
  595. #endif
  596. #endif
  597. (char_u *)0L}},
  598.     {"keymodel",    "km",   P_STRING|P_VI_DEF|P_COMMA,
  599.     (char_u *)&p_km,
  600.     {(char_u *)"", (char_u *)0L}},
  601.     {"langmap",     "lmap", P_STRING|P_VI_DEF|P_COMMA,
  602. #ifdef HAVE_LANGMAP
  603.     (char_u *)&p_langmap,
  604.     {(char_u *)"", /* unmatched } */
  605. #else
  606.     (char_u *)NULL,
  607.     {(char_u *)NULL,
  608. #endif
  609. (char_u *)0L}},
  610.     {"laststatus",  "ls",   P_NUM|P_VI_DEF|P_RALL,
  611.     (char_u *)&p_ls,
  612.     {(char_u *)1L, (char_u *)0L}},
  613.     {"lazyredraw",  "lz",   P_BOOL|P_VI_DEF,
  614.     (char_u *)&p_lz,
  615.     {(char_u *)FALSE, (char_u *)0L}},
  616.     {"linebreak",   "lbr",  P_BOOL|P_IND|P_VI_DEF|P_RBUF,
  617.     (char_u *)PV_LBR,
  618.     {(char_u *)FALSE, (char_u *)0L}},
  619.     {"lines",     NULL,   P_NUM|P_NODEFAULT|P_NO_MKRC|P_VI_DEF|P_RALL,
  620.     (char_u *)&Rows,
  621.     {
  622. #if defined(MSDOS) || defined(WIN32) || defined(OS2)
  623.     (char_u *)25L,
  624. #else
  625.     (char_u *)24L,
  626. #endif
  627.     (char_u *)0L}},
  628.     {"lisp",     NULL,   P_BOOL|P_IND|P_VI_DEF,
  629.     (char_u *)PV_LISP,
  630.     {(char_u *)FALSE, (char_u *)0L}},
  631.     {"list",     NULL,   P_BOOL|P_IND|P_VI_DEF|P_RBUF,
  632.     (char_u *)PV_LIST,
  633.     {(char_u *)FALSE, (char_u *)0L}},
  634.     {"listchars","lcs",     P_STRING|P_VI_DEF|P_RALL|P_COMMA,
  635.     (char_u *)&p_lcs,
  636.     {(char_u *)"eol:$", (char_u *)0L}},
  637.     {"magic",     NULL,   P_BOOL|P_VI_DEF,
  638.     (char_u *)&p_magic,
  639.     {(char_u *)TRUE, (char_u *)0L}},
  640.     {"makeef",     "mef",   P_STRING|P_EXPAND|P_VI_DEF,
  641. #ifdef QUICKFIX
  642.     (char_u *)&p_mef,
  643.     {(char_u *)MAKEEF, (char_u *)0L}
  644. #else
  645.     (char_u *)NULL,
  646.     {(char_u *)NULL, (char_u *)0L}
  647. #endif
  648.     },
  649.     {"makeprg",     "mp",   P_STRING|P_EXPAND|P_VI_DEF,
  650. #ifdef QUICKFIX
  651.     (char_u *)&p_mp,
  652.     {(char_u *)"make", (char_u *)0L}
  653. #else
  654.     (char_u *)NULL,
  655.     {(char_u *)NULL, (char_u *)0L}
  656. #endif
  657.     },
  658.     {"matchpairs",  "mps",  P_STRING|P_IND|P_ALLOCED|P_VI_DEF|P_COMMA,
  659.     (char_u *)PV_MPS,
  660.     {(char_u *)"(:),{:},[:]", (char_u *)0L}},
  661.     {"matchtime",   "mat",  P_NUM|P_VI_DEF,
  662.     (char_u *)&p_mat,
  663.     {(char_u *)5L, (char_u *)0L}},
  664.     {"maxfuncdepth", "mfd", P_NUM|P_VI_DEF,
  665. #ifdef WANT_EVAL
  666.     (char_u *)&p_mfd,
  667. #else
  668.     (char_u *)NULL,
  669. #endif
  670.     {(char_u *)100L, (char_u *)0L}},
  671.     {"maxmapdepth", "mmd",  P_NUM|P_VI_DEF,
  672.     (char_u *)&p_mmd,
  673.     {(char_u *)1000L, (char_u *)0L}},
  674.     {"maxmem",     "mm",   P_NUM|P_VI_DEF,
  675.     (char_u *)&p_mm,
  676.     {(char_u *)MAXMEM, (char_u *)0L}},
  677.     {"maxmemtot",   "mmt",  P_NUM|P_VI_DEF,
  678.     (char_u *)&p_mmt,
  679.     {(char_u *)MAXMEMTOT, (char_u *)0L}},
  680.     {"mesg",     NULL,   P_BOOL|P_VI_DEF,
  681.     (char_u *)NULL,
  682.     {(char_u *)FALSE, (char_u *)0L}},
  683.     {"modeline",    "ml",   P_BOOL|P_IND|P_VIM,
  684.     (char_u *)PV_ML,
  685.     {(char_u *)FALSE, (char_u *)TRUE}},
  686.     {"modelines",   "mls",  P_NUM|P_VI_DEF,
  687.     (char_u *)&p_mls,
  688.     {(char_u *)5L, (char_u *)0L}},
  689.     {"modified",    "mod",  P_BOOL|P_IND|P_NO_MKRC|P_VI_DEF|P_RSTAT,
  690.     (char_u *)PV_MOD,
  691.     {(char_u *)FALSE, (char_u *)0L}},
  692.     {"more",     NULL,   P_BOOL|P_VIM,
  693.     (char_u *)&p_more,
  694.     {(char_u *)FALSE, (char_u *)TRUE}},
  695.     {"mouse",     NULL,   P_STRING|P_VI_DEF,
  696.     (char_u *)&p_mouse,
  697.     {
  698. #if defined(MSDOS) || defined(WIN32)
  699. (char_u *)"a",
  700. #else
  701. (char_u *)"",
  702. #endif
  703. (char_u *)0L}},
  704.     {"mousefocus",   "mousef", P_BOOL|P_VI_DEF,
  705. #ifdef USE_GUI
  706.     (char_u *)&p_mousef,
  707. #else
  708.     (char_u *)NULL,
  709. #endif
  710.     {(char_u *)FALSE, (char_u *)0L}},
  711.     {"mousehide",   "mh",   P_BOOL|P_VI_DEF,
  712. #ifdef USE_GUI
  713.     (char_u *)&p_mh,
  714. #else
  715.     (char_u *)NULL,
  716. #endif
  717.     {(char_u *)FALSE, (char_u *)0L}},
  718.     {"mousemodel",  "mousem", P_STRING|P_VI_DEF,
  719.     (char_u *)&p_mousem,
  720.     {
  721. #if defined(MSDOS) || defined(WIN32)
  722. (char_u *)"popup",
  723. #else
  724. (char_u *)"extend",/* TODO: macintosh: "mac" */
  725. #endif
  726. (char_u *)0L}},
  727.     {"mousetime",   "mouset", P_NUM|P_VI_DEF,
  728.     (char_u *)&p_mouset,
  729.     {(char_u *)500L, (char_u *)0L}},
  730.     {"novice",     NULL,   P_BOOL|P_VI_DEF,
  731.     (char_u *)NULL,
  732.     {(char_u *)FALSE, (char_u *)0L}},
  733.     {"number",     "nu",   P_BOOL|P_IND|P_VI_DEF|P_RBUF,
  734.     (char_u *)PV_NU,
  735.     {(char_u *)FALSE, (char_u *)0L}},
  736.     {"nrformats",   "nf",   P_STRING|P_IND|P_ALLOCED|P_VI_DEF|P_COMMA,
  737.     (char_u *)PV_NF,
  738.     {(char_u *)"octal,hex", (char_u *)0L}},
  739.     {"open",     NULL,   P_BOOL|P_VI_DEF,
  740.     (char_u *)NULL,
  741.     {(char_u *)FALSE, (char_u *)0L}},
  742.     {"optimize",    "opt",  P_BOOL|P_VI_DEF,
  743.     (char_u *)NULL,
  744.     {(char_u *)FALSE, (char_u *)0L}},
  745.     {"paragraphs",  "para", P_STRING|P_VI_DEF,
  746.     (char_u *)&p_para,
  747.     {(char_u *)"IPLPPPQPP LIpplpipbp", (char_u *)0L}},
  748.     {"paste",     NULL,   P_BOOL|P_VI_DEF,
  749.     (char_u *)&p_paste,
  750.     {(char_u *)FALSE, (char_u *)0L}},
  751.     {"patchmode",   "pm",   P_STRING|P_VI_DEF,
  752.     (char_u *)&p_pm,
  753.     {(char_u *)"", (char_u *)0L}},
  754.     {"path",     "pa",   P_STRING|P_EXPAND|P_VI_DEF|P_COMMA,
  755.     (char_u *)&p_path,
  756.     {
  757. #if defined AMIGA || defined MSDOS || defined WIN32
  758.     (char_u *)".,,",
  759. #else
  760. # if defined(__EMX__)
  761.     (char_u *)".,/emx/include,,",
  762. # else /* Unix, probably */
  763.     (char_u *)".,/usr/include,,",
  764. # endif
  765. #endif
  766. (char_u *)0L}},
  767.     {"prompt",     NULL,   P_BOOL|P_VI_DEF,
  768.     (char_u *)NULL,
  769.     {(char_u *)FALSE, (char_u *)0L}},
  770.     {"readonly",    "ro",   P_BOOL|P_IND|P_VI_DEF|P_RSTAT,
  771.     (char_u *)PV_RO,
  772.     {(char_u *)FALSE, (char_u *)0L}},
  773.     {"redraw",     NULL,   P_BOOL|P_VI_DEF,
  774.     (char_u *)NULL,
  775.     {(char_u *)FALSE, (char_u *)0L}},
  776.     {"remap",     NULL,   P_BOOL|P_VI_DEF,
  777.     (char_u *)&p_remap,
  778.     {(char_u *)TRUE, (char_u *)0L}},
  779.     {"report",     NULL,   P_NUM|P_VI_DEF,
  780.     (char_u *)&p_report,
  781.     {(char_u *)2L, (char_u *)0L}},
  782.     {"restorescreen", "rs", P_BOOL|P_VI_DEF,
  783. #ifdef WIN32
  784.     (char_u *)&p_rs,
  785. #else
  786.     (char_u *)NULL,
  787. #endif
  788.     {(char_u *)TRUE, (char_u *)0L}},
  789.     {"revins",     "ri",   P_BOOL|P_VI_DEF|P_VIM,
  790. #ifdef RIGHTLEFT
  791.     (char_u *)&p_ri,
  792. #else
  793.     (char_u *)NULL,
  794. #endif
  795.     {(char_u *)FALSE, (char_u *)0L}},
  796.     {"rightleft",   "rl",   P_BOOL|P_IND|P_VI_DEF|P_RBUF,
  797. #ifdef RIGHTLEFT
  798.     (char_u *)PV_RL,
  799. #else
  800.     (char_u *)NULL,
  801. #endif
  802.     {(char_u *)FALSE, (char_u *)0L}},
  803.     {"ruler",     "ru",   P_BOOL|P_VI_DEF|P_VIM|P_RSTAT,
  804.     (char_u *)&p_ru,
  805.     {(char_u *)FALSE, (char_u *)0L}},
  806.     {"scroll",     "scr",  P_NUM|P_IND|P_NO_MKRC|P_VI_DEF,
  807.     (char_u *)PV_SCROLL,
  808.     {(char_u *)12L, (char_u *)0L}},
  809.     {"scrolljump",  "sj",   P_NUM|P_VI_DEF|P_VIM,
  810.     (char_u *)&p_sj,
  811.     {(char_u *)1L, (char_u *)0L}},
  812.     {"scrolloff",   "so",   P_NUM|P_VI_DEF|P_VIM|P_RALL,
  813.     (char_u *)&p_so,
  814.     {(char_u *)0L, (char_u *)0L}},
  815.     {"sections",    "sect", P_STRING|P_VI_DEF,
  816.     (char_u *)&p_sections,
  817.     {(char_u *)"SHNHH HUnhsh", (char_u *)0L}},
  818.     {"secure",     NULL,   P_BOOL|P_VI_DEF,
  819.     (char_u *)&p_secure,
  820.     {(char_u *)FALSE, (char_u *)0L}},
  821.     {"selection",   "sel",  P_STRING|P_VI_DEF,
  822.     (char_u *)&p_sel,
  823.     {(char_u *)"inclusive", (char_u *)0L}},
  824.     {"selectmode",  "slm",  P_STRING|P_VI_DEF|P_COMMA,
  825.     (char_u *)&p_slm,
  826.     {(char_u *)"", (char_u *)0L}},
  827.     {"sessionoptions", "ssop", P_STRING|P_VI_DEF|P_COMMA,
  828.     (char_u *)&p_sessopt,
  829.     {(char_u *)"winsize,options", (char_u *)0L}},
  830.     {"shell",     "sh",   P_STRING|P_EXPAND|P_VI_DEF,
  831.     (char_u *)&p_sh,
  832.     {
  833. #ifdef VMS
  834.     (char_u *)"",
  835. #else
  836. #if defined(MSDOS)
  837.     (char_u *)"command",
  838. #else
  839. # if defined(WIN32)
  840.     (char_u *)"", /* set in set_init_1() */
  841. # else
  842. #  if defined(OS2)
  843.     (char_u *)"cmd.exe",
  844. #  else
  845. #   if defined(ARCHIE)
  846.     (char_u *)"gos",
  847. #   else
  848.     (char_u *)"sh",
  849. #   endif
  850. #  endif
  851. # endif
  852. #endif
  853. #endif /* VMS */
  854. (char_u *)0L}},
  855.     {"shellcmdflag","shcf", P_STRING|P_VI_DEF,
  856.     (char_u *)&p_shcf,
  857.     {
  858. #if defined(MSDOS) || defined(WIN32)
  859.     (char_u *)"/c",
  860. #else
  861. # if defined(OS2)
  862.     (char_u *)"/c",
  863. # else
  864.     (char_u *)"-c",
  865. # endif
  866. #endif
  867. (char_u *)0L}},
  868.     {"shellpipe",   "sp",   P_STRING|P_VI_DEF,
  869.     (char_u *)&p_sp,
  870.     {
  871. #if defined(UNIX) || defined(OS2)
  872. # ifdef ARCHIE
  873.     (char_u *)"2>",
  874. # else
  875.     (char_u *)"| tee",
  876. # endif
  877. #else
  878.     (char_u *)">",
  879. #endif
  880. (char_u *)0L}},
  881.     {"shellquote",  "shq",  P_STRING|P_VI_DEF,
  882.     (char_u *)&p_shq,
  883.     {(char_u *)"", (char_u *)0L}},
  884.     {"shellredir",  "srr",  P_STRING|P_VI_DEF,
  885.     (char_u *)&p_srr,
  886.     {(char_u *)">", (char_u *)0L}},
  887.     {"shelltype",   "st",   P_NUM|P_VI_DEF,
  888.     (char_u *)&p_st,
  889.     {(char_u *)0L, (char_u *)0L}},
  890.     {"shellxquote", "sxq",  P_STRING|P_VI_DEF,
  891.     (char_u *)&p_sxq,
  892.     {
  893. #if defined(UNIX) && defined(USE_SYSTEM) && !defined(__EMX__)
  894.     (char_u *)""",
  895. #else
  896.     (char_u *)"",
  897. #endif
  898. (char_u *)0L}},
  899.     {"shiftround",  "sr",   P_BOOL|P_VI_DEF|P_VIM,
  900.     (char_u *)&p_sr,
  901.     {(char_u *)FALSE, (char_u *)0L}},
  902.     {"shiftwidth",  "sw",   P_NUM|P_IND|P_VI_DEF,
  903.     (char_u *)PV_SW,
  904.     {(char_u *)8L, (char_u *)0L}},
  905.     {"shortmess",   "shm",  P_STRING|P_VI_DEF|P_VIM,
  906.     (char_u *)&p_shm,
  907.     {(char_u *)"", (char_u *)0L}},
  908.     {"shortname",   "sn",   P_BOOL|P_IND|P_VI_DEF,
  909. #ifdef SHORT_FNAME
  910.     (char_u *)NULL,
  911. #else
  912.     (char_u *)PV_SN,
  913. #endif
  914.     {(char_u *)FALSE, (char_u *)0L}},
  915.     {"showbreak",   "sbr",  P_STRING|P_VI_DEF|P_RALL,
  916.     (char_u *)&p_sbr,
  917.     {(char_u *)"", (char_u *)0L}},
  918.     {"showcmd",     "sc",   P_BOOL|P_VIM,
  919.     (char_u *)&p_sc,
  920.     {(char_u *)FALSE,
  921. #ifdef UNIX
  922. (char_u *)FALSE
  923. #else
  924. (char_u *)TRUE
  925. #endif
  926. }},
  927.     {"showfulltag", "sft",  P_BOOL|P_VI_DEF,
  928.     (char_u *)&p_sft,
  929.     {(char_u *)FALSE, (char_u *)0L}},
  930.     {"showmatch",   "sm",   P_BOOL|P_VI_DEF,
  931.     (char_u *)&p_sm,
  932.     {(char_u *)FALSE, (char_u *)0L}},
  933.     {"showmode",    "smd",  P_BOOL|P_VIM,
  934.     (char_u *)&p_smd,
  935.     {(char_u *)FALSE, (char_u *)TRUE}},
  936.     {"sidescroll",  "ss",   P_NUM|P_VI_DEF,
  937.     (char_u *)&p_ss,
  938.     {(char_u *)0L, (char_u *)0L}},
  939.     {"slowopen",    "slow", P_BOOL|P_VI_DEF,
  940.     (char_u *)NULL,
  941.     {(char_u *)FALSE, (char_u *)0L}},
  942.     {"smartcase",   "scs",  P_BOOL|P_VI_DEF|P_VIM,
  943.     (char_u *)&p_scs,
  944.     {(char_u *)FALSE, (char_u *)0L}},
  945.     {"smartindent", "si",   P_BOOL|P_IND|P_VI_DEF|P_VIM,
  946. #ifdef SMARTINDENT
  947.     (char_u *)PV_SI,
  948. #else
  949.     (char_u *)NULL,
  950. #endif
  951.     {(char_u *)FALSE, (char_u *)0L}},
  952.     {"smarttab",    "sta",  P_BOOL|P_VI_DEF|P_VIM,
  953.     (char_u *)&p_sta,
  954.     {(char_u *)FALSE, (char_u *)0L}},
  955.     {"softtabstop", "sts",  P_NUM|P_IND|P_VI_DEF|P_VIM,
  956.     (char_u *)PV_STS,
  957.     {(char_u *)0L, (char_u *)0L}},
  958.     {"sourceany",   NULL,   P_BOOL|P_VI_DEF,
  959.     (char_u *)NULL,
  960.     {(char_u *)FALSE, (char_u *)0L}},
  961.     {"splitbelow",  "sb",   P_BOOL|P_VI_DEF,
  962.     (char_u *)&p_sb,
  963.     {(char_u *)FALSE, (char_u *)0L}},
  964.     {"startofline", "sol",  P_BOOL|P_VI_DEF|P_VIM,
  965.     (char_u *)&p_sol,
  966.     {(char_u *)TRUE, (char_u *)0L}},
  967.     {"suffixes",    "su",   P_STRING|P_VI_DEF|P_COMMA,
  968.     (char_u *)&p_su,
  969.     {(char_u *)".bak,~,.o,.h,.info,.swp",
  970. (char_u *)0L}},
  971.     {"swapfile",    "swf",  P_BOOL|P_IND|P_VI_DEF|P_RSTAT,
  972.     (char_u *)PV_SWF,
  973.     {(char_u *)TRUE, (char_u *)0L}},
  974.     {"swapsync",    "sws",  P_STRING|P_VI_DEF,
  975.     (char_u *)&p_sws,
  976.     {(char_u *)"fsync", (char_u *)0L}},
  977.     {"syntax",     "syn",  P_STRING|P_IND|P_ALLOCED|P_VI_DEF,
  978. #ifdef SYNTAX_HL
  979.     (char_u *)PV_SYN,
  980.     {(char_u *)"", (char_u *)0L}
  981. #else
  982.     (char_u *)NULL,
  983.     {(char_u *)0L, (char_u *)0L}
  984. #endif
  985.     },
  986.     {"tabstop",     "ts",   P_NUM|P_IND|P_VI_DEF|P_RBUF,
  987.     (char_u *)PV_TS,
  988.     {(char_u *)8L, (char_u *)0L}},
  989.     {"tagbsearch",  "tbs",   P_BOOL|P_VI_DEF,
  990.     (char_u *)&p_tbs,
  991.     {(char_u *)TRUE, (char_u *)0L}},
  992.     {"taglength",   "tl",   P_NUM|P_VI_DEF,
  993.     (char_u *)&p_tl,
  994.     {(char_u *)0L, (char_u *)0L}},
  995.     {"tagrelative", "tr",   P_BOOL|P_VIM,
  996.     (char_u *)&p_tr,
  997.     {(char_u *)FALSE, (char_u *)TRUE}},
  998.     {"tags",     "tag",  P_STRING|P_EXPAND|P_VI_DEF|P_COMMA,
  999.     (char_u *)&p_tags,
  1000.     {
  1001. #ifdef EMACS_TAGS
  1002.     (char_u *)"./tags,./TAGS,tags,TAGS",
  1003. #else
  1004.     (char_u *)"./tags,tags",
  1005. #endif
  1006. (char_u *)0L}},
  1007.     {"tagstack",    "tgst", P_BOOL|P_VI_DEF,
  1008.     (char_u *)NULL,
  1009.     {(char_u *)TRUE, (char_u *)0L}},
  1010.     {"term",     NULL,   P_STRING|P_EXPAND|P_NODEFAULT|P_NO_MKRC|P_VI_DEF|P_RALL,
  1011.     (char_u *)&T_NAME,
  1012.     {(char_u *)"", (char_u *)0L}},
  1013.     {"terse",     NULL,   P_BOOL|P_VI_DEF,
  1014.     (char_u *)&p_terse,
  1015.     {(char_u *)FALSE, (char_u *)0L}},
  1016.     {"textauto",    "ta",   P_BOOL|P_VIM,
  1017.     (char_u *)&p_ta,
  1018.     {(char_u *)TA_DFLT, (char_u *)TRUE}},
  1019.     {"textmode",    "tx",   P_BOOL|P_IND|P_VI_DEF,
  1020.     (char_u *)PV_TX,
  1021.     {
  1022. #ifdef USE_CRNL
  1023.     (char_u *)TRUE,
  1024. #else
  1025.     (char_u *)FALSE,
  1026. #endif
  1027. (char_u *)0L}},
  1028.     {"textwidth",   "tw",   P_NUM|P_IND|P_VI_DEF|P_VIM,
  1029.     (char_u *)PV_TW,
  1030.     {(char_u *)0L, (char_u *)0L}},
  1031.     {"tildeop",     "top",  P_BOOL|P_VI_DEF|P_VIM,
  1032.     (char_u *)&p_to,
  1033.     {(char_u *)FALSE, (char_u *)0L}},
  1034.     {"timeout",     "to",   P_BOOL|P_VI_DEF,
  1035.     (char_u *)&p_timeout,
  1036.     {(char_u *)TRUE, (char_u *)0L}},
  1037.     {"timeoutlen",  "tm",   P_NUM|P_VI_DEF,
  1038.     (char_u *)&p_tm,
  1039.     {(char_u *)1000L, (char_u *)0L}},
  1040.     {"title",     NULL,   P_BOOL|P_VI_DEF,
  1041.     (char_u *)&p_title,
  1042.     {(char_u *)FALSE, (char_u *)0L}},
  1043.     {"titlelen",    NULL,   P_NUM|P_VI_DEF,
  1044.     (char_u *)&p_titlelen,
  1045.     {(char_u *)85L, (char_u *)0L}},
  1046.     {"titlestring", NULL,   P_STRING|P_VI_DEF,
  1047.     (char_u *)&p_titlestring,
  1048.     {(char_u *)"", (char_u *)0L}},
  1049.     {"ttimeout",    NULL,   P_BOOL|P_VI_DEF|P_VIM,
  1050.     (char_u *)&p_ttimeout,
  1051.     {(char_u *)FALSE, (char_u *)0L}},
  1052.     {"ttimeoutlen", "ttm",  P_NUM|P_VI_DEF,
  1053.     (char_u *)&p_ttm,
  1054.     {(char_u *)-1L, (char_u *)0L}},
  1055.     {"ttybuiltin",  "tbi",  P_BOOL|P_VI_DEF,
  1056.     (char_u *)&p_tbi,
  1057.     {(char_u *)TRUE, (char_u *)0L}},
  1058.     {"ttyfast",     "tf",   P_BOOL|P_NO_MKRC|P_VI_DEF,
  1059.     (char_u *)&p_tf,
  1060.     {(char_u *)FALSE, (char_u *)0L}},
  1061.     {"ttyscroll",   "tsl",  P_NUM|P_VI_DEF,
  1062.     (char_u *)&p_ttyscroll,
  1063.     {(char_u *)999L, (char_u *)0L}},
  1064.     {"ttytype",     "tty",  P_STRING|P_EXPAND|P_NODEFAULT|P_NO_MKRC|P_VI_DEF|P_RALL,
  1065.     (char_u *)&T_NAME,
  1066.     {(char_u *)"", (char_u *)0L}},
  1067.     {"ttymouse",    "ttym", P_STRING|P_NODEFAULT|P_NO_MKRC|P_VI_DEF,
  1068.     (char_u *)&p_ttym,
  1069.     {(char_u *)"", (char_u *)0L}},
  1070.     {"undolevels",  "ul",   P_NUM|P_VI_DEF,
  1071.     (char_u *)&p_ul,
  1072.     {
  1073. #if defined(UNIX) || defined(WIN32) || defined(OS2)
  1074.     (char_u *)1000L,
  1075. #else
  1076.     (char_u *)100L,
  1077. #endif
  1078. (char_u *)0L}},
  1079.     {"updatecount", "uc",   P_NUM|P_VI_DEF,
  1080.     (char_u *)&p_uc,
  1081.     {(char_u *)200L, (char_u *)0L}},
  1082.     {"updatetime",  "ut",   P_NUM|P_VI_DEF,
  1083.     (char_u *)&p_ut,
  1084.     {(char_u *)4000L, (char_u *)0L}},
  1085.     {"verbose",     "vbs",  P_NUM|P_VI_DEF,
  1086.     (char_u *)&p_verbose,
  1087.     {(char_u *)0L, (char_u *)0L}},
  1088.     {"viminfo",     "vi",   P_STRING|P_VI_DEF|P_COMMA,
  1089. #ifdef VIMINFO
  1090.     (char_u *)&p_viminfo,
  1091. #else
  1092.     (char_u *)NULL,
  1093. #endif /* VIMINFO */
  1094.     {(char_u *)"", (char_u *)0L}},
  1095.     {"visualbell",  "vb",   P_BOOL|P_VI_DEF,
  1096.     (char_u *)&p_vb,
  1097.     {(char_u *)FALSE, (char_u *)0L}},
  1098.     {"w300",     NULL,   P_NUM|P_VI_DEF,
  1099.     (char_u *)NULL,
  1100.     {(char_u *)0L, (char_u *)0L}},
  1101.     {"w1200",     NULL,   P_NUM|P_VI_DEF,
  1102.     (char_u *)NULL,
  1103.     {(char_u *)0L, (char_u *)0L}},
  1104.     {"w9600",     NULL,   P_NUM|P_VI_DEF,
  1105.     (char_u *)NULL,
  1106.     {(char_u *)0L, (char_u *)0L}},
  1107.     {"warn",     NULL,   P_BOOL|P_VI_DEF,
  1108.     (char_u *)&p_warn,
  1109.     {(char_u *)TRUE, (char_u *)0L}},
  1110.     {"weirdinvert", "wiv",  P_BOOL|P_VI_DEF|P_RALL,
  1111.     (char_u *)&p_wiv,
  1112.     {(char_u *)FALSE, (char_u *)0L}},
  1113.     {"whichwrap",   "ww",   P_STRING|P_VIM|P_COMMA,
  1114.     (char_u *)&p_ww,
  1115.     {(char_u *)"", (char_u *)"b,s"}},
  1116.     {"wildchar",    "wc",   P_NUM|P_VIM,
  1117.     (char_u *)&p_wc,
  1118.     {(char_u *)(long)Ctrl('E'), (char_u *)(long)TAB}},
  1119.     {"wildignore",  "wig",  P_STRING|P_VI_DEF|P_COMMA,
  1120. #ifdef WILDIGNORE
  1121.     (char_u *)&p_wig,
  1122. #else
  1123.     (char_u *)NULL,
  1124. #endif
  1125.     {(char_u *)"", (char_u *)0L}},
  1126.     {"wildmode",    "wim",  P_STRING|P_VI_DEF|P_COMMA,
  1127.     (char_u *)&p_wim,
  1128.     {(char_u *)"full", (char_u *)0L}},
  1129.     {"winaltkeys",  "wak",  P_STRING|P_VI_DEF,
  1130. #if defined(USE_GUI_WIN32) || defined(USE_GUI_MOTIF)
  1131.     (char_u *)&p_wak,
  1132.     {(char_u *)"menu", (char_u *)0L}
  1133. #else
  1134.     (char_u *)NULL,
  1135.     {(char_u *)NULL, (char_u *)0L}
  1136. #endif
  1137.     },
  1138.     {"window",     "wi",   P_NUM|P_VI_DEF,
  1139.     (char_u *)NULL,
  1140.     {(char_u *)0L, (char_u *)0L}},
  1141.     {"winheight",   "wh",   P_NUM|P_VI_DEF,
  1142.     (char_u *)&p_wh,
  1143.     {(char_u *)1L, (char_u *)0L}},
  1144.     {"winminheight", "wmh", P_NUM|P_VI_DEF,
  1145.     (char_u *)&p_wmh,
  1146.     {(char_u *)1L, (char_u *)0L}},
  1147.     {"wrap",     NULL,   P_BOOL|P_IND|P_VI_DEF|P_RBUF,
  1148.     (char_u *)PV_WRAP,
  1149.     {(char_u *)TRUE, (char_u *)0L}},
  1150.     {"wrapmargin",  "wm",   P_NUM|P_IND|P_VI_DEF,
  1151.     (char_u *)PV_WM,
  1152.     {(char_u *)0L, (char_u *)0L}},
  1153.     {"wrapscan",    "ws",   P_BOOL|P_VI_DEF,
  1154.     (char_u *)&p_ws,
  1155.     {(char_u *)TRUE, (char_u *)0L}},
  1156.     {"writeany",    "wa",   P_BOOL|P_VI_DEF,
  1157.     (char_u *)&p_wa,
  1158.     {(char_u *)FALSE, (char_u *)0L}},
  1159.     {"writebackup", "wb",   P_BOOL|P_VI_DEF|P_VIM,
  1160.     (char_u *)&p_wb,
  1161.     {
  1162. #ifdef WRITEBACKUP
  1163.     (char_u *)TRUE,
  1164. #else
  1165.     (char_u *)FALSE,
  1166. #endif
  1167. (char_u *)0L}},
  1168.     {"writedelay",  "wd",   P_NUM|P_VI_DEF,
  1169.     (char_u *)&p_wd,
  1170.     {(char_u *)0L, (char_u *)0L}},
  1171. /* terminal output codes */
  1172. #define p_term(sss, vvv)   {sss, NULL, P_STRING|P_VI_DEF|P_RALL, 
  1173.     (char_u *)&vvv, 
  1174.     {(char_u *)"", (char_u *)0L}},
  1175.     p_term("t_AB", T_CAB)
  1176.     p_term("t_AF", T_CAF)
  1177.     p_term("t_AL", T_CAL)
  1178.     p_term("t_al", T_AL)
  1179.     p_term("t_bc", T_BC)
  1180.     p_term("t_cd", T_CD)
  1181.     p_term("t_ce", T_CE)
  1182.     p_term("t_cl", T_CL)
  1183.     p_term("t_cm", T_CM)
  1184.     p_term("t_Co", T_CCO)
  1185.     p_term("t_CS", T_CCS)
  1186.     p_term("t_cs", T_CS)
  1187.     p_term("t_da", T_DA)
  1188.     p_term("t_db", T_DB)
  1189.     p_term("t_DL", T_CDL)
  1190.     p_term("t_dl", T_DL)
  1191.     p_term("t_ke", T_KE)
  1192.     p_term("t_ks", T_KS)
  1193.     p_term("t_le", T_LE)
  1194.     p_term("t_mb", T_MB)
  1195.     p_term("t_md", T_MD)
  1196.     p_term("t_me", T_ME)
  1197.     p_term("t_mr", T_MR)
  1198.     p_term("t_ms", T_MS)
  1199.     p_term("t_nd", T_ND)
  1200.     p_term("t_op", T_OP)
  1201.     p_term("t_RI", T_CRI)
  1202.     p_term("t_Sb", T_CSB)
  1203.     p_term("t_Sf", T_CSF)
  1204.     p_term("t_se", T_SE)
  1205.     p_term("t_so", T_SO)
  1206.     p_term("t_sr", T_SR)
  1207.     p_term("t_te", T_TE)
  1208.     p_term("t_ti", T_TI)
  1209.     p_term("t_ue", T_UE)
  1210.     p_term("t_us", T_US)
  1211.     p_term("t_vb", T_VB)
  1212.     p_term("t_ve", T_VE)
  1213.     p_term("t_vi", T_VI)
  1214.     p_term("t_vs", T_VS)
  1215.     p_term("t_xs", T_XS)
  1216.     p_term("t_ZH", T_CZH)
  1217.     p_term("t_ZR", T_CZR)
  1218. /* terminal key codes are not in here */
  1219.     {NULL, NULL, 0, NULL, {NULL, NULL}} /* end marker */
  1220. };
  1221. #define PARAM_COUNT (sizeof(options) / sizeof(struct vimoption))
  1222. static char *(p_bg_values[]) = {"light", "dark", NULL};
  1223. static char *(p_nf_values[]) = {"octal", "hex", NULL};
  1224. static char *(p_ff_values[]) = {FF_UNIX, FF_DOS, FF_MAC, NULL};
  1225. #ifdef MULTI_BYTE
  1226. static char *(p_fe_values[]) = {FE_ANSI, FE_UNICODE, FE_DBJPN, FE_DBKOR,
  1227.     FE_DBCHT, FE_DBCHS, FE_HEBREW, FE_FARSI , NULL};
  1228. #endif
  1229. #if defined(USE_GUI_WIN32) || defined(USE_GUI_MOTIF)
  1230. static char *(p_wak_values[]) = {"yes", "menu", "no", NULL};
  1231. #endif
  1232. static char *(p_sessopt_values[]) = {"resize", "winsize", "options", NULL};
  1233. static char *(p_mousem_values[]) = {"extend", "popup", "mac", NULL};
  1234. static char *(p_slm_values[]) = {"mouse", "key", "cmd", NULL};
  1235. static char *(p_sel_values[]) = {"inclusive", "exclusive", "old", NULL};
  1236. static char *(p_km_values[]) = {"startsel", "stopsel", NULL};
  1237. static char *(p_bsdir_values[]) = {"current", "last", "buffer", NULL};
  1238. static void set_option_default __ARGS((int, int));
  1239. static void set_options_default __ARGS((int dofree));
  1240. static void illegal_char __ARGS((char_u *, int));
  1241. static void did_set_title __ARGS((int icon));
  1242. static char_u *option_expand __ARGS((int));
  1243. static void set_string_option __ARGS((int opt_idx, char_u *value));
  1244. static char_u *did_set_string_option __ARGS((int opt_idx, char_u **varp, int new_value_alloced, char_u *oldval, char_u *errbuf));
  1245. static char_u *set_bool_option __ARGS((int opt_idx, char_u *varp, int value));
  1246. static char_u *set_num_option __ARGS((int opt_idx, char_u *varp, long value, char_u *errbuf));
  1247. static void check_redraw __ARGS((int flags));
  1248. static int findoption __ARGS((char_u *));
  1249. static int find_key_option __ARGS((char_u *));
  1250. static void showoptions __ARGS((int));
  1251. static int option_not_default __ARGS((struct vimoption *));
  1252. static void showoneopt __ARGS((struct vimoption *));
  1253. static int  istermoption __ARGS((struct vimoption *));
  1254. static char_u *get_varp __ARGS((struct vimoption *));
  1255. static void option_value2string __ARGS((struct vimoption *));
  1256. #ifdef HAVE_LANGMAP
  1257. static void langmap_init __ARGS((void));
  1258. static void langmap_set __ARGS((void));
  1259. #endif
  1260. static void paste_option_changed __ARGS((void));
  1261. static void compatible_set __ARGS((void));
  1262. static void fill_breakat_flags __ARGS((void));
  1263. static int check_opt_strings __ARGS((char_u *val, char **values, int));
  1264. static int check_opt_wim __ARGS((void));
  1265. /*
  1266.  * Initialize the options, first part.
  1267.  *
  1268.  * Called only once from main(), just after creating the first buffer.
  1269.  */
  1270.     void
  1271. set_init_1()
  1272. {
  1273.     char_u  *p;
  1274.     int     opt_idx;
  1275.     long    n;
  1276. #ifdef HAVE_LANGMAP
  1277.     langmap_init();
  1278. #endif
  1279.     /* Be Vi compatible by default */
  1280.     p_cp = TRUE;
  1281.     /*
  1282.      * Find default value for 'shell' option.
  1283.      */
  1284.     if ((p = mch_getenv((char_u *)"SHELL")) != NULL
  1285. #if defined(MSDOS) || defined(WIN32) || defined(OS2)
  1286. # ifdef __EMX__
  1287.     || (p = mch_getenv((char_u *)"EMXSHELL")) != NULL
  1288. # endif
  1289.     || (p = mch_getenv((char_u *)"COMSPEC")) != NULL
  1290. # ifdef WIN32
  1291.     || (p = default_shell()) != NULL
  1292. # endif
  1293. #endif
  1294.     )
  1295.     {
  1296. set_string_default("sh", p);
  1297.     }
  1298.     /*
  1299.      * 'maxmemtot' and 'maxmem' may have to be adjusted for available memory
  1300.      */
  1301.     opt_idx = findoption((char_u *)"maxmemtot");
  1302.     if (options[opt_idx].def_val[VI_DEFAULT] == (char_u *)0L)
  1303.     {
  1304. n = (mch_avail_mem(FALSE) >> 11);
  1305. options[opt_idx].def_val[VI_DEFAULT] = (char_u *)n;
  1306. opt_idx = findoption((char_u *)"maxmem");
  1307. if ((long)options[opt_idx].def_val[VI_DEFAULT] > n
  1308.   || (long)options[opt_idx].def_val[VI_DEFAULT] == 0L)
  1309.     options[opt_idx].def_val[VI_DEFAULT] = (char_u *)n;
  1310.     }
  1311. #ifdef USE_GUI_WIN32
  1312.     /* force 'shortname' for Win32s */
  1313.     if (gui_is_win32s())
  1314. options[findoption((char_u *)"shortname")].def_val[VI_DEFAULT] =
  1315.        (char_u *)TRUE;
  1316. #endif
  1317.     /*
  1318.      * set all the options (except the terminal options) to their default value
  1319.      */
  1320.     set_options_default(FALSE);
  1321. #ifdef USE_GUI
  1322.     if (found_reverse_arg)
  1323. set_option_value((char_u *)"bg", 0L, (char_u *)"dark");
  1324. #endif
  1325.     curbuf->b_p_initialized = TRUE;
  1326.     check_buf_options(curbuf);
  1327.     check_options();
  1328.     /*
  1329.      * initialize the table for 'iskeyword' et.al.
  1330.      * Must be before option_expand(), because that one needs vim_isIDc()
  1331.      */
  1332.     init_chartab();
  1333.     /*
  1334.      * initialize the table for 'breakat'.
  1335.      */
  1336.     fill_breakat_flags();
  1337.     /*
  1338.      * Expand environment variables and things like "~" for the defaults.
  1339.      * If option_expand() returns non-NULL the variable is expanded. This can
  1340.      * only happen for non-indirect options.
  1341.      * Also set the default to the expanded value, so ":set" does not list
  1342.      * them. Don't set the P_ALLOCED flag, because we don't want to free the
  1343.      * default.
  1344.      */
  1345.     for (opt_idx = 0; !istermoption(&options[opt_idx]); opt_idx++)
  1346.     {
  1347. p = option_expand(opt_idx);
  1348. if (p != NULL)
  1349. {
  1350.     *(char_u **)options[opt_idx].var = p;
  1351.     /* VIMEXP
  1352.      * Defaults for all expanded options are currently the same for Vi
  1353.      * and Vim.  When this changes, add some code here!  Also need to
  1354.      * split P_DEF_ALLOCED in two.
  1355.      */
  1356.     options[opt_idx].def_val[VI_DEFAULT] = p;
  1357.     options[opt_idx].flags |= P_DEF_ALLOCED;
  1358. }
  1359.     }
  1360.     /* Initialize the highlight_attr[] table. */
  1361.     highlight_changed();
  1362.     curbuf->b_start_ffc = *curbuf->b_p_ff;    /* Buffer is unchanged */
  1363.     /* Parse default for 'wildmode'  */
  1364.     check_opt_wim();
  1365. }
  1366. /*
  1367.  * Set an option to its default value.
  1368.  */
  1369.     static void
  1370. set_option_default(opt_idx, dofree)
  1371.     int     opt_idx;
  1372.     int     dofree; /* TRUE when old value can be freed */
  1373. {
  1374.     char_u *varp; /* pointer to variable for current option */
  1375.     int dvi; /* index in def_val[] */
  1376.     int flags;
  1377.     varp = get_varp(&(options[opt_idx]));
  1378.     flags = options[opt_idx].flags;
  1379.     if (varp != NULL)     /* nothing to do for hidden option */
  1380.     {
  1381. if ((flags & P_VI_DEF) || p_cp)
  1382.     dvi = VI_DEFAULT;
  1383. else
  1384.     dvi = VIM_DEFAULT;
  1385. if (flags & P_STRING)
  1386. {
  1387.     /* indirect options are always in allocated memory */
  1388.     if (flags & P_IND)
  1389. set_string_option_direct(NULL, opt_idx,
  1390.       options[opt_idx].def_val[dvi], dofree);
  1391.     else
  1392.     {
  1393. if (dofree && (flags & P_ALLOCED))
  1394.     free_string_option(*(char_u **)(varp));
  1395. *(char_u **)varp = options[opt_idx].def_val[dvi];
  1396. options[opt_idx].flags &= ~P_ALLOCED;
  1397.     }
  1398. }
  1399. else if (flags & P_NUM)
  1400.     *(long *)varp = (long)options[opt_idx].def_val[dvi];
  1401. else /* P_BOOL */
  1402.     /* the cast to long is required for Manx C */
  1403.     *(int *)varp = (int)(long)options[opt_idx].def_val[dvi];
  1404.     }
  1405. }
  1406. /*
  1407.  * Set all options (except terminal options) to their default value.
  1408.  */
  1409.     static void
  1410. set_options_default(dofree)
  1411.     int     dofree; /* may free old value */
  1412. {
  1413.     int     i;
  1414.     for (i = 0; !istermoption(&options[i]); i++)
  1415. if (!(options[i].flags & P_NODEFAULT))
  1416.     set_option_default(i, dofree);
  1417. }
  1418. /*
  1419.  * Set the Vi-default value of a string option.
  1420.  * Used for 'sh' and 'term'.
  1421.  */
  1422.     void
  1423. set_string_default(name, val)
  1424.     char    *name;
  1425.     char_u  *val;
  1426. {
  1427.     char_u *p;
  1428.     int opt_idx;
  1429.     p = vim_strsave(val);
  1430.     if (p != NULL) /* we don't want a NULL */
  1431.     {
  1432. opt_idx = findoption((char_u *)name);
  1433. if (options[opt_idx].flags & P_DEF_ALLOCED)
  1434.     vim_free(options[opt_idx].def_val[VI_DEFAULT]);
  1435. options[opt_idx].def_val[VI_DEFAULT] = p;
  1436. options[opt_idx].flags |= P_DEF_ALLOCED;
  1437.     }
  1438. }
  1439. /*
  1440.  * Set the Vi-default value of a number option.
  1441.  * Used for 'lines' and 'columns'.
  1442.  */
  1443.     void
  1444. set_number_default(name, val)
  1445.     char *name;
  1446.     long val;
  1447. {
  1448.     options[findoption((char_u *)name)].def_val[VI_DEFAULT] = (char_u *)val;
  1449. }
  1450. /*
  1451.  * Initialize the options, part two: After getting Rows and Columns and
  1452.  * setting 'term'.
  1453.  */
  1454.     void
  1455. set_init_2()
  1456. {
  1457.     /*
  1458.      * 'scroll' defaults to half the window height. Note that this default is
  1459.      * wrong when the window height changes.
  1460.      */
  1461.     options[findoption((char_u *)"scroll")].def_val[VI_DEFAULT]
  1462.       = (char_u *)((long_u)Rows >> 1);
  1463.     comp_col();
  1464. #if !((defined(MSDOS) || defined(OS2) || defined(WIN32)) && !defined(USE_GUI))
  1465.     {
  1466. int idx4;
  1467. /*
  1468.  * Try guessing the value of 'background', depending on the terminal
  1469.  * name.  Only need to check for terminals with a dark background,
  1470.  * that can handle color.
  1471.  */
  1472. idx4 = findoption((char_u *)"bg");
  1473. if (!(options[idx4].flags & P_WAS_SET))
  1474. {
  1475.     if (STRCMP(T_NAME, "linux") == 0)     /* linux console */
  1476. set_string_option_direct(NULL, idx4, (char_u *)"dark", TRUE);
  1477. }
  1478.     }
  1479. #endif
  1480. }
  1481. /*
  1482.  * Initialize the options, part three: After reading the .vimrc
  1483.  */
  1484.     void
  1485. set_init_3()
  1486. {
  1487. #if defined(UNIX) || defined(OS2)
  1488. /*
  1489.  * Set 'shellpipe' and 'shellredir', depending on the 'shell' option.
  1490.  * This is done after other initializations, where 'shell' might have been
  1491.  * set, but only if they have not been set before.
  1492.  */
  1493.     char_u  *p;
  1494.     int     idx1;
  1495.     int     idx2;
  1496.     int     do_sp;
  1497.     int     do_srr;
  1498.     idx1 = findoption((char_u *)"sp");
  1499.     idx2 = findoption((char_u *)"srr");
  1500.     do_sp = !(options[idx1].flags & P_WAS_SET);
  1501.     do_srr = !(options[idx2].flags & P_WAS_SET);
  1502.     /*
  1503.      * Isolate the name of the shell:
  1504.      * - Skip beyond any path.  E.g., "/usr/bin/csh -f" -> "csh -f".
  1505.      * - Remove any argument.  E.g., "csh -f" -> "csh".
  1506.      */
  1507.     p = gettail(p_sh);
  1508.     p = vim_strnsave(p, skiptowhite(p) - p);
  1509.     if (p != NULL)
  1510.     {
  1511. /*
  1512.  * Default for p_sp is "| tee", for p_srr is ">".
  1513.  * For known shells it is changed here to include stderr.
  1514.  */
  1515. if (    fnamecmp(p, "csh") == 0
  1516. || fnamecmp(p, "tcsh") == 0
  1517. # ifdef OS2     /* also check with .exe extension */
  1518. || fnamecmp(p, "csh.exe") == 0
  1519. || fnamecmp(p, "tcsh.exe") == 0
  1520. # endif
  1521.    )
  1522. {
  1523.     if (do_sp)
  1524.     {
  1525. p_sp = (char_u *)"|& tee";
  1526. options[idx1].def_val[VI_DEFAULT] = p_sp;
  1527.     }
  1528.     if (do_srr)
  1529.     {
  1530. p_srr = (char_u *)">&";
  1531. options[idx2].def_val[VI_DEFAULT] = p_srr;
  1532.     }
  1533. }
  1534. else
  1535. # ifndef OS2 /* Always use bourne shell style redirection if we reach this */
  1536.     if (       STRCMP(p, "sh") == 0
  1537.     || STRCMP(p, "ksh") == 0
  1538.     || STRCMP(p, "zsh") == 0
  1539.     || STRCMP(p, "bash") == 0)
  1540. # endif
  1541.     {
  1542. if (do_sp)
  1543. {
  1544.     p_sp = (char_u *)"2>&1| tee";
  1545.     options[idx1].def_val[VI_DEFAULT] = p_sp;
  1546. }
  1547. if (do_srr)
  1548. {
  1549.     p_srr = (char_u *)">%s 2>&1";
  1550.     options[idx2].def_val[VI_DEFAULT] = p_srr;
  1551. }
  1552.     }
  1553. vim_free(p);
  1554.     }
  1555. #endif
  1556. #if defined(MSDOS) || defined(WIN32) || defined(OS2)
  1557.     /*
  1558.      * Set 'shellcmdflag and 'shellquote' depending on the 'shell' option.
  1559.      * This is done after other initializations, where 'shell' might have been
  1560.      * set, but only if they have not been set before.  Default for p_shcf is
  1561.      * "/c", for p_shq is "".  For "sh" like  shells it is changed here to
  1562.      * "-c" and """, but not for DJGPP, because it starts the shell without
  1563.      * command.com.  And for Win32 we need to set p_sxq instead.
  1564.      */
  1565.     if (strstr((char *)p_sh, "sh") != NULL)
  1566.     {
  1567. int idx3;
  1568. idx3 = findoption((char_u *)"shcf");
  1569. if (!(options[idx3].flags & P_WAS_SET))
  1570. {
  1571.     p_shcf = (char_u *)"-c";
  1572.     options[idx3].def_val[VI_DEFAULT] = p_shcf;
  1573. }
  1574. # ifndef DJGPP
  1575. #  ifdef WIN32
  1576. /* Somehow Win32 requires the quotes around the redirection too */
  1577. idx3 = findoption((char_u *)"sxq");
  1578. if (!(options[idx3].flags & P_WAS_SET))
  1579. {
  1580.     p_sxq = (char_u *)""";
  1581.     options[idx3].def_val[VI_DEFAULT] = p_sxq;
  1582. }
  1583. #  else
  1584. idx3 = findoption((char_u *)"shq");
  1585. if (!(options[idx3].flags & P_WAS_SET))
  1586. {
  1587.     p_shq = (char_u *)""";
  1588.     options[idx3].def_val[VI_DEFAULT] = p_shq;
  1589. }
  1590. #  endif
  1591. # endif
  1592.     }
  1593. #endif
  1594.     set_title_defaults();
  1595. }
  1596. #ifdef USE_GUI
  1597. /*
  1598.  * Option initializations that can only be done after opening the GUI window.
  1599.  */
  1600.     void
  1601. init_gui_options()
  1602. {
  1603.     int     tt;
  1604.     /* Set the 'background' option according to the lightness of the
  1605.      * background color. */
  1606.     if (!option_was_set((char_u *)"bg")
  1607.        && gui_mch_get_lightness(gui.back_pixel) < 127)
  1608.     {
  1609. /* Full_screen must be TRUE to get the side effect of changing the
  1610.  * defaults for the highlighting.  Restore it just in case. */
  1611. tt = full_screen;
  1612. full_screen = TRUE;
  1613. set_option_value((char_u *)"bg", 0L, (char_u *)"dark");
  1614. highlight_changed();
  1615. full_screen = tt;
  1616.     }
  1617. }
  1618. #endif
  1619. /*
  1620.  * 'title' and 'icon' only default to true if they have not been set or reset
  1621.  * in .vimrc and we can read the old value.
  1622.  * When 'title' and 'icon' have been reset in .vimrc, we won't even check if
  1623.  * they can be reset.  This reduces startup time when using X on a remote
  1624.  * machine.
  1625.  */
  1626.     void
  1627. set_title_defaults()
  1628. {
  1629.     int     idx1;
  1630.     long    val;
  1631.     idx1 = findoption((char_u *)"title");
  1632.     if (!(options[idx1].flags & P_WAS_SET))
  1633.     {
  1634. val = ui_can_restore_title();
  1635. options[idx1].def_val[VI_DEFAULT] = (char_u *)val;
  1636. p_title = val;
  1637.     }
  1638.     idx1 = findoption((char_u *)"icon");
  1639.     if (!(options[idx1].flags & P_WAS_SET))
  1640.     {
  1641. val = ui_can_restore_icon();
  1642. options[idx1].def_val[VI_DEFAULT] = (char_u *)val;
  1643. p_icon = val;
  1644.     }
  1645. }
  1646. /*
  1647.  * Parse 'arg' for option settings.
  1648.  *
  1649.  * 'arg' may be IObuff, but only when no errors can be present and option
  1650.  * does not need to be expanded with option_expand().
  1651.  *
  1652.  * returns FAIL if an error is detected, OK otherwise
  1653.  */
  1654.     int
  1655. do_set(arg)
  1656.     char_u *arg; /* option string (may be written to!) */
  1657. {
  1658.     int opt_idx;
  1659.     char_u *errmsg;
  1660.     char_u errbuf[80];
  1661.     char_u *startarg;
  1662.     int prefix; /* 1: nothing, 0: "no", 2: "inv" in front of name */
  1663.     int nextchar;     /* next non-white char after option name */
  1664.     int afterchar;     /* character just after option name */
  1665.     int len;
  1666.     int i;
  1667.     long value;
  1668.     int key;
  1669.     int flags;     /* flags for current option */
  1670.     char_u *varp = NULL;     /* pointer to variable for current option */
  1671.     int did_show = FALSE;   /* already showed one value */
  1672.     int adding;     /* "opt+=arg" */
  1673.     int prepending;     /* "opt^=arg" */
  1674.     int removing;     /* "opt-=arg" */
  1675.     if (*arg == NUL)
  1676.     {
  1677. showoptions(0);
  1678. return OK;
  1679.     }
  1680.     while (*arg) /* loop to process all options */
  1681.     {
  1682. errmsg = NULL;
  1683. startarg = arg;     /* remember for error message */
  1684. if (STRNCMP(arg, "all", 3) == 0 && !isalpha(arg[3]))
  1685. {
  1686.     /*
  1687.      * ":set all"  show all options.
  1688.      * ":set all&" set all options to their default value.
  1689.      */
  1690.     arg += 3;
  1691.     if (*arg == '&')
  1692.     {
  1693. ++arg;
  1694. set_options_default(TRUE);
  1695.     }
  1696.     else
  1697. showoptions(1);
  1698. }
  1699. else if (STRNCMP(arg, "termcap", 7) == 0)
  1700. {
  1701.     showoptions(2);
  1702.     show_termcodes();
  1703.     arg += 7;
  1704. }
  1705. else
  1706. {
  1707.     prefix = 1;
  1708.     if (STRNCMP(arg, "no", 2) == 0)
  1709.     {
  1710. prefix = 0;
  1711. arg += 2;
  1712.     }
  1713.     else if (STRNCMP(arg, "inv", 3) == 0)
  1714.     {
  1715. prefix = 2;
  1716. arg += 3;
  1717.     }
  1718.     /* find end of name */
  1719.     key = 0;
  1720.     if (*arg == '<')
  1721.     {
  1722. opt_idx = -1;
  1723. /* look out for <t_>;> */
  1724. if (arg[1] == 't' && arg[2] == '_' && arg[3] && arg[4])
  1725.     len = 5;
  1726. else
  1727. {
  1728.     len = 1;
  1729.     while (arg[len] != NUL && arg[len] != '>')
  1730. ++len;
  1731. }
  1732. if (arg[len] != '>')
  1733. {
  1734.     errmsg = e_invarg;
  1735.     goto skip;
  1736. }
  1737. arg[len] = NUL;     /* put NUL after name */
  1738. if (arg[1] == 't' && arg[2] == '_') /* could be term code */
  1739.     opt_idx = findoption(arg + 1);
  1740. arg[len++] = '>';     /* restore '>' */
  1741. if (opt_idx == -1)
  1742.     key = find_key_option(arg + 1);
  1743.     }
  1744.     else
  1745.     {
  1746. len = 0;
  1747. /*
  1748.  * The two characters after "t_" may not be alphanumeric.
  1749.  */
  1750. if (arg[0] == 't' && arg[1] == '_' && arg[2] && arg[3])
  1751. {
  1752.     len = 4;
  1753. }
  1754. else
  1755. {
  1756.     while (isalnum(arg[len]) || arg[len] == '_')
  1757. ++len;
  1758. }
  1759. nextchar = arg[len];
  1760. arg[len] = NUL;     /* put NUL after name */
  1761. opt_idx = findoption(arg);
  1762. arg[len] = nextchar;     /* restore nextchar */
  1763. if (opt_idx == -1)
  1764.     key = find_key_option(arg);
  1765.     }
  1766.     if (opt_idx == -1 && key == 0) /* found a mismatch: skip */
  1767.     {
  1768. errmsg = (char_u *)"Unknown option";
  1769. goto skip;
  1770.     }
  1771.     if (opt_idx >= 0)
  1772.     {
  1773. if (options[opt_idx].var == NULL)   /* hidden option: skip */
  1774.     goto skip;
  1775. flags = options[opt_idx].flags;
  1776. varp = get_varp(&(options[opt_idx]));
  1777.     }
  1778.     else
  1779. flags = P_STRING;
  1780.     /* remember character after option name */
  1781.     afterchar = arg[len];
  1782.     /* skip white space, allow ":set ai  ?" */
  1783.     while (vim_iswhite(arg[len]))
  1784. ++len;
  1785.     adding = FALSE;
  1786.     prepending = FALSE;
  1787.     removing = FALSE;
  1788.     if (arg[len] == '+' && arg[len + 1] == '=')
  1789.     {
  1790. adding = TRUE; /* "+=" */
  1791. ++len;
  1792.     }
  1793.     else if (arg[len] == '^' && arg[len + 1] == '=')
  1794.     {
  1795. prepending = TRUE; /* "^=" */
  1796. ++len;
  1797.     }
  1798.     else if (arg[len] == '-' && arg[len + 1] == '=')
  1799.     {
  1800. removing = TRUE; /* "-=" */
  1801. ++len;
  1802.     }
  1803.     nextchar = arg[len];
  1804.     if (vim_strchr((char_u *)"?=:!&", nextchar) != NULL)
  1805.     {
  1806. arg += len;
  1807. len = 0;
  1808. if (vim_strchr((char_u *)"?!&", nextchar) != NULL
  1809. && arg[1] != NUL && !vim_iswhite(arg[1]))
  1810. {
  1811.     errmsg = e_trailing;
  1812.     goto skip;
  1813. }
  1814.     }
  1815.     /*
  1816.      * allow '=' and ':' as MSDOS command.com allows only one
  1817.      * '=' character per "set" command line. grrr. (jw)
  1818.      */
  1819.     if (nextchar == '?'
  1820.     || (prefix == 1
  1821. && vim_strchr((char_u *)"=:&", nextchar) == NULL
  1822. && !(flags & P_BOOL)))
  1823.     {
  1824. /*
  1825.  * print value
  1826.  */
  1827. if (did_show)
  1828.     msg_putchar('n');     /* cursor below last one */
  1829. else
  1830. {
  1831.     gotocmdline(TRUE);     /* cursor at status line */
  1832.     did_show = TRUE;     /* remember that we did a line */
  1833. }
  1834. if (opt_idx >= 0)
  1835.     showoneopt(&options[opt_idx]);
  1836. else
  1837. {
  1838.     char_u     name[2];
  1839.     char_u     *p;
  1840.     name[0] = KEY2TERMCAP0(key);
  1841.     name[1] = KEY2TERMCAP1(key);
  1842.     p = find_termcode(name);
  1843.     if (p == NULL)
  1844.     {
  1845. errmsg = (char_u *)"Unknown option";
  1846. goto skip;
  1847.     }
  1848.     else
  1849. (void)show_one_termcode(name, p, TRUE);
  1850. }
  1851. if (nextchar != '?'
  1852. && nextchar != NUL && !vim_iswhite(afterchar))
  1853.     errmsg = e_trailing;
  1854.     }
  1855.     else
  1856.     {
  1857. if (flags & P_BOOL)     /* boolean */
  1858. {
  1859.     if (nextchar == '=' || nextchar == ':')
  1860.     {
  1861. errmsg = e_invarg;
  1862. goto skip;
  1863.     }
  1864.     /*
  1865.      * ":set opt!": invert
  1866.      * ":set opt&": reset to default value
  1867.      */
  1868.     if (nextchar == '!')
  1869. value = *(int *)(varp) ^ 1;
  1870.     else if (nextchar == '&')
  1871.     {
  1872. /* Use a trick here to get the default value,
  1873.  * without setting the actual value yet. */
  1874. i = *(int *)varp;
  1875. set_option_default(opt_idx, FALSE);
  1876. value = *(int *)varp;
  1877. *(int *)varp = i;
  1878.     }
  1879.     else
  1880.     {
  1881. /*
  1882.  * ":set invopt": invert
  1883.  * ":set opt" or ":set noopt": set or reset
  1884.  */
  1885. if (nextchar != NUL && !vim_iswhite(afterchar))
  1886. {
  1887.     errmsg = e_trailing;
  1888.     goto skip;
  1889. }
  1890. if (prefix == 2) /* inv */
  1891.     value = *(int *)(varp) ^ 1;
  1892. else
  1893.     value = prefix;
  1894.     }
  1895.     errmsg = set_bool_option(opt_idx, varp, (int)value);
  1896. }
  1897. else     /* numeric or string */
  1898. {
  1899.     if (vim_strchr((char_u *)"=:&", nextchar) == NULL
  1900.        || prefix != 1)
  1901.     {
  1902. errmsg = e_invarg;
  1903. goto skip;
  1904.     }
  1905.     if (flags & P_NUM)     /* numeric */
  1906.     {
  1907. /*
  1908.  * Different ways to set a number option:
  1909.  * &     set to default value
  1910.  * <xx>     accept special key codes for 'wildchar'
  1911.  * c     accept any non-digit for 'wildchar'
  1912.  * [-]0-9   set number
  1913.  * other    error
  1914.  */
  1915. arg += len + 1;
  1916. if (nextchar == '&')
  1917. {
  1918.     long temp;
  1919.     /* Use a trick here to get the default value,
  1920.      * without setting the actual value yet. */
  1921.     temp = *(long *)varp;
  1922.     set_option_default(opt_idx, FALSE);
  1923.     value = *(long *)varp;
  1924.     *(long *)varp = temp;
  1925. }
  1926. else if (  (long *)varp == &p_wc
  1927. && (*arg == '<'
  1928.     || *arg == '^'
  1929.     || ((!arg[1] || vim_iswhite(arg[1]))
  1930. && !isdigit(*arg))))
  1931. {
  1932.     if (*arg == '<')
  1933. value = find_key_option(arg + 1);
  1934.     else if (*arg == '^')
  1935. value = arg[1] ^ 0x40;
  1936.     else
  1937. value = *arg;
  1938.     if (value == 0)
  1939.     {
  1940. errmsg = e_invarg;
  1941. goto skip;
  1942.     }
  1943. }
  1944. /* allow negative numbers (for 'undolevels') */
  1945. else if (*arg == '-' || isdigit(*arg))
  1946. {
  1947.     i = 0;
  1948.     if (*arg == '-')
  1949. i = 1;
  1950. #ifdef HAVE_STRTOL
  1951.     value = strtol((char *)arg, NULL, 0);
  1952.     if (arg[i] == '0' && TO_LOWER(arg[i + 1]) == 'x')
  1953. i += 2;
  1954. #else
  1955.     value = atol((char *)arg);
  1956. #endif
  1957.     while (isdigit(arg[i]))
  1958. ++i;
  1959.     if (arg[i] != NUL && !vim_iswhite(arg[i]))
  1960.     {
  1961. errmsg = e_invarg;
  1962. goto skip;
  1963.     }
  1964. }
  1965. else
  1966. {
  1967.     errmsg = (char_u *)"Number required after =";
  1968.     goto skip;
  1969. }
  1970. if (adding)
  1971.     value = *(long *)varp + value;
  1972. if (prepending)
  1973.     value = *(long *)varp * value;
  1974. if (removing)
  1975.     value = *(long *)varp - value;
  1976. errmsg = set_num_option(opt_idx, varp, value, errbuf);
  1977.     }
  1978.     else if (opt_idx >= 0)     /* string */
  1979.     {
  1980. char_u     *save_arg = NULL;
  1981. char_u     *s;
  1982. char_u     *oldval; /* previous value if *varp */
  1983. char_u     *newval;
  1984. unsigned    newlen;
  1985. int     comma;
  1986. int     new_value_alloced; /* new string option
  1987.    was allocated */
  1988. /* The old value is kept until we are sure that the new
  1989.  * value is valid.  set_option_default() is therefore
  1990.  * called with FALSE
  1991.  */
  1992. oldval = *(char_u **)(varp);
  1993. if (nextchar == '&')     /* set to default val */
  1994. {
  1995.     /* The old value will be freed in
  1996.      * did_set_string_option().  Don't change the
  1997.      * flags now, but do remember if the new value is
  1998.      * allocated. */
  1999.     set_option_default(opt_idx, FALSE);
  2000.     new_value_alloced =
  2001.  (options[opt_idx].flags & P_ALLOCED);
  2002.     options[opt_idx].flags = flags;
  2003. }
  2004. else
  2005. {
  2006.     arg += len + 1; /* jump to after the '=' or ':' */
  2007.     /*
  2008.      * Convert 'whichwrap' number to string, for
  2009.      * backwards compatibility with Vim 3.0.
  2010.      * Misuse errbuf[] for the resulting string.
  2011.      */
  2012.     if (varp == (char_u *)&p_ww && isdigit(*arg))
  2013.     {
  2014. *errbuf = NUL;
  2015. i = getdigits(&arg);
  2016. if (i & 1)
  2017.     STRCAT(errbuf, "b,");
  2018. if (i & 2)
  2019.     STRCAT(errbuf, "s,");
  2020. if (i & 4)
  2021.     STRCAT(errbuf, "h,l,");
  2022. if (i & 8)
  2023.     STRCAT(errbuf, "<,>,");
  2024. if (i & 16)
  2025.     STRCAT(errbuf, "[,],");
  2026. if (*errbuf != NUL) /* remove trailing , */
  2027.     errbuf[STRLEN(errbuf) - 1] = NUL;
  2028. save_arg = arg;
  2029. arg = errbuf;
  2030.     }
  2031.     /*
  2032.      * Remove '>' before 'dir' and 'bdir', for
  2033.      * backwards compatibility with version 3.0
  2034.      */
  2035.     else if (  *arg == '>'
  2036.     && (varp == (char_u *)&p_dir
  2037.     || varp == (char_u *)&p_bdir))
  2038.     {
  2039. ++arg;
  2040.     }
  2041.     /*
  2042.      * Copy the new string into allocated memory.
  2043.      * Can't use set_string_option_direct(), because
  2044.      * we need to remove the backslashes.
  2045.      */
  2046.     /* get a bit too much */
  2047.     newlen = STRLEN(arg) + 1;
  2048.     if (adding || prepending || removing)
  2049. newlen += STRLEN(oldval) + 1;
  2050.     newval = alloc(newlen);
  2051.     if (newval == NULL)  /* out of mem, don't change */
  2052. break;
  2053.     s = newval;
  2054.     /*
  2055.      * Copy the string, skip over escaped chars.
  2056.      * For MS-DOS and WIN32 backslashes before normal
  2057.      * file name characters are not removed.
  2058.      */
  2059.     while (*arg && !vim_iswhite(*arg))
  2060.     {
  2061. if (*arg == '\' && arg[1] != NUL
  2062. #ifdef BACKSLASH_IN_FILENAME
  2063. && !((flags & P_EXPAND)
  2064. && vim_isfilec(arg[1])
  2065. && arg[1] != '\')
  2066. #endif
  2067.     )
  2068.     ++arg;
  2069. *s++ = *arg++;
  2070.     }
  2071.     *s = NUL;
  2072.     /* concatenate the two strings; add a ',' if
  2073.      * needed */
  2074.     if (adding || prepending)
  2075.     {
  2076. comma = ((flags & P_COMMA) && *oldval);
  2077. if (adding)
  2078. {
  2079.     i = STRLEN(oldval);
  2080.     mch_memmove(newval + i + comma, newval,
  2081.   STRLEN(newval) + 1);
  2082.     mch_memmove(newval, oldval, (size_t)i);
  2083. }
  2084. else
  2085. {
  2086.     i = STRLEN(newval);
  2087.     mch_memmove(newval + i + comma, oldval,
  2088.   STRLEN(oldval) + 1);
  2089. }
  2090. if (comma)
  2091.     newval[i] = ',';
  2092.     }
  2093.     /* locate newval[] in oldval[] and remove it */
  2094.     if (removing)
  2095.     {
  2096. i = STRLEN(newval);
  2097. for (s = oldval; *s; ++s)
  2098. {
  2099.     if ((!(flags & P_COMMA)
  2100. || s == oldval
  2101. || s[-1] == ',')
  2102.     && STRNCMP(s, newval, i) == 0
  2103.     && (!(flags & P_COMMA)
  2104. || s[i] == ','
  2105. || s[i] == NUL))
  2106. break;
  2107. }
  2108. STRCPY(newval, oldval);
  2109. if (*s)
  2110. {
  2111.     /* may need to remove a comma */
  2112.     if (flags & P_COMMA)
  2113.     {
  2114. if (s == oldval)
  2115. {
  2116.     /* include comma after string */
  2117.     if (s[i] == ',')
  2118. ++i;
  2119. }
  2120. else
  2121. {
  2122.     /* include comma before string */
  2123.     --s;
  2124.     ++i;
  2125. }
  2126.     }
  2127.     mch_memmove(newval + (s - oldval), s + i,
  2128.    STRLEN(s + i) + 1);
  2129. }
  2130.     }
  2131.     *(char_u **)(varp) = newval;
  2132.     if (save_arg != NULL)   /* number for 'whichwrap' */
  2133. arg = save_arg;
  2134.     new_value_alloced = TRUE;
  2135. }
  2136. /* expand environment variables and ~ */
  2137. s = option_expand(opt_idx);
  2138. if (s != NULL)
  2139. {
  2140.     if (new_value_alloced)
  2141. vim_free(*(char_u **)(varp));
  2142.     *(char_u **)(varp) = s;
  2143.     new_value_alloced = TRUE;
  2144. }
  2145. errmsg = did_set_string_option(opt_idx, (char_u **)varp,
  2146.    new_value_alloced, oldval, errbuf);
  2147. /*
  2148.  * If error detected, print the error message.
  2149.  */
  2150. if (errmsg != NULL)
  2151.     goto skip;
  2152.     }
  2153.     else     /* key code option */
  2154.     {
  2155. char_u     name[2];
  2156. char_u     *p;
  2157. name[0] = KEY2TERMCAP0(key);
  2158. name[1] = KEY2TERMCAP1(key);
  2159. if (nextchar == '&')
  2160. {
  2161.     if (add_termcap_entry(name, TRUE) == FAIL)
  2162. errmsg = (char_u *)"Not found in termcap";
  2163. }
  2164. else
  2165. {
  2166.     arg += len + 1; /* jump to after the '=' or ':' */
  2167.     for(p = arg; *p && !vim_iswhite(*p); ++p)
  2168.     {
  2169. if (*p == '\' && *(p + 1))
  2170.     ++p;
  2171.     }
  2172.     nextchar = *p;
  2173.     *p = NUL;
  2174.     add_termcode(name, arg);
  2175.     *p = nextchar;
  2176. }
  2177. if (full_screen)
  2178.     ttest(FALSE);
  2179. redraw_all_later(CLEAR);
  2180.     }
  2181. }
  2182. if (opt_idx >= 0)
  2183.     options[opt_idx].flags |= P_WAS_SET;
  2184.     }
  2185. skip:
  2186.     /*
  2187.      * Advance to next argument.
  2188.      * - skip until a blank found, taking care of backslashes
  2189.      * - skip blanks
  2190.      */
  2191.     while (*arg != NUL && !vim_iswhite(*arg))
  2192. if (*arg++ == '\' && *arg != NUL)
  2193.     ++arg;
  2194. }
  2195. arg = skipwhite(arg);
  2196. if (errmsg)
  2197. {
  2198.     ++no_wait_return; /* wait_return done below */
  2199.     emsg(errmsg); /* show error highlighted */
  2200.     MSG_PUTS(": ");
  2201. /* show argument normal */
  2202.     while (startarg < arg)
  2203. msg_puts(transchar(*startarg++));
  2204.     msg_end(); /* check for scrolling */
  2205.     --no_wait_return;
  2206.     return FAIL;
  2207. }
  2208.     }
  2209.     return OK;
  2210. }
  2211.     static void
  2212. illegal_char(errbuf, c)
  2213.     char_u *errbuf;
  2214.     int c;
  2215. {
  2216.     sprintf((char *)errbuf, "Illegal character <%s>", (char *)transchar(c));
  2217. }
  2218. /*
  2219.  * When changing 'title', 'titlestring', 'icon' or 'iconstring', call
  2220.  * maketitle() to create and display it.
  2221.  * When switching the title or icon off, call mch_restore_title() to get
  2222.  * the old value back.
  2223.  */
  2224.     static void
  2225. did_set_title(icon)
  2226.     int     icon;     /* Did set icon instead of title */
  2227. {
  2228.     if (!starting
  2229. #ifdef USE_GUI
  2230.     && !gui.starting
  2231. #endif
  2232. )
  2233.     {
  2234. maketitle();
  2235. if (icon)
  2236. {
  2237.     if (!p_icon && *p_iconstring == NUL)
  2238. mch_restore_title(2);
  2239. }
  2240. else
  2241. {
  2242.     if (!p_title && *p_titlestring == NUL)
  2243. mch_restore_title(1);
  2244. }
  2245.     }
  2246. }
  2247. /*
  2248.  * set_options_bin -  called when 'bin' changes value.
  2249.  */
  2250.     void
  2251. set_options_bin(oldval, newval)
  2252.     int     oldval;
  2253.     int     newval;
  2254. {
  2255.     /*
  2256.      * The option values that are changed when 'bin' changes are
  2257.      * copied when 'bin is set and restored when 'bin' is reset.
  2258.      */
  2259.     if (newval)
  2260.     {
  2261. if (!oldval) /* switched on */
  2262. {
  2263.     curbuf->b_p_tw_nobin = curbuf->b_p_tw;
  2264.     curbuf->b_p_wm_nobin = curbuf->b_p_wm;
  2265.     curbuf->b_p_ml_nobin = curbuf->b_p_ml;
  2266.     curbuf->b_p_et_nobin = curbuf->b_p_et;
  2267. }
  2268. curbuf->b_p_tw = 0; /* no automatic line wrap */
  2269. curbuf->b_p_wm = 0; /* no automatic line wrap */
  2270. curbuf->b_p_ml = 0; /* no modelines */
  2271. curbuf->b_p_et = 0; /* no expandtab */
  2272.     }
  2273.     else if (oldval) /* switched off */
  2274.     {
  2275. curbuf->b_p_tw = curbuf->b_p_tw_nobin;
  2276. curbuf->b_p_wm = curbuf->b_p_wm_nobin;
  2277. curbuf->b_p_ml = curbuf->b_p_ml_nobin;
  2278. curbuf->b_p_et = curbuf->b_p_et_nobin;
  2279.     }
  2280. }
  2281. #ifdef VIMINFO
  2282. /*
  2283.  * Find the parameter represented by the given character (eg ', :, ", or /),
  2284.  * and return its associated value in the 'viminfo' string.
  2285.  * Only works for number parameters, not for 'r' or 'n'.
  2286.  * If the parameter is not specified in the string, return -1.
  2287.  */
  2288.     int
  2289. get_viminfo_parameter(type)
  2290.     int     type;
  2291. {
  2292.     char_u  *p;
  2293.     p = find_viminfo_parameter(type);
  2294.     if (p != NULL && isdigit(*p))
  2295. return atoi((char *)p);
  2296.     return -1;
  2297. }
  2298. /*
  2299.  * Find the parameter represented by the given character (eg ', :, ", or /) in
  2300.  * the 'viminfo' option and return a pointer to the string after it.
  2301.  * Return NULL if the parameter is not specified in the string.
  2302.  */
  2303.     char_u *
  2304. find_viminfo_parameter(type)
  2305.     int     type;
  2306. {
  2307.     char_u  *p;
  2308.     for (p = p_viminfo; *p; ++p)
  2309.     {
  2310. if (*p == type)
  2311.     return p + 1;
  2312. if (*p == 'n')     /* 'n' is always the last one */
  2313.     break;
  2314. p = vim_strchr(p, ',');     /* skip until next ',' */
  2315. if (p == NULL)     /* hit the end without finding parameter */
  2316.     break;
  2317.     }
  2318.     return NULL;
  2319. }
  2320. #endif
  2321. /*
  2322.  * Expand environment variables for some string options.
  2323.  * These string options cannot be indirect!
  2324.  * Return pointer to allocated memory, or NULL when not expanded.
  2325.  */
  2326.     static char_u *
  2327. option_expand(opt_idx)
  2328.     int     opt_idx;
  2329. {
  2330.     char_u *p;
  2331. /* if option doesn't need expansion or is hidden: nothing to do */
  2332.     if (!(options[opt_idx].flags & P_EXPAND) || options[opt_idx].var == NULL)
  2333. return NULL;
  2334.     p = *(char_u **)(options[opt_idx].var);
  2335.     /*
  2336.      * Expanding this with NameBuff, expand_env() must not be passed IObuff.
  2337.      */
  2338.     expand_env(p, NameBuff, MAXPATHL);
  2339.     if (STRCMP(NameBuff, p) == 0)   /* they are the same */
  2340. return NULL;
  2341.     return vim_strsave(NameBuff);
  2342. }
  2343. /*
  2344.  * Check for string options that are NULL (normally only termcap options).
  2345.  */
  2346.     void
  2347. check_options()
  2348. {
  2349.     int     opt_idx;
  2350.     char_u  **p;
  2351.     for (opt_idx = 0; options[opt_idx].fullname != NULL; opt_idx++)
  2352. if ((options[opt_idx].flags & P_STRING) && options[opt_idx].var != NULL)
  2353. {
  2354.     p = (char_u **)get_varp(&(options[opt_idx]));
  2355.     if (*p == NULL)
  2356. *p = empty_option;
  2357. }
  2358. }
  2359. /*
  2360.  * Check string options in a buffer for NULL value.
  2361.  */
  2362.     void
  2363. check_buf_options(buf)
  2364.     BUF     *buf;
  2365. {
  2366. #ifdef MULTI_BYTE
  2367.     if (buf->b_p_fe == NULL)
  2368. buf->b_p_fe = empty_option;
  2369. #endif
  2370.     if (buf->b_p_ff == NULL)
  2371. buf->b_p_ff = empty_option;
  2372.     if (buf->b_p_mps == NULL)
  2373. buf->b_p_mps = empty_option;
  2374.     if (buf->b_p_fo == NULL)
  2375. buf->b_p_fo = empty_option;
  2376.     if (buf->b_p_isk == NULL)
  2377. buf->b_p_isk = empty_option;
  2378.     if (buf->b_p_com == NULL)
  2379. buf->b_p_com = empty_option;
  2380.     if (buf->b_p_nf == NULL)
  2381. buf->b_p_nf = empty_option;
  2382. #ifdef SYNTAX_HL
  2383.     if (buf->b_p_syn == NULL)
  2384. buf->b_p_syn = empty_option;
  2385. #endif
  2386. #ifdef CINDENT
  2387.     if (buf->b_p_cink == NULL)
  2388. buf->b_p_cink = empty_option;
  2389.     if (buf->b_p_cino == NULL)
  2390. buf->b_p_cino = empty_option;
  2391. #endif
  2392. #ifdef WANT_FILETYPE
  2393.     if (buf->b_p_ft == NULL)
  2394. buf->b_p_ft = empty_option;
  2395. #endif
  2396. #if defined(SMARTINDENT) || defined(CINDENT)
  2397.     if (buf->b_p_cinw == NULL)
  2398. buf->b_p_cinw = empty_option;
  2399. #endif
  2400. #ifdef INSERT_EXPAND
  2401.     if (buf->b_p_cpt == NULL)
  2402. buf->b_p_cpt = empty_option;
  2403. #endif
  2404. }
  2405. /*
  2406.  * Free the string allocated for an option.
  2407.  * Checks for the string being empty_option. This may happen if we're out of
  2408.  * memory, vim_strsave() returned NULL, which was replaced by empty_option by
  2409.  * check_options().
  2410.  * Does NOT check for P_ALLOCED flag!
  2411.  */
  2412.     void
  2413. free_string_option(p)
  2414.     char_u *p;
  2415. {
  2416.     if (p != empty_option)
  2417. vim_free(p);
  2418. }
  2419. /*
  2420.  * Set a string option to a new value (without checking the effect).
  2421.  * The string is copied into allocated memory.
  2422.  * If 'dofree' is set, the old value may be freed.
  2423.  * if (opt_idx == -1) name is used, otherwise opt_idx is used.
  2424.  */
  2425.     void
  2426. set_string_option_direct(name, opt_idx, val, dofree)
  2427.     char_u  *name;
  2428.     int     opt_idx;
  2429.     char_u  *val;
  2430.     int     dofree;
  2431. {
  2432.     char_u  *s;
  2433.     char_u  **varp;
  2434.     if (opt_idx == -1) /* use name */
  2435.     {
  2436. opt_idx = findoption(name);
  2437. if (opt_idx == -1) /* not found (should not happen) */
  2438.     return;
  2439.     }
  2440.     if (options[opt_idx].var == NULL) /* can't set hidden option */
  2441. return;
  2442.     s = vim_strsave(val);
  2443.     if (s != NULL)
  2444.     {
  2445. varp = (char_u **)get_varp(&(options[opt_idx]));
  2446. if (dofree && (options[opt_idx].flags & P_ALLOCED))
  2447.     free_string_option(*varp);
  2448. *varp = s;
  2449. options[opt_idx].flags |= P_ALLOCED;
  2450.     }
  2451. }
  2452. /*
  2453.  * Set a string option to a new value, and handle the effects.
  2454.  */
  2455.     static void
  2456. set_string_option(opt_idx, value)
  2457.     int     opt_idx;
  2458.     char_u  *value;
  2459. {
  2460.     char_u  *s;
  2461.     char_u  **varp;
  2462.     char_u  *oldval;
  2463.     if (options[opt_idx].var == NULL) /* don't set hidden option */
  2464. return;
  2465.     s = vim_strsave(value);
  2466.     if (s != NULL)
  2467.     {
  2468. varp = (char_u **)get_varp(&(options[opt_idx]));
  2469. oldval = *varp;
  2470. *varp = s;
  2471. (void)did_set_string_option(opt_idx, varp, TRUE, oldval, NULL);
  2472.     }
  2473. }
  2474. /*
  2475.  * Handle string options that need some action to perform when changed.
  2476.  * Returns NULL for success, or an error message for an error.
  2477.  */
  2478.     static char_u *
  2479. did_set_string_option(opt_idx, varp, new_value_alloced, oldval, errbuf)
  2480.     int opt_idx; /* index in options[] table */
  2481.     char_u **varp; /* pointer to the option variable */
  2482.     int new_value_alloced; /* new value was allocated */
  2483.     char_u *oldval; /* previous value of the option */
  2484.     char_u *errbuf; /* buffer for errors, or NULL */
  2485. {
  2486.     char_u *errmsg = NULL;
  2487.     char_u *s, *p;
  2488.     int did_chartab = FALSE;