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

编辑器/阅读器

开发平台:

DOS

  1.     /* 'term' */
  2.     if (varp == &T_NAME)
  3.     {
  4. if (T_NAME[0] == NUL)
  5.     errmsg = (char_u *)"Cannot set 'term' to empty string";
  6. #ifdef USE_GUI
  7. if (gui.in_use)
  8.     errmsg = (char_u *)"Cannot change term in GUI";
  9. else if (term_is_gui(T_NAME))
  10.     errmsg = (char_u *)"Use ":gui" to start the GUI";
  11. #endif
  12. else if (set_termname(T_NAME) == FAIL)
  13.     errmsg = (char_u *)"Not found in termcap";
  14. else
  15. {
  16.     /* Screen colors may have changed. */
  17.     out_str(T_ME);
  18.     update_screen(CLEAR);
  19. }
  20.     }
  21.     /* 'backupext' and 'patchmode' */
  22.     else if ((varp == &p_bex || varp == &p_pm))
  23.     {
  24. if (STRCMP(*p_bex == '.' ? p_bex + 1 : p_bex,
  25.      *p_pm == '.' ? p_pm + 1 : p_pm) == 0)
  26.     errmsg = (char_u *)"'backupext' and 'patchmode' are equal";
  27.     }
  28.     /*
  29.      * 'isident', 'iskeyword', 'isprint or 'isfname' option: refill chartab[]
  30.      * If the new option is invalid, use old value.  'lisp' option: refill
  31.      * chartab[] for '-' char
  32.      */
  33.     else if (  varp == &p_isi
  34.     || varp == &(curbuf->b_p_isk)
  35.     || varp == &p_isp
  36.     || varp == &p_isf)
  37.     {
  38. if (init_chartab() == FAIL)
  39. {
  40.     did_chartab = TRUE;     /* need to restore it below */
  41.     errmsg = e_invarg;     /* error in value */
  42. }
  43.     }
  44.     /* 'highlight' */
  45.     else if (varp == &p_hl)
  46.     {
  47. if (highlight_changed() == FAIL)
  48.     errmsg = e_invarg; /* invalid flags */
  49.     }
  50.     /* 'nrformats' */
  51.     else if (varp == &(curbuf->b_p_nf))
  52.     {
  53. if (check_opt_strings(curbuf->b_p_nf, p_nf_values, TRUE) != OK)
  54.     errmsg = e_invarg;
  55.     }
  56.     /* 'sessionoptions' */
  57.     else if (varp == &(p_sessopt))
  58.     {
  59. if (check_opt_strings(p_sessopt, p_sessopt_values, TRUE) != OK)
  60.     errmsg = e_invarg;
  61.     }
  62.     /* 'background' */
  63.     else if (varp == &p_bg)
  64.     {
  65. if (check_opt_strings(p_bg, p_bg_values, FALSE) == OK)
  66. {
  67.     if (full_screen)
  68. init_highlight(FALSE);
  69. }
  70. else
  71.     errmsg = e_invarg;
  72.     }
  73.     /* 'wildmode' */
  74.     else if (varp == &p_wim)
  75.     {
  76. if (check_opt_wim() == FAIL)
  77.     errmsg = e_invarg;
  78.     }
  79. #if defined(USE_GUI_WIN32) || defined(USE_GUI_MOTIF)
  80.     /* 'winaltkeys' */
  81.     else if (varp == &p_wak)
  82.     {
  83. if (check_opt_strings(p_wak, p_wak_values, FALSE) != OK)
  84.     errmsg = e_invarg;
  85. # ifdef USE_GUI_MOTIF
  86. else if (gui.in_use)
  87.     gui_motif_set_mnemonics(p_wak[0] == 'y' || p_wak[0] == 'm');
  88. # endif
  89.     }
  90. #endif
  91. #ifdef AUTOCMD
  92.     /* 'eventignore' */
  93.     else if (varp == &p_ei)
  94.     {
  95. if (check_ei() == FAIL)
  96.     errmsg = e_invarg;
  97.     }
  98. #endif
  99. #ifdef MULTI_BYTE
  100.     /* 'fileencoding' */
  101.     else if (varp == &(curbuf->b_p_fe))
  102.     {
  103. if (check_opt_strings(curbuf->b_p_fe, p_fe_values, FALSE) != OK)
  104.     errmsg = e_invarg;
  105. else
  106. {
  107.     int is_dbcs_new;
  108.    /* set flags for various items */
  109.     is_dbcs_new = 0;
  110.     is_unicode = 0;
  111.     if (STRCMP(curbuf->b_p_fe, FE_DBJPN) == 0)
  112. is_dbcs_new = DBCS_JPN;
  113.     else if (STRCMP(curbuf->b_p_fe, FE_DBKOR) == 0)
  114. is_dbcs_new = DBCS_KOR;
  115.     else if (STRCMP(curbuf->b_p_fe, FE_DBCHT) == 0)
  116. is_dbcs_new = DBCS_CHT;
  117.     else if (STRCMP(curbuf->b_p_fe, FE_DBCHS) == 0)
  118. is_dbcs_new = DBCS_CHS;
  119.     else if (STRCMP(curbuf->b_p_fe, FE_UNICODE) == 0)
  120.     {
  121. is_unicode = 1;
  122.     }
  123.     /* if a DBCS locale, make sure it is valid */
  124. # ifdef USE_GUI_WIN32
  125.     if (is_dbcs_new)
  126.     {
  127. if (!IsValidCodePage(is_dbcs_new))
  128. {
  129.     errmsg = (char_u *)"Not a valid codepage";
  130. }
  131. else
  132. {
  133.     /* ok code page, so let's set is_dbcs and set pgm
  134.      * language
  135.      * */
  136.     is_dbcs = is_dbcs_new;
  137. }
  138.     }
  139.     else
  140. # endif
  141. is_dbcs = is_dbcs_new;
  142. # ifdef USE_GUI_WIN32
  143.     is_funky_dbcs = is_dbcs && ((int)GetACP() != is_dbcs);
  144. # endif
  145. # ifdef AUTOCMD
  146.     /* fire off an autocommand to let people do custom font setup,
  147.      * whatever */
  148.     if (errmsg == NULL)
  149. apply_autocmds(EVENT_FILEENCODING, NULL, (char_u *)"",
  150.        FALSE, curbuf);
  151. # endif
  152. }
  153.     }
  154. #endif /* MULTI_BYTE */
  155.     /* 'fileformat' */
  156.     else if (varp == &(curbuf->b_p_ff))
  157.     {
  158. if (check_opt_strings(curbuf->b_p_ff, p_ff_values, FALSE) != OK)
  159.     errmsg = e_invarg;
  160. else
  161. {
  162.     /* also change 'textmode' */
  163.     if (get_fileformat(curbuf) == EOL_DOS)
  164. curbuf->b_p_tx = TRUE;
  165.     else
  166. curbuf->b_p_tx = FALSE;
  167. }
  168.     }
  169.     /* 'fileformats' */
  170.     else if (varp == &p_ffs)
  171.     {
  172. if (check_opt_strings(p_ffs, p_ff_values, TRUE) != OK)
  173.     errmsg = e_invarg;
  174. else
  175. {
  176.     /* also change 'textauto' */
  177.     if (*p_ffs == NUL)
  178. p_ta = FALSE;
  179.     else
  180. p_ta = TRUE;
  181. }
  182.     }
  183.     /* 'matchpairs' */
  184.     else if (varp == &(curbuf->b_p_mps))
  185.     {
  186. /* Check for "x:y,x:y" */
  187. for (p = curbuf->b_p_mps; *p; p += 4)
  188. {
  189.     if (!p[0] || p[1] != ':' || !p[2] || (p[3] && p[3] != ','))
  190.     {
  191. errmsg = e_invarg;
  192. break;
  193.     }
  194.     if (!p[3])
  195. break;
  196. }
  197.     }
  198.     /* 'comments' */
  199.     else if (varp == &(curbuf->b_p_com))
  200.     {
  201. for (s = curbuf->b_p_com; *s; )
  202. {
  203.     while (*s && *s != ':')
  204.     {
  205. if (vim_strchr((char_u *)COM_ALL, *s) == NULL)
  206. {
  207.     errmsg = (char_u *)"Illegal flag";
  208.     break;
  209. }
  210. ++s;
  211.     }
  212.     if (*s++ == NUL)
  213. errmsg = (char_u *)"Missing colon";
  214.     else if (*s == ',' || *s == NUL)
  215. errmsg = (char_u *)"Zero length string";
  216.     if (errmsg != NULL)
  217. break;
  218.     while (*s && *s != ',')
  219.     {
  220. if (*s == '\' && s[1] != NUL)
  221.     ++s;
  222. ++s;
  223.     }
  224.     s = skip_to_option_part(s);
  225. }
  226.     }
  227.     /* 'listtabstring' */
  228.     else if (varp == &p_lcs)
  229.     {
  230. int round, i, len;
  231. /* first round: check for valid value, second round: assign values */
  232. for (round = 0; round <= 1 && errmsg == NULL; ++round)
  233. {
  234.     static struct lcstab
  235.     {
  236. int *lcsp;
  237. char *name;
  238.     } lcstab[] =
  239.     {
  240. {&lcs_eol, "eol"},
  241. {&lcs_ext, "extends"},
  242. {&lcs_tab2, "tab"},
  243. {&lcs_trail, "trail"},
  244.     };
  245.     if (round)
  246.     {
  247. for (i = 0; i < sizeof(lcstab) / sizeof(struct lcstab); ++i)
  248.     *(lcstab[i].lcsp) = NUL;
  249. lcs_tab1 = NUL;
  250.     }
  251.     p = p_lcs;
  252.     while (*p)
  253.     {
  254. for (i = 0; i < sizeof(lcstab) / sizeof(struct lcstab); ++i)
  255. {
  256.     len = STRLEN(lcstab[i].name);
  257.     if (STRNCMP(p, lcstab[i].name, len) == 0
  258.     && p[len] == ':'
  259.     && p[len + 1] != NUL)
  260.     {
  261. if (lcstab[i].lcsp == &lcs_tab2)
  262.     ++len;
  263. if (p[len + 1] != NUL
  264.     && (p[len + 2] == ',' || p[len + 2] == NUL))
  265. {
  266.     if (round)
  267.     {
  268. *(lcstab[i].lcsp) = p[len + 1];
  269. if (lcstab[i].lcsp == &lcs_tab2)
  270.     lcs_tab1 = p[len];
  271.     }
  272.     p += len + 2;
  273.     break;
  274. }
  275.     }
  276. }
  277. if (i == sizeof(lcstab) / sizeof(struct lcstab))
  278. {
  279.     errmsg = e_invarg;
  280.     break;
  281. }
  282. if (*p == ',')
  283.     ++p;
  284.     }
  285. }
  286.     }
  287. #ifdef VIMINFO
  288.     /* 'viminfo' */
  289.     else if (varp == &(p_viminfo))
  290.     {
  291. for (s = p_viminfo; *s;)
  292. {
  293.     /* Check it's a valid character */
  294.     if (vim_strchr((char_u *)""'%frn:/", *s) == NULL)
  295.     {
  296. if (errbuf != NULL)
  297. {
  298.     illegal_char(errbuf, *s);
  299.     errmsg = errbuf;
  300. }
  301. else
  302.     errmsg = (char_u *)"";
  303. break;
  304.     }
  305.     if (*s == 'n') /* name is always last one */
  306.     {
  307. break;
  308.     }
  309.     else if (*s == 'r') /* skip until next ',' */
  310.     {
  311. while (*++s && *s != ',')
  312.     ;
  313.     }
  314.     else if (*s == '%') /* no extra chars */
  315. ++s;
  316.     else     /* must have a number */
  317.     {
  318. while (isdigit(*++s))
  319.     ;
  320. if (!isdigit(*(s - 1)))
  321. {
  322.     if (errbuf != NULL)
  323.     {
  324. sprintf((char *)errbuf, "Missing number after <%s>",
  325.  transchar(*(s - 1)));
  326. errmsg = errbuf;
  327.     }
  328.     else
  329. errmsg = (char_u *)"";
  330.     break;
  331. }
  332.     }
  333.     s = skip_to_option_part(s);
  334. }
  335. if (*p_viminfo && errmsg == NULL && get_viminfo_parameter(''') < 0)
  336.     errmsg = (char_u *)"Must specify a ' value";
  337.     }
  338. #endif /* VIMINFO */
  339.     /* terminal options */
  340.     else if (istermoption(&options[opt_idx]) && full_screen)
  341.     {
  342. /* ":set t_Co=0" does ":set t_Co=" */
  343. if (varp == &T_CCO && atoi((char *)T_CCO) == 0)
  344. {
  345.     if (new_value_alloced)
  346. vim_free(T_CCO);
  347.     T_CCO = empty_option;
  348. }
  349. ttest(FALSE);
  350. if (varp == &T_ME)
  351. {
  352.     out_str(T_ME);
  353.     update_screen(CLEAR);
  354. }
  355.     }
  356.     /* 'showbreak' */
  357.     else if (varp == &p_sbr)
  358.     {
  359. for (s = p_sbr; *s; ++s)
  360.     if (charsize(*s) != 1)
  361. errmsg = (char_u *)"contains unprintable character";
  362.     }
  363. #ifdef USE_GUI
  364.     /* 'guifont' */
  365.     else if (varp == &p_guifont)
  366.     {
  367. if (gui.in_use && gui_init_font(p_guifont) != OK)
  368.     errmsg = (char_u *)"Cannot set font(s)";
  369.     }
  370. #endif
  371. #ifdef CURSOR_SHAPE
  372.     /* 'guicursor' */
  373.     else if (varp == &p_guicursor)
  374. errmsg = parse_guicursor();
  375. #endif
  376. #ifdef HAVE_LANGMAP
  377.     /* 'langmap' */
  378.     else if (varp == &p_langmap)
  379. langmap_set();
  380. #endif
  381.     /* 'breakat' */
  382.     else if (varp == &p_breakat)
  383. fill_breakat_flags();
  384.     /* 'titlestring' and 'iconstring' */
  385.     else if (varp == &p_titlestring)
  386. did_set_title(FALSE);
  387.     else if (varp == &p_iconstring)
  388. did_set_title(TRUE);
  389. #ifdef USE_GUI
  390.     /* 'guioptions' */
  391.     else if (varp == &p_guioptions)
  392. gui_init_which_components(oldval);
  393. #endif
  394. #if defined(USE_MOUSE) && defined(UNIX)
  395.     /* 'ttymouse' */
  396.     else if (varp == &p_ttym)
  397.     {
  398. # ifdef XTERM_MOUSE
  399. if (use_xterm_mouse())
  400.     set_mouse_termcode(KS_MOUSE, (char_u *)"33[M");
  401. else
  402.     del_mouse_termcode(KS_MOUSE);
  403. # endif
  404. # ifdef NETTERM_MOUSE
  405. /* can be added always, there is no conflict */
  406. set_mouse_termcode(KS_NETTERM_MOUSE, (char_u *)"33}");
  407. # endif
  408. # ifdef DEC_MOUSE
  409. /* conflicts with xterm mouse: "33[" and "33[M" */
  410. if (!use_xterm_mouse())
  411.     set_mouse_termcode(KS_DEC_MOUSE, (char_u *)"33[");
  412. else
  413.     del_mouse_termcode(KS_DEC_MOUSE);
  414. # endif
  415.     }
  416. #endif
  417.     /* 'selection' */
  418.     else if (varp == &p_sel)
  419.     {
  420. if (*p_sel == NUL
  421. || check_opt_strings(p_sel, p_sel_values, FALSE) != OK)
  422.     errmsg = e_invarg;
  423.     }
  424.     /* 'selectmode' */
  425.     else if (varp == &p_slm)
  426.     {
  427. if (check_opt_strings(p_slm, p_slm_values, TRUE) != OK)
  428.     errmsg = e_invarg;
  429.     }
  430.     /* 'browsedir' */
  431.     else if (varp == &p_bsdir)
  432.     {
  433. if (check_opt_strings(p_bsdir, p_bsdir_values, FALSE) != OK)
  434.     errmsg = e_invarg;
  435.     }
  436.     /* 'keymodel' */
  437.     else if (varp == &p_km)
  438.     {
  439. if (check_opt_strings(p_km, p_km_values, TRUE) != OK)
  440.     errmsg = e_invarg;
  441.     }
  442.     /* 'mousemodel' */
  443.     else if (varp == &p_mousem)
  444.     {
  445. if (check_opt_strings(p_mousem, p_mousem_values, FALSE) != OK)
  446.     errmsg = e_invarg;
  447.     }
  448. #ifdef SYNTAX_HL
  449.     /* When 'syntax' is set, load the syntax of that name */
  450.     else if (varp == &(curbuf->b_p_syn))
  451.     {
  452. p = alloc((unsigned)(STRLEN(curbuf->b_p_syn) + sizeof(SYNTAX_FNAME)));
  453. if (p != NULL)
  454. {
  455.     sprintf((char *)p, SYNTAX_FNAME, curbuf->b_p_syn);
  456.     if (do_source(p, FALSE, FALSE) == FAIL)
  457. errmsg = (char_u *)"syntax file not found";
  458.     vim_free(p);
  459. }
  460.     }
  461. #endif
  462.     /* Options that are a list of flags. */
  463.     else
  464.     {
  465. p = NULL;
  466. if (varp == &p_ww)
  467.     p = (char_u *)WW_ALL;
  468. if (varp == &p_shm)
  469.     p = (char_u *)SHM_ALL;
  470. else if (varp == &(p_cpo))
  471.     p = (char_u *)CPO_ALL;
  472. else if (varp == &(curbuf->b_p_fo))
  473.     p = (char_u *)FO_ALL;
  474. else if (varp == &p_mouse)
  475. {
  476. #ifdef USE_MOUSE
  477.     p = (char_u *)MOUSE_ALL;
  478. #else
  479.     if (*p_mouse != NUL)
  480. errmsg = (char_u *)"No mouse support";
  481. #endif
  482. }
  483. #if defined(USE_GUI) || defined(USE_CLIPBOARD)
  484. else if (varp == &p_guioptions)
  485.     p = (char_u *)GO_ALL;
  486. #endif
  487. if (p != NULL)
  488. {
  489.     for (s = *varp; *s; ++s)
  490. if (vim_strchr(p, *s) == NULL)
  491. {
  492.     if (errbuf != NULL)
  493.     {
  494. illegal_char(errbuf, *s);
  495. errmsg = errbuf;
  496.     }
  497.     else
  498. errmsg = (char_u *)"";
  499.     break;
  500. }
  501. }
  502.     }
  503.     /*
  504.      * If error detected, restore the previous value.
  505.      */
  506.     if (errmsg != NULL)
  507.     {
  508. if (new_value_alloced)
  509.     vim_free(*varp);
  510. *varp = oldval;
  511. /*
  512.  * When resetting some values, need to act on it.
  513.  */
  514. if (did_chartab)
  515.     (void)init_chartab();
  516. if (varp == &p_hl)
  517.     (void)highlight_changed();
  518.     }
  519.     else
  520.     {
  521. /*
  522.  * Free string options that are in allocated memory.
  523.  */
  524. if (options[opt_idx].flags & P_ALLOCED)
  525.     free_string_option(oldval);
  526. if (new_value_alloced)
  527.     options[opt_idx].flags |= P_ALLOCED;
  528. else
  529.     options[opt_idx].flags &= ~P_ALLOCED;
  530.     }
  531. #ifdef USE_MOUSE
  532.     if (varp == &p_mouse)
  533.     {
  534. if (*p_mouse == NUL)
  535.     mch_setmouse(FALSE);    /* switch mouse off */
  536. else
  537.     setmouse();     /* in case 'mouse' changed */
  538.     }
  539. #endif
  540.     curwin->w_set_curswant = TRUE;  /* in case 'showbreak' changed */
  541.     check_redraw(options[opt_idx].flags);
  542.     return errmsg;
  543. }
  544. /*
  545.  * Set the value of a boolean option, and take care of side effects.
  546.  * Returns NULL for success, or an error message for an error.
  547.  */
  548.     static char_u *
  549. set_bool_option(opt_idx, varp, value)
  550.     int     opt_idx;     /* index in options[] table */
  551.     char_u  *varp;     /* pointer to the option variable */
  552.     int     value;     /* new value */
  553. {
  554.     int     old_p_bin = curbuf->b_p_bin;    /* remember old 'bin' */
  555.     int     old_p_ea = p_ea;     /* remember old 'equalalways' */
  556.     int     old_p_wiv = p_wiv;     /* remember old 'weirdinvert' */
  557. #ifdef FKMAP
  558.     int     old_akm = p_altkeymap;     /* previous value if p_altkeymap*/
  559. #endif
  560.     /*
  561.      * in secure mode, setting of the secure option is not
  562.      * allowed
  563.      */
  564.     if (secure && (int *)varp == &p_secure)
  565. return (char_u *)"not allowed here";
  566. #ifdef USE_GUI
  567.     need_mouse_correct = TRUE;
  568. #endif
  569.     *(int *)varp = value;     /* set the new value */
  570.     /* handle the setting of the compatible option */
  571.     if ((int *)varp == &p_cp)
  572.     {
  573. compatible_set();
  574.     }
  575.     /* when 'readonly' is reset, also reset readonlymode */
  576.     else if ((int *)varp == &curbuf->b_p_ro && !curbuf->b_p_ro)
  577. readonlymode = FALSE;
  578.     /* when 'bin' is set also set some other options */
  579.     else if ((int *)varp == &curbuf->b_p_bin)
  580.     {
  581. set_options_bin(old_p_bin, curbuf->b_p_bin);
  582.     }
  583.     /* when 'swf' is set create swapfile, when reset remove swapfile */
  584.     else if ((int *)varp == &curbuf->b_p_swf)
  585.     {
  586. if (curbuf->b_p_swf && p_uc)
  587.     ml_open_file(curbuf); /* create the swap file */
  588. else
  589.     mf_close_file(curbuf); /* remove the swap file */
  590.     }
  591.     /* when 'terse' is set change 'shortmess' */
  592.     else if ((int *)varp == &p_terse)
  593.     {
  594. char_u *p;
  595. p = vim_strchr(p_shm, SHM_SEARCH);
  596. /* insert 's' in p_shm */
  597. if (p_terse && p == NULL)
  598. {
  599.     STRCPY(IObuff, p_shm);
  600.     STRCAT(IObuff, "s");
  601.     set_string_option_direct((char_u *)"shm", -1, IObuff, TRUE);
  602. }
  603. /* remove 's' from p_shm */
  604. else if (!p_terse && p != NULL)
  605.     mch_memmove(p, p + 1, STRLEN(p));
  606.     }
  607.     /* when 'paste' is set or reset also change other options */
  608.     else if ((int *)varp == &p_paste)
  609.     {
  610. paste_option_changed();
  611.     }
  612.     /* when 'ignorecase' is set or reset and 'hlsearch' is set, redraw */
  613.     else if ((int *)varp == &p_ic && p_hls)
  614.     {
  615. redraw_all_later(NOT_VALID);
  616.     }
  617. #ifdef EXTRA_SEARCH
  618.     /* when 'hlsearch' is set or reset reset no_hlsearch */
  619.     else if ((int *)varp == &p_hls)
  620.     {
  621. no_hlsearch = FALSE;
  622.     }
  623. #endif
  624.     /* when 'textmode' is set or reset also change 'fileformat' */
  625.     else if ((int *)varp == &curbuf->b_p_tx)
  626.     {
  627. set_fileformat(curbuf->b_p_tx ? EOL_DOS : EOL_UNIX);
  628.     }
  629.     /* when 'textauto' is set or reset also change 'fileformats' */
  630.     else if ((int *)varp == &p_ta)
  631.     {
  632. set_string_option_direct((char_u *)"ffs", -1,
  633.       p_ta ? (char_u *)FFS_DFLT : (char_u *)"", TRUE);
  634.     }
  635.     /*
  636.      * When 'lisp' option changes include/exclude '-' in
  637.      * keyword characters.
  638.      */
  639. #ifdef LISPINDENT
  640.     else if (varp == (char_u *)&(curbuf->b_p_lisp))
  641. init_chartab();     /* ignore errors */
  642. #endif
  643.     /* when 'title' changed, may need to change the title; same for 'icon' */
  644.     else if ((int *)varp == &p_title)
  645. did_set_title(FALSE);
  646.     else if ((int *)varp == &p_icon)
  647. did_set_title(TRUE);
  648.     else if ((int *)varp == &curbuf->b_changed)
  649.     {
  650. if (!value)
  651.     curbuf->b_start_ffc = *curbuf->b_p_ff;    /* Buffer is unchanged */
  652. #ifdef AUTOCMD
  653. modified_was_set = value;
  654. #endif
  655.     }
  656.     if (p_ea && !old_p_ea)
  657. win_equal(curwin, FALSE);
  658.     /*
  659.      * When 'weirdinvert' changed, set/reset 't_xs'.
  660.      * Then set 'weirdinvert' according to value of 't_xs'.
  661.      */
  662.     if (p_wiv && !old_p_wiv)
  663. T_XS = (char_u *)"y";
  664.     else if (!p_wiv && old_p_wiv)
  665. T_XS = empty_option;
  666.     p_wiv = (*T_XS != NUL);
  667. #ifdef FKMAP
  668.     /*
  669.      * In case some second language keymapping options have changed, check
  670.      * and correct the setting in a consistent way.
  671.      */
  672.     if (old_akm != p_altkeymap)
  673.     {
  674. if (!p_altkeymap)
  675. {
  676.     p_hkmap = p_fkmap;
  677.     p_fkmap = 0;
  678.     init_chartab();
  679. }
  680. else
  681. {
  682.     p_fkmap = p_hkmap;
  683.     p_hkmap = 0;
  684.     init_chartab();
  685. }
  686.     }
  687.     /*
  688.      * If hkmap set, reset Farsi keymapping.
  689.      */
  690.     if (p_hkmap && p_altkeymap)
  691.     {
  692. p_altkeymap = 0;
  693. p_fkmap = 0;
  694. init_chartab();
  695.     }
  696.     /*
  697.      * If fkmap set, reset Hebrew keymapping.
  698.      */
  699.     if (p_fkmap && !p_altkeymap)
  700.     {
  701. p_altkeymap = 1;
  702. p_hkmap = 0;
  703. init_chartab();
  704.     }
  705. #endif
  706.     options[opt_idx].flags |= P_WAS_SET;
  707.     comp_col();     /* in case 'ruler' or 'showcmd' changed */
  708.     curwin->w_set_curswant = TRUE;  /* in case 'list' changed */
  709.     check_redraw(options[opt_idx].flags);
  710.     return NULL;
  711. }
  712. /*
  713.  * Set the value of a number option, and take care of side effects.
  714.  * Returns NULL for success, or an error message for an error.
  715.  */
  716.     static char_u *
  717. set_num_option(opt_idx, varp, value, errbuf)
  718.     int     opt_idx;     /* index in options[] table */
  719.     char_u  *varp;     /* pointer to the option variable */
  720.     long    value;     /* new value */
  721.     char_u  *errbuf;     /* buffer for error messages */
  722. {
  723.     char_u  *errmsg = NULL;
  724.     long    old_Rows = Rows; /* remember old Rows */
  725.     long    old_Columns = Columns; /* remember old Columns */
  726.     long    old_p_ch = p_ch; /* remember old command line height */
  727.     long    old_p_uc = p_uc; /* remember old 'updatecount' */
  728.     long    old_titlelen = p_titlelen; /* remember old 'titlelen' */
  729. #ifdef USE_GUI
  730.     need_mouse_correct = TRUE;
  731. #endif
  732.     *(long *)varp = value;
  733.     /*
  734.      * Number options that need some action when changed
  735.      */
  736.     if ((long *)varp == &p_wh || (long *)varp == &p_hh)
  737.     {
  738. if (p_wh < 1)
  739. {
  740.     errmsg = e_positive;
  741.     p_wh = 1;
  742. }
  743. if (p_wmh > p_wh)
  744. {
  745.     errmsg = (char_u *)"'winheight' cannot be smaller than 'winminheight'";
  746.     p_wh = p_wmh;
  747. }
  748. if (p_hh < 0)
  749. {
  750.     errmsg = e_positive;
  751.     p_hh = 0;
  752. }
  753. /* Change window height NOW */
  754. if (lastwin != firstwin)
  755. {
  756.     if ((long *)varp == &p_wh && curwin->w_height < p_wh)
  757. win_setheight((int)p_wh);
  758.     if ((long *)varp == &p_hh && curbuf->b_help
  759.    && curwin->w_height < p_hh)
  760. win_setheight((int)p_hh);
  761. }
  762.     }
  763.     /* 'winminheight' */
  764.     else if ((long *)varp == &p_wmh)
  765.     {
  766. if (p_wmh < 0)
  767. {
  768.     errmsg = e_positive;
  769.     p_wh = 0;
  770. }
  771. if (p_wmh > p_wh)
  772. {
  773.     errmsg = (char_u *)"'winheight' cannot be smaller than 'winminheight'";
  774.     p_wmh = p_wh;
  775. }
  776. win_setminheight();
  777.     }
  778.     /* (re)set last window status line */
  779.     else if ((long *)varp == &p_ls)
  780.     {
  781. last_status();
  782.     }
  783.     /*
  784.      * Check the bounds for numeric options here
  785.      */
  786.     if (Rows < min_rows() && full_screen)
  787.     {
  788. if (errbuf != NULL)
  789. {
  790.     sprintf((char *)errbuf, "Need at least %d lines", min_rows());
  791.     errmsg = errbuf;
  792. }
  793. Rows = min_rows();
  794.     }
  795.     if (Columns < MIN_COLUMNS && full_screen)
  796.     {
  797. if (errbuf != NULL)
  798. {
  799.     sprintf((char *)errbuf, "Need at least %d columns", MIN_COLUMNS);
  800.     errmsg = errbuf;
  801. }
  802. Columns = MIN_COLUMNS;
  803.     }
  804.     /*
  805.      * If the screenheight has been changed, assume it is the physical
  806.      * screenheight.
  807.      */
  808.     if ((old_Rows != Rows || old_Columns != Columns) && full_screen)
  809.     {
  810. ui_set_winsize();     /* try to change the window size */
  811. check_winsize();     /* in case 'columns' changed */
  812. #ifdef MSDOS
  813. set_window();     /* active window may have changed */
  814. #endif
  815.     }
  816.     if (curbuf->b_p_sts < 0)
  817.     {
  818. errmsg = e_positive;
  819. curbuf->b_p_sts = 0;
  820.     }
  821.     if (curbuf->b_p_ts <= 0)
  822.     {
  823. errmsg = e_positive;
  824. curbuf->b_p_ts = 8;
  825.     }
  826.     if (curbuf->b_p_tw < 0)
  827.     {
  828. errmsg = e_positive;
  829. curbuf->b_p_tw = 0;
  830.     }
  831.     if (p_tm < 0)
  832.     {
  833. errmsg = e_positive;
  834. p_tm = 0;
  835.     }
  836.     if (p_titlelen <= 0)
  837.     {
  838. errmsg = e_positive;
  839. p_titlelen = 85;
  840.     }
  841.     if ((curwin->w_p_scroll <= 0
  842. || (curwin->w_p_scroll > curwin->w_height
  843.     && curwin->w_height > 0))
  844.     && full_screen)
  845.     {
  846. if (curwin->w_p_scroll != 0)
  847.     errmsg = e_scroll;
  848. win_comp_scroll(curwin);
  849.     }
  850.     if (p_report < 0)
  851.     {
  852. errmsg = e_positive;
  853. p_report = 1;
  854.     }
  855.     if ((p_sj < 0 || p_sj >= Rows) && full_screen)
  856.     {
  857. if (Rows != old_Rows)     /* Rows changed, just adjust p_sj */
  858.     p_sj = Rows / 2;
  859. else
  860. {
  861.     errmsg = e_scroll;
  862.     p_sj = 1;
  863. }
  864.     }
  865.     if (p_so < 0 && full_screen)
  866.     {
  867. errmsg = e_scroll;
  868. p_so = 0;
  869.     }
  870.     if (p_uc < 0)
  871.     {
  872. errmsg = e_positive;
  873. p_uc = 100;
  874.     }
  875.     if (p_ch < 1)
  876.     {
  877. errmsg = e_positive;
  878. p_ch = 1;
  879.     }
  880.     if (p_ut < 0)
  881.     {
  882. errmsg = e_positive;
  883. p_ut = 2000;
  884.     }
  885.     if (p_ss < 0)
  886.     {
  887. errmsg = e_positive;
  888. p_ss = 0;
  889.     }
  890.     /* when 'updatecount' changes from zero to non-zero, open swap files */
  891.     if (p_uc && !old_p_uc)
  892. ml_open_files();
  893.     /* if p_ch changed value, change the command line height */
  894.     if (p_ch != old_p_ch)
  895. command_height(old_p_ch);
  896.     /* if 'titlelen' has changed, redraw the title */
  897.     if (old_titlelen != p_titlelen && !starting)
  898. maketitle();
  899.     options[opt_idx].flags |= P_WAS_SET;
  900.     comp_col();     /* in case 'columns' or 'ls' changed */
  901.     curwin->w_set_curswant = TRUE;  /* in case 'tabstop' changed */
  902.     check_redraw(options[opt_idx].flags);
  903.     return errmsg;
  904. }
  905. /*
  906.  * Called after an option changed: check if something needs to be redrawn.
  907.  */
  908.     static void
  909. check_redraw(flags)
  910.     int     flags;
  911. {
  912.     if (flags & (P_RSTAT | P_RALL)) /* mark all status lines dirty */
  913. status_redraw_all();
  914.     if (flags & (P_RBUF | P_RALL))
  915.     {
  916. /* Update cursor position and botline (wrapping my have changed). */
  917. changed_line_abv_curs();
  918. invalidate_botline();
  919. update_topline();
  920.     }
  921.     if (flags & P_RBUF)
  922. redraw_curbuf_later(NOT_VALID);
  923.     if (flags & P_RALL)
  924. redraw_all_later(NOT_VALID);
  925. }
  926. /*
  927.  * Find index for option 'arg'.
  928.  * Return -1 if not found.
  929.  */
  930.     static int
  931. findoption(arg)
  932.     char_u *arg;
  933. {
  934.     int     opt_idx;
  935.     char     *s, *p;
  936.     static short    quick_tab[27] = {0, 0}; /* quick access table */
  937.     int     is_term_opt;
  938.     /*
  939.      * For first call: Initialize the quick-access table.
  940.      * It contains the index for the first option that starts with a certain
  941.      * letter.  There are 26 letters, plus the first "t_" option.
  942.      */
  943.     if (quick_tab[1] == 0)
  944.     {
  945. p = options[0].fullname;
  946. for (opt_idx = 1; (s = options[opt_idx].fullname) != NULL; opt_idx++)
  947. {
  948.     if (s[0] != p[0])
  949.     {
  950. if (s[0] == 't' && s[1] == '_')
  951.     quick_tab[26] = opt_idx;
  952. else
  953.     quick_tab[s[0] - 'a'] = opt_idx;
  954.     }
  955.     p = s;
  956. }
  957.     }
  958.     /*
  959.      * Check for name starting with an illegal character.
  960.      */
  961.     if (arg[0] < 'a' || arg[0] > 'z')
  962. return -1;
  963.     is_term_opt = (arg[0] == 't' && arg[1] == '_');
  964.     if (is_term_opt)
  965. opt_idx = quick_tab[26];
  966.     else
  967. opt_idx = quick_tab[arg[0] - 'a'];
  968.     for ( ; (s = options[opt_idx].fullname) != NULL; opt_idx++)
  969.     {
  970. if (STRCMP(arg, s) == 0)     /* match full name */
  971.     break;
  972.     }
  973.     if (s == NULL && !is_term_opt)
  974.     {
  975. opt_idx = quick_tab[arg[0] - 'a'];
  976. for ( ; options[opt_idx].fullname != NULL; opt_idx++)
  977. {
  978.     s = options[opt_idx].shortname;
  979.     if (s != NULL && STRCMP(arg, s) == 0)   /* match short name */
  980. break;
  981.     s = NULL;
  982. }
  983.     }
  984.     if (s == NULL)
  985. opt_idx = -1;
  986.     return opt_idx;
  987. }
  988. /*
  989.  * Get the value for an option.
  990.  *
  991.  * Returns:
  992.  * Number or Toggle option: 1, *numval gets value.
  993.  *      String option: 0, *stringval gets allocated string.
  994.  *     unknown option: -1.
  995.  */
  996.     int
  997. get_option_value(name, numval, stringval)
  998.     char_u *name;
  999.     long *numval;
  1000.     char_u **stringval;     /* NULL when only checking existance */
  1001. {
  1002.     int     opt_idx;
  1003.     char_u  *varp;
  1004.     opt_idx = findoption(name);
  1005.     if (opt_idx < 0)     /* unknown option */
  1006. return -1;
  1007.     varp = get_varp(&(options[opt_idx]));
  1008.     if (varp == NULL)     /* hidden option */
  1009. return -1;
  1010.     if (options[opt_idx].flags & P_STRING)
  1011.     {
  1012. if (stringval != NULL)
  1013.     *stringval = vim_strsave(*(char_u **)(varp));
  1014. return 0;
  1015.     }
  1016.     if (options[opt_idx].flags & P_NUM)
  1017. *numval = *(long *)varp;
  1018.     else
  1019. *numval = *(int *)varp;
  1020.     return 1;
  1021. }
  1022. /*
  1023.  * Set the value of option "name".
  1024.  * Use "string" for string options, use "number" for other options.
  1025.  */
  1026.     void
  1027. set_option_value(name, number, string)
  1028.     char_u *name;
  1029.     long number;
  1030.     char_u *string;
  1031. {
  1032.     int     opt_idx;
  1033.     char_u  *varp;
  1034.     opt_idx = findoption(name);
  1035.     if (opt_idx == -1)
  1036. EMSG2("Unknown option: %s", name);
  1037.     else if (options[opt_idx].flags & P_STRING)
  1038. set_string_option(opt_idx, string);
  1039.     else
  1040.     {
  1041. varp = get_varp(&options[opt_idx]);
  1042. if (varp != NULL) /* hidden option is not changed */
  1043. {
  1044.     if (options[opt_idx].flags & P_NUM)
  1045. (void)set_num_option(opt_idx, varp, number, NULL);
  1046.     else
  1047. (void)set_bool_option(opt_idx, varp, (int)number);
  1048. }
  1049.     }
  1050. }
  1051. /*
  1052.  * Get the terminal code for a terminal option.
  1053.  * Returns NULL when not found.
  1054.  */
  1055.     char_u *
  1056. get_term_code(tname)
  1057.     char_u *tname;
  1058. {
  1059.     int     opt_idx;
  1060.     char_u  *varp;
  1061.     if (tname[0] != 't' || tname[1] != '_' ||
  1062.     tname[2] == NUL || tname[3] == NUL)
  1063. return NULL;
  1064.     if ((opt_idx = findoption(tname)) >= 0)
  1065.     {
  1066. varp = get_varp(&(options[opt_idx]));
  1067. if (varp != NULL)
  1068.     varp = *(char_u **)(varp);
  1069. return varp;
  1070.     }
  1071.     return find_termcode(tname + 2);
  1072. }
  1073.     char_u *
  1074. get_highlight_default()
  1075. {
  1076.     int i;
  1077.     i = findoption((char_u *)"hl");
  1078.     if (i >= 0)
  1079. return options[i].def_val[VI_DEFAULT];
  1080.     return (char_u *)NULL;
  1081. }
  1082. /*
  1083.  * Translate a string like "t_xx", "<t_xx>" or "<S-Tab>" to a key number.
  1084.  */
  1085.     static int
  1086. find_key_option(arg)
  1087.     char_u *arg;
  1088. {
  1089.     int key;
  1090.     int modifiers;
  1091.     /*
  1092.      * Don't use get_special_key_code() for t_xx, we don't want it to call
  1093.      * add_termcap_entry().
  1094.      */
  1095.     if (arg[0] == 't' && arg[1] == '_' && arg[2] && arg[3])
  1096. key = TERMCAP2KEY(arg[2], arg[3]);
  1097.     else
  1098.     {
  1099. --arg;     /* put arg at the '<' */
  1100. key = find_special_key(&arg, &modifiers, TRUE);
  1101. if (modifiers)     /* can't handle modifiers here */
  1102.     key = 0;
  1103.     }
  1104.     return key;
  1105. }
  1106. /*
  1107.  * if 'all' == 0: show changed options
  1108.  * if 'all' == 1: show all normal options
  1109.  * if 'all' == 2: show all terminal options
  1110.  */
  1111.     static void
  1112. showoptions(all)
  1113.     int all;
  1114. {
  1115.     struct vimoption   *p;
  1116.     int     col;
  1117.     int     isterm;
  1118.     char_u     *varp;
  1119.     struct vimoption **items;
  1120.     int     item_count;
  1121.     int     run;
  1122.     int     row, rows;
  1123.     int     cols;
  1124.     int     i;
  1125.     int     len;
  1126. #define INC 20
  1127. #define GAP 3
  1128.     items = (struct vimoption **)alloc((unsigned)(sizeof(struct vimoption *) *
  1129. PARAM_COUNT));
  1130.     if (items == NULL)
  1131. return;
  1132.     /* Highlight title */
  1133.     if (all == 2)
  1134. MSG_PUTS_TITLE("n--- Terminal codes ---");
  1135.     else
  1136. MSG_PUTS_TITLE("n--- Options ---");
  1137.     /*
  1138.      * do the loop two times:
  1139.      * 1. display the short items
  1140.      * 2. display the long items (only strings and numbers)
  1141.      */
  1142.     for (run = 1; run <= 2 && !got_int; ++run)
  1143.     {
  1144. /*
  1145.  * collect the items in items[]
  1146.  */
  1147. item_count = 0;
  1148. for (p = &options[0]; p->fullname != NULL; p++)
  1149. {
  1150.     isterm = istermoption(p);
  1151.     varp = get_varp(p);
  1152.     if (varp != NULL && (
  1153. (all == 2 && isterm) ||
  1154. (all == 1 && !isterm) ||
  1155. (all == 0 && option_not_default(p))))
  1156.     {
  1157. if (p->flags & P_BOOL)
  1158.     len = 1; /* a toggle option fits always */
  1159. else
  1160. {
  1161.     option_value2string(p);
  1162.     len = STRLEN(p->fullname) + vim_strsize(NameBuff) + 1;
  1163. }
  1164. if ((len <= INC - GAP && run == 1) ||
  1165. (len > INC - GAP && run == 2))
  1166.     items[item_count++] = p;
  1167.     }
  1168. }
  1169. /*
  1170.  * display the items
  1171.  */
  1172. if (run == 1)
  1173. {
  1174.     cols = (Columns + GAP - 3) / INC;
  1175.     if (cols == 0)
  1176. cols = 1;
  1177.     rows = (item_count + cols - 1) / cols;
  1178. }
  1179. else /* run == 2 */
  1180.     rows = item_count;
  1181. for (row = 0; row < rows && !got_int; ++row)
  1182. {
  1183.     msg_putchar('n'); /* go to next line */
  1184.     if (got_int) /* 'q' typed in more */
  1185. break;
  1186.     col = 0;
  1187.     for (i = row; i < item_count; i += rows)
  1188.     {
  1189. msg_col = col; /* make columns */
  1190. showoneopt(items[i]);
  1191. col += INC;
  1192.     }
  1193.     out_flush();
  1194.     ui_breakcheck();
  1195. }
  1196.     }
  1197.     vim_free(items);
  1198. }
  1199. /*
  1200.  * Return TRUE if option is different from the default value
  1201.  */
  1202.     static int
  1203. option_not_default(p)
  1204.     struct vimoption *p;
  1205. {
  1206.     char_u  *varp;
  1207.     int     dvi;
  1208.     varp = get_varp(p);
  1209.     if (varp == NULL)
  1210. return FALSE; /* hidden option is never changed */
  1211.     if ((p->flags & P_VI_DEF) || p_cp)
  1212. dvi = VI_DEFAULT;
  1213.     else
  1214. dvi = VIM_DEFAULT;
  1215.     if (p->flags & P_NUM)
  1216. return (*(long *)varp != (long)p->def_val[dvi]);
  1217.     if (p->flags & P_BOOL)
  1218. /* the cast to long is required for Manx C */
  1219. return (*(int *)varp != (int)(long)p->def_val[dvi]);
  1220.     /* P_STRING */
  1221.     return STRCMP(*(char_u **)varp, p->def_val[dvi]);
  1222. }
  1223. /*
  1224.  * showoneopt: show the value of one option
  1225.  * must not be called with a hidden option!
  1226.  */
  1227.     static void
  1228. showoneopt(p)
  1229.     struct vimoption *p;
  1230. {
  1231.     char_u     *varp;
  1232.     varp = get_varp(p);
  1233.     if ((p->flags & P_BOOL) && !*(int *)varp)
  1234. MSG_PUTS("no");
  1235.     else
  1236. MSG_PUTS("  ");
  1237.     MSG_PUTS(p->fullname);
  1238.     if (!(p->flags & P_BOOL))
  1239.     {
  1240. msg_putchar('=');
  1241. option_value2string(p);     /* put string of option value in NameBuff */
  1242. msg_outtrans(NameBuff);
  1243.     }
  1244. }
  1245. /*
  1246.  * Write modified options as set command to a file.
  1247.  * Return FAIL on error, OK otherwise.
  1248.  */
  1249.     int
  1250. makeset(fd)
  1251.     FILE *fd;
  1252. {
  1253.     struct vimoption *p;
  1254.     char_u     *s;
  1255.     int     e;
  1256.     char_u     *varp;
  1257.     /*
  1258.      * The options that don't have a default (terminal name, columns, lines)
  1259.      * are never written. Terminal options are also not written.
  1260.      */
  1261.     for (p = &options[0]; !istermoption(p); p++)
  1262. if (!(p->flags & P_NO_MKRC) && !istermoption(p)
  1263.    && (option_not_default(p)))
  1264. {
  1265.     varp = get_varp(p);
  1266.     if (p->flags & P_BOOL)
  1267. fprintf(fd, "set %s%s", *(int *)(varp) ? "" : "no",
  1268.  p->fullname);
  1269.     else if (p->flags & P_NUM)
  1270. fprintf(fd, "set %s=%ld", p->fullname, *(long *)(varp));
  1271.     else    /* P_STRING */
  1272.     {
  1273. fprintf(fd, "set %s=", p->fullname);
  1274. s = *(char_u **)(varp);
  1275. /* some characters have to be escaped with CTRL-V or
  1276.  * backslash */
  1277. if (s != NULL && putescstr(fd, s, TRUE) == FAIL)
  1278.     return FAIL;
  1279.     }
  1280. #ifdef USE_CRNL
  1281.     putc('r', fd);
  1282. #endif
  1283. /*
  1284.  * Only check error for this putc, should catch at least
  1285.  * the "disk full" situation.
  1286.  */
  1287.     e = putc('n', fd);
  1288.     if (e < 0)
  1289. return FAIL;
  1290. }
  1291.     return OK;
  1292. }
  1293. /*
  1294.  * Clear all the terminal options.
  1295.  * If the option has been allocated, free the memory.
  1296.  * Terminal options are never hidden or indirect.
  1297.  */
  1298.     void
  1299. clear_termoptions()
  1300. {
  1301.     struct vimoption   *p;
  1302.     /*
  1303.      * Reset a few things before clearing the old options. This may cause
  1304.      * outputting a few things that the terminal doesn't understand, but the
  1305.      * screen will be cleared later, so this is OK.
  1306.      */
  1307. #ifdef USE_MOUSE
  1308.     mch_setmouse(FALSE);     /* switch mouse off */
  1309. #endif
  1310.     mch_restore_title(3);     /* restore window titles */
  1311. #ifdef WIN32
  1312.     /*
  1313.      * Check if this is allowed now.
  1314.      */
  1315.     if (can_end_termcap_mode(FALSE) == TRUE)
  1316. #endif
  1317. stoptermcap(); /* stop termcap mode */
  1318.     for (p = &options[0]; p->fullname != NULL; p++)
  1319. if (istermoption(p))
  1320. {
  1321.     if (p->flags & P_ALLOCED)
  1322. free_string_option(*(char_u **)(p->var));
  1323.     if (p->flags & P_DEF_ALLOCED)
  1324. free_string_option(p->def_val[VI_DEFAULT]);
  1325.     *(char_u **)(p->var) = empty_option;
  1326.     p->def_val[VI_DEFAULT] = empty_option;
  1327.     p->flags &= ~(P_ALLOCED|P_DEF_ALLOCED);
  1328. }
  1329.     clear_termcodes();
  1330. }
  1331. /*
  1332.  * Set the terminal option defaults to the current value.
  1333.  * Used after setting the terminal name.
  1334.  */
  1335.     void
  1336. set_term_defaults()
  1337. {
  1338.     struct vimoption   *p;
  1339.     for (p = &options[0]; p->fullname != NULL; p++)
  1340. if (istermoption(p) && p->def_val[VI_DEFAULT] != *(char_u **)(p->var))
  1341. {
  1342.     if (p->flags & P_DEF_ALLOCED)
  1343.     {
  1344. free_string_option(p->def_val[VI_DEFAULT]);
  1345. p->flags &= ~P_DEF_ALLOCED;
  1346.     }
  1347.     p->def_val[VI_DEFAULT] = *(char_u **)(p->var);
  1348.     if (p->flags & P_ALLOCED)
  1349.     {
  1350. p->flags |= P_DEF_ALLOCED;
  1351. p->flags &= ~P_ALLOCED;     /* don't free the value now */
  1352.     }
  1353. }
  1354. }
  1355. /*
  1356.  * return TRUE if 'p' starts with 't_'
  1357.  */
  1358.     static int
  1359. istermoption(p)
  1360.     struct vimoption *p;
  1361. {
  1362.     return (p->fullname[0] == 't' && p->fullname[1] == '_');
  1363. }
  1364. /*
  1365.  * Compute columns for ruler and shown command. 'sc_col' is also used to
  1366.  * decide what the maximum length of a message on the status line can be.
  1367.  * If there is a status line for the last window, 'sc_col' is independent
  1368.  * of 'ru_col'.
  1369.  */
  1370. #define COL_RULER 17     /* columns needed by ruler */
  1371.     void
  1372. comp_col()
  1373. {
  1374.     int last_has_status = (p_ls == 2 || (p_ls == 1 && firstwin != lastwin));
  1375.     sc_col = 0;
  1376.     ru_col = 0;
  1377.     if (p_ru)
  1378.     {
  1379. ru_col = COL_RULER + 1;
  1380. /* no last status line, adjust sc_col */
  1381. if (!last_has_status)
  1382.     sc_col = ru_col;
  1383.     }
  1384.     if (p_sc)
  1385.     {
  1386. sc_col += SHOWCMD_COLS;
  1387. if (!p_ru || last_has_status)     /* no need for separating space */
  1388.     ++sc_col;
  1389.     }
  1390.     sc_col = Columns - sc_col;
  1391.     ru_col = Columns - ru_col;
  1392.     if (sc_col <= 0) /* screen too narrow, will become a mess */
  1393. sc_col = 1;
  1394.     if (ru_col <= 0)
  1395. ru_col = 1;
  1396. }
  1397.     static char_u *
  1398. get_varp(p)
  1399.     struct vimoption *p;
  1400. {
  1401.     if (!(p->flags & P_IND) || p->var == NULL)
  1402. return p->var;
  1403.     switch ((long)(p->var))
  1404.     {
  1405. case PV_LIST: return (char_u *)&(curwin->w_p_list);
  1406. case PV_NU: return (char_u *)&(curwin->w_p_nu);
  1407. #ifdef RIGHTLEFT
  1408. case PV_RL: return (char_u *)&(curwin->w_p_rl);
  1409. #endif
  1410. case PV_SCROLL: return (char_u *)&(curwin->w_p_scroll);
  1411. case PV_WRAP: return (char_u *)&(curwin->w_p_wrap);
  1412. case PV_LBR: return (char_u *)&(curwin->w_p_lbr);
  1413. case PV_AI: return (char_u *)&(curbuf->b_p_ai);
  1414. case PV_BIN: return (char_u *)&(curbuf->b_p_bin);
  1415. #ifdef CINDENT
  1416. case PV_CIN: return (char_u *)&(curbuf->b_p_cin);
  1417. case PV_CINK: return (char_u *)&(curbuf->b_p_cink);
  1418. case PV_CINO: return (char_u *)&(curbuf->b_p_cino);
  1419. #endif
  1420. #if defined(SMARTINDENT) || defined(CINDENT)
  1421. case PV_CINW: return (char_u *)&(curbuf->b_p_cinw);
  1422. #endif
  1423. case PV_COM: return (char_u *)&(curbuf->b_p_com);
  1424. #ifdef INSERT_EXPAND
  1425. case PV_CPT: return (char_u *)&(curbuf->b_p_cpt);
  1426. #endif
  1427. case PV_EOL: return (char_u *)&(curbuf->b_p_eol);
  1428. case PV_ET: return (char_u *)&(curbuf->b_p_et);
  1429. #ifdef MULTI_BYTE
  1430. case PV_FE: return (char_u *)&(curbuf->b_p_fe);
  1431. #endif
  1432. case PV_FF: return (char_u *)&(curbuf->b_p_ff);
  1433. #ifdef WANT_FILETYPE
  1434. case PV_FT: return (char_u *)&(curbuf->b_p_ft);
  1435. #endif
  1436. case PV_FO: return (char_u *)&(curbuf->b_p_fo);
  1437. case PV_INF: return (char_u *)&(curbuf->b_p_inf);
  1438. case PV_ISK: return (char_u *)&(curbuf->b_p_isk);
  1439. case PV_LISP: return (char_u *)&(curbuf->b_p_lisp);
  1440. case PV_ML: return (char_u *)&(curbuf->b_p_ml);
  1441. case PV_MPS: return (char_u *)&(curbuf->b_p_mps);
  1442. case PV_MOD: return (char_u *)&(curbuf->b_changed);
  1443. case PV_NF: return (char_u *)&(curbuf->b_p_nf);
  1444. case PV_RO: return (char_u *)&(curbuf->b_p_ro);
  1445. #ifdef SMARTINDENT
  1446. case PV_SI: return (char_u *)&(curbuf->b_p_si);
  1447. #endif
  1448. #ifndef SHORT_FNAME
  1449. case PV_SN: return (char_u *)&(curbuf->b_p_sn);
  1450. #endif
  1451. case PV_STS: return (char_u *)&(curbuf->b_p_sts);
  1452. case PV_SWF: return (char_u *)&(curbuf->b_p_swf);
  1453. #ifdef SYNTAX_HL
  1454. case PV_SYN: return (char_u *)&(curbuf->b_p_syn);
  1455. #endif
  1456. case PV_SW: return (char_u *)&(curbuf->b_p_sw);
  1457. case PV_TS: return (char_u *)&(curbuf->b_p_ts);
  1458. case PV_TW: return (char_u *)&(curbuf->b_p_tw);
  1459. case PV_TX: return (char_u *)&(curbuf->b_p_tx);
  1460. case PV_WM: return (char_u *)&(curbuf->b_p_wm);
  1461. default: EMSG("get_varp ERROR");
  1462.     }
  1463.     /* always return a valid pointer to avoid a crash! */
  1464.     return (char_u *)&(curbuf->b_p_wm);
  1465. }
  1466. /*
  1467.  * Copy options from one window to another.
  1468.  * Used when creating a new window.
  1469.  * The 'scroll' option is not copied, because it depends on the window height.
  1470.  */
  1471.     void
  1472. win_copy_options(wp_from, wp_to)
  1473.     WIN     *wp_from;
  1474.     WIN     *wp_to;
  1475. {
  1476.     wp_to->w_p_list = wp_from->w_p_list;
  1477.     wp_to->w_p_nu = wp_from->w_p_nu;
  1478. #ifdef RIGHTLEFT
  1479.     wp_to->w_p_rl = wp_from->w_p_rl;
  1480. # ifdef FKMAP
  1481.     wp_to->w_p_pers = wp_from->w_p_pers;
  1482. # endif
  1483. #endif
  1484.     wp_to->w_p_wrap = wp_from->w_p_wrap;
  1485.     wp_to->w_p_lbr = wp_from->w_p_lbr;
  1486. }
  1487. /*
  1488.  * Copy options from one buffer to another.
  1489.  * Used when creating a new buffer and sometimes when entering a buffer.
  1490.  * flags:
  1491.  * BCO_ENTER We will enter the bp_to buffer.
  1492.  * BCO_ALWAYS Always copy the options, but only set b_p_initialized when
  1493.  * appropriate.
  1494.  * BCO_NOHELP Don't copy the help settings.
  1495.  */
  1496.     void
  1497. buf_copy_options(bp_from, bp_to, flags)
  1498.     BUF     *bp_from;
  1499.     BUF     *bp_to;
  1500.     int     flags;
  1501. {
  1502.     int     should_copy = TRUE;
  1503.     char_u  *save_p_isk = NULL;     /* init for GCC */
  1504.     /*
  1505.      * Don't do anything of the "to" buffer is invalid.
  1506.      */
  1507.     if (bp_to == NULL || !buf_valid(bp_to))
  1508. return;
  1509.     /*
  1510.      * Only copy if the "from" buffer is valid and "to" and "from" are
  1511.      * different.
  1512.      */
  1513.     if (bp_from != NULL && buf_valid(bp_from) && bp_from != bp_to)
  1514.     {
  1515. /*
  1516.  * Always copy when entering and 'cpo' contains 'S'.
  1517.  * Don't copy when already initialized.
  1518.  * Don't copy when 'cpo' contains 's' and not entering.
  1519.  * 'S' BCO_ENTER  initialized 's'  should_copy
  1520.  * yes   yes        X  X TRUE
  1521.  * yes   no       yes  X FALSE
  1522.  * no    X       yes  X FALSE
  1523.  *  X   no       no yes FALSE
  1524.  *  X   no       no no TRUE
  1525.  * no   yes       no  X TRUE
  1526.  */
  1527. if ((vim_strchr(p_cpo, CPO_BUFOPTGLOB) == NULL || !(flags & BCO_ENTER))
  1528. && (bp_to->b_p_initialized
  1529.     || (!(flags & BCO_ENTER)
  1530. && vim_strchr(p_cpo, CPO_BUFOPT) != NULL)))
  1531.     should_copy = FALSE;
  1532. if (should_copy || (flags & BCO_ALWAYS))
  1533. {
  1534.     if ((flags & BCO_NOHELP)) /* don't free b_p_isk */
  1535.     {
  1536. save_p_isk = bp_to->b_p_isk;
  1537. bp_to->b_p_isk = NULL;
  1538.     }
  1539.     /*
  1540.      * Always free the allocated strings.
  1541.      * If not already initialized, set 'readonly' and copy 'fileformat'.
  1542.      */
  1543.     if (!bp_to->b_p_initialized)
  1544.     {
  1545. free_buf_options(bp_to, TRUE);
  1546. bp_to->b_p_ro = FALSE; /* don't copy readonly */
  1547. bp_to->b_p_tx = bp_from->b_p_tx;
  1548. bp_to->b_p_ff = vim_strsave(bp_from->b_p_ff);
  1549. #ifdef MULTI_BYTE
  1550. bp_to->b_p_fe = vim_strsave(bp_from->b_p_fe);
  1551. #endif
  1552.     }
  1553.     else
  1554. free_buf_options(bp_to, FALSE);
  1555.     bp_to->b_p_ai = bp_from->b_p_ai;
  1556.     bp_to->b_p_ai_save = bp_from->b_p_ai_save;
  1557.     bp_to->b_p_sw = bp_from->b_p_sw;
  1558.     bp_to->b_p_tw = bp_from->b_p_tw;
  1559.     bp_to->b_p_tw_save = bp_from->b_p_tw_save;
  1560.     bp_to->b_p_tw_nobin = bp_from->b_p_tw_nobin;
  1561.     bp_to->b_p_wm = bp_from->b_p_wm;
  1562.     bp_to->b_p_wm_save = bp_from->b_p_wm_save;
  1563.     bp_to->b_p_wm_nobin = bp_from->b_p_wm_nobin;
  1564.     bp_to->b_p_bin = bp_from->b_p_bin;
  1565.     bp_to->b_p_et = bp_from->b_p_et;
  1566.     bp_to->b_p_et_nobin = bp_from->b_p_et_nobin;
  1567.     bp_to->b_p_ml = bp_from->b_p_ml;
  1568.     bp_to->b_p_ml_nobin = bp_from->b_p_ml_nobin;
  1569.     bp_to->b_p_inf = bp_from->b_p_inf;
  1570.     bp_to->b_p_swf = bp_from->b_p_swf;
  1571. #ifdef INSERT_EXPAND
  1572.     bp_to->b_p_cpt = vim_strsave(bp_from->b_p_cpt);
  1573. #endif
  1574.     bp_to->b_p_sts = bp_from->b_p_sts;
  1575. #ifndef SHORT_FNAME
  1576.     bp_to->b_p_sn = bp_from->b_p_sn;
  1577. #endif
  1578.     bp_to->b_p_com = vim_strsave(bp_from->b_p_com);
  1579.     bp_to->b_p_fo = vim_strsave(bp_from->b_p_fo);
  1580.     bp_to->b_p_nf = vim_strsave(bp_from->b_p_nf);
  1581.     bp_to->b_p_mps = vim_strsave(bp_from->b_p_mps);
  1582. #ifdef SMARTINDENT
  1583.     bp_to->b_p_si = bp_from->b_p_si;
  1584.     bp_to->b_p_si_save = bp_from->b_p_si_save;
  1585. #endif
  1586. #ifdef CINDENT
  1587.     bp_to->b_p_cin = bp_from->b_p_cin;
  1588.     bp_to->b_p_cin_save = bp_from->b_p_cin_save;
  1589.     bp_to->b_p_cink = vim_strsave(bp_from->b_p_cink);
  1590.     bp_to->b_p_cino = vim_strsave(bp_from->b_p_cino);
  1591. #endif
  1592. #ifdef WANT_FILETYPE
  1593.     bp_to->b_p_ft = vim_strsave(bp_from->b_p_ft);
  1594. #endif
  1595. #if defined(SMARTINDENT) || defined(CINDENT)
  1596.     bp_to->b_p_cinw = vim_strsave(bp_from->b_p_cinw);
  1597. #endif
  1598. #ifdef LISPINDENT
  1599.     bp_to->b_p_lisp = bp_from->b_p_lisp;
  1600.     bp_to->b_p_lisp_save = bp_from->b_p_lisp_save;
  1601. #endif
  1602. #ifdef SYNTAX_HL
  1603.     bp_to->b_p_syn = vim_strsave(bp_from->b_p_syn);
  1604. #endif
  1605.     /*
  1606.      * Don't copy the options set by do_help(), use the saved values
  1607.      * Don't touch these at all when BCO_NOHELP is used.
  1608.      */
  1609.     if ((flags & BCO_NOHELP))
  1610. bp_to->b_p_isk = save_p_isk;
  1611.     else
  1612.     {
  1613. if (!keep_help_flag && bp_from->b_help && !bp_to->b_help
  1614.      && help_save_isk != NULL)
  1615. {
  1616.     bp_to->b_p_isk = vim_strsave(help_save_isk);
  1617.     if (bp_to->b_p_isk != NULL)
  1618. init_chartab();
  1619.     bp_to->b_p_ts = help_save_ts;
  1620.     bp_to->b_help = FALSE;
  1621. }
  1622. else
  1623. {
  1624.     bp_to->b_p_isk = vim_strsave(bp_from->b_p_isk);
  1625.     mch_memmove(bp_to->b_chartab, bp_from->b_chartab,
  1626.  (size_t)256);
  1627.     bp_to->b_p_ts = bp_from->b_p_ts;
  1628.     bp_to->b_help = bp_from->b_help;
  1629. }
  1630.     }
  1631. }
  1632. /*
  1633.  * When the options should be copied (ignoring BCO_ALWAYS), set the
  1634.  * flag that indicates that the options have been initialized.
  1635.  */
  1636. if (should_copy)
  1637.     bp_to->b_p_initialized = TRUE;
  1638.     }
  1639.     check_buf_options(bp_to);     /* make sure we don't have NULLs */
  1640. }
  1641. static int expand_option_idx = -1;
  1642. static char_u expand_option_name[5] = {'t', '_', NUL, NUL, NUL};
  1643.     void
  1644. set_context_in_set_cmd(arg)
  1645.     char_u *arg;
  1646. {
  1647.     int nextchar;
  1648.     int flags = 0; /* init for GCC */
  1649.     int opt_idx = 0; /* init for GCC */
  1650.     char_u *p;
  1651.     char_u *s;
  1652.     char_u *after_blank = NULL;
  1653.     int is_term_option = FALSE;
  1654.     int key;
  1655.     expand_context = EXPAND_SETTINGS;
  1656.     if (*arg == NUL)
  1657.     {
  1658. expand_pattern = arg;
  1659. return;
  1660.     }
  1661.     p = arg + STRLEN(arg) - 1;
  1662.     if (*p == ' ' && *(p - 1) != '\')
  1663.     {
  1664. expand_pattern = p + 1;
  1665. return;
  1666.     }
  1667.     while (p > arg)
  1668.     {
  1669. s = p;
  1670. /* count number of backslashes before ' ' or ',' */
  1671. if (*p == ' ' || *p == ',')
  1672. {
  1673.     while (s > arg && *(s - 1) == '\')
  1674. --s;
  1675. }
  1676. /* break at a space with an even number of backslashes */
  1677. if (*p == ' ' && ((p - s) & 1) == 0)
  1678. {
  1679.     ++p;
  1680.     break;
  1681. }
  1682. /* remember possible start of file name to expand */
  1683. if (after_blank == NULL
  1684. && ((*p == ' ' && (p - s) < 2)
  1685.     || (*p == ',' && p == s)))
  1686.     after_blank = p + 1;
  1687. --p;
  1688.     }
  1689.     if (STRNCMP(p, "no", 2) == 0)
  1690.     {
  1691. expand_context = EXPAND_BOOL_SETTINGS;
  1692. p += 2;
  1693.     }
  1694.     if (STRNCMP(p, "inv", 3) == 0)
  1695.     {
  1696. expand_context = EXPAND_BOOL_SETTINGS;
  1697. p += 3;
  1698.     }
  1699.     expand_pattern = arg = p;
  1700.     if (*arg == '<')
  1701.     {
  1702. while (*p != '>')
  1703.     if (*p++ == NUL)     /* expand terminal option name */
  1704. return;
  1705. key = get_special_key_code(arg + 1);
  1706. if (key == 0)     /* unknown name */
  1707. {
  1708.     expand_context = EXPAND_NOTHING;
  1709.     return;
  1710. }
  1711. nextchar = *++p;
  1712. is_term_option = TRUE;
  1713. expand_option_name[2] = KEY2TERMCAP0(key);
  1714. expand_option_name[3] = KEY2TERMCAP1(key);
  1715.     }
  1716.     else
  1717.     {
  1718. if (p[0] == 't' && p[1] == '_')
  1719. {
  1720.     p += 2;
  1721.     if (*p != NUL)
  1722. ++p;
  1723.     if (*p == NUL)
  1724. return; /* expand option name */
  1725.     nextchar = *++p;
  1726.     is_term_option = TRUE;
  1727.     expand_option_name[2] = p[-2];
  1728.     expand_option_name[3] = p[-1];
  1729. }
  1730. else
  1731. {
  1732.     while (isalnum(*p) || *p == '_' || *p == '*')   /* Allow * wildcard */
  1733. p++;
  1734.     if (*p == NUL)
  1735. return;
  1736.     nextchar = *p;
  1737.     *p = NUL;
  1738.     opt_idx = findoption(arg);
  1739.     *p = nextchar;
  1740.     if (opt_idx == -1 || options[opt_idx].var == NULL)
  1741.     {
  1742. expand_context = EXPAND_NOTHING;
  1743. return;
  1744.     }
  1745.     flags = options[opt_idx].flags;
  1746.     if (flags & P_BOOL)
  1747.     {
  1748. expand_context = EXPAND_NOTHING;
  1749. return;
  1750.     }
  1751. }
  1752.     }
  1753.     if ((nextchar != '=' && nextchar != ':')
  1754.     || expand_context == EXPAND_BOOL_SETTINGS)
  1755.     {
  1756. expand_context = EXPAND_UNSUCCESSFUL;
  1757. return;
  1758.     }
  1759.     if (expand_context != EXPAND_BOOL_SETTINGS && p[1] == NUL)
  1760.     {
  1761. expand_context = EXPAND_OLD_SETTING;
  1762. if (is_term_option)
  1763.     expand_option_idx = -1;
  1764. else
  1765.     expand_option_idx = opt_idx;
  1766. expand_pattern = p + 1;
  1767. return;
  1768.     }
  1769.     expand_context = EXPAND_NOTHING;
  1770.     if (is_term_option || (flags & P_NUM))
  1771. return;
  1772.     if (after_blank != NULL)
  1773. expand_pattern = after_blank;
  1774.     else
  1775. expand_pattern = p + 1;
  1776.     if (flags & P_EXPAND)
  1777.     {
  1778. p = options[opt_idx].var;
  1779. if (p == (char_u *)&p_bdir || p == (char_u *)&p_dir ||
  1780.        p == (char_u *)&p_path)
  1781. {
  1782.     expand_context = EXPAND_DIRECTORIES;
  1783.     if (p == (char_u *)&p_path)
  1784. expand_set_path = TRUE;
  1785. }
  1786. else
  1787.     expand_context = EXPAND_FILES;
  1788.     }
  1789.     return;
  1790. }
  1791.     int
  1792. ExpandSettings(prog, num_file, file)
  1793.     vim_regexp *prog;
  1794.     int *num_file;
  1795.     char_u ***file;
  1796. {
  1797.     int num_normal = 0;     /* Number of matching non-term-code settings */
  1798.     int num_term = 0;     /* Number of matching terminal code settings */
  1799.     int opt_idx;
  1800.     int match;
  1801.     int count = 0;
  1802.     char_u *str;
  1803.     int loop;
  1804.     int is_term_opt;
  1805.     char_u  name_buf[MAX_KEY_NAME_LEN];
  1806.     int save_reg_ic;
  1807.     /* do this loop twice:
  1808.      * loop == 0: count the number of matching options
  1809.      * loop == 1: copy the matching options into allocated memory
  1810.      */
  1811.     for (loop = 0; loop <= 1; ++loop)
  1812.     {
  1813. if (expand_context != EXPAND_BOOL_SETTINGS)
  1814. {
  1815.     if (vim_regexec(prog, (char_u *)"all", TRUE))
  1816.     {
  1817. if (loop == 0)
  1818.     num_normal++;
  1819. else
  1820.     (*file)[count++] = vim_strsave((char_u *)"all");
  1821.     }
  1822.     if (vim_regexec(prog, (char_u *)"termcap", TRUE))
  1823.     {
  1824. if (loop == 0)
  1825.     num_normal++;
  1826. else
  1827.     (*file)[count++] = vim_strsave((char_u *)"termcap");
  1828.     }
  1829. }
  1830. for (opt_idx = 0; (str = (char_u *)options[opt_idx].fullname) != NULL;
  1831.     opt_idx++)
  1832. {
  1833.     if (options[opt_idx].var == NULL)
  1834. continue;
  1835.     if (expand_context == EXPAND_BOOL_SETTINGS
  1836.       && !(options[opt_idx].flags & P_BOOL))
  1837. continue;
  1838.     is_term_opt = istermoption(&options[opt_idx]);
  1839.     if (is_term_opt && num_normal > 0)
  1840. continue;
  1841.     match = FALSE;
  1842.     if (vim_regexec(prog, str, TRUE) ||
  1843. (options[opt_idx].shortname != NULL &&
  1844.  vim_regexec(prog,
  1845.  (char_u *)options[opt_idx].shortname, TRUE)))
  1846. match = TRUE;
  1847.     else if (is_term_opt)
  1848.     {
  1849. name_buf[0] = '<';
  1850. name_buf[1] = 't';
  1851. name_buf[2] = '_';
  1852. name_buf[3] = str[2];
  1853. name_buf[4] = str[3];
  1854. name_buf[5] = '>';
  1855. name_buf[6] = NUL;
  1856. if (vim_regexec(prog, name_buf, TRUE))
  1857. {
  1858.     match = TRUE;
  1859.     str = name_buf;
  1860. }
  1861.     }
  1862.     if (match)
  1863.     {
  1864. if (loop == 0)
  1865. {
  1866.     if (is_term_opt)
  1867. num_term++;
  1868.     else
  1869. num_normal++;
  1870. }
  1871. else
  1872.     (*file)[count++] = vim_strsave(str);
  1873.     }
  1874. }
  1875. /*
  1876.  * Check terminal key codes, these are not in the option table
  1877.  */
  1878. if (expand_context != EXPAND_BOOL_SETTINGS  && num_normal == 0)
  1879. {
  1880.     for (opt_idx = 0; (str = get_termcode(opt_idx)) != NULL; opt_idx++)
  1881.     {
  1882. if (!isprint(str[0]) || !isprint(str[1]))
  1883.     continue;
  1884. name_buf[0] = 't';
  1885. name_buf[1] = '_';
  1886. name_buf[2] = str[0];
  1887. name_buf[3] = str[1];
  1888. name_buf[4] = NUL;
  1889. match = FALSE;
  1890. if (vim_regexec(prog, name_buf, TRUE))
  1891.     match = TRUE;
  1892. else
  1893. {
  1894.     name_buf[0] = '<';
  1895.     name_buf[1] = 't';
  1896.     name_buf[2] = '_';
  1897.     name_buf[3] = str[0];
  1898.     name_buf[4] = str[1];
  1899.     name_buf[5] = '>';
  1900.     name_buf[6] = NUL;
  1901.     if (vim_regexec(prog, name_buf, TRUE))
  1902. match = TRUE;
  1903. }
  1904. if (match)
  1905. {
  1906.     if (loop == 0)
  1907. num_term++;
  1908.     else
  1909. (*file)[count++] = vim_strsave(name_buf);
  1910. }
  1911.     }
  1912.     /*
  1913.      * Check special key names.
  1914.      */
  1915.     for (opt_idx = 0; (str = get_key_name(opt_idx)) != NULL; opt_idx++)
  1916.     {
  1917. name_buf[0] = '<';
  1918. STRCPY(name_buf + 1, str);
  1919. STRCAT(name_buf, ">");
  1920. save_reg_ic = reg_ic;
  1921. reg_ic = TRUE; /* ignore case here */
  1922. if (vim_regexec(prog, name_buf, TRUE))
  1923. {
  1924.     if (loop == 0)
  1925. num_term++;
  1926.     else
  1927. (*file)[count++] = vim_strsave(name_buf);
  1928. }
  1929. reg_ic = save_reg_ic;
  1930.     }
  1931. }
  1932. if (loop == 0)
  1933. {
  1934.     if (num_normal > 0)
  1935. *num_file = num_normal;
  1936.     else if (num_term > 0)
  1937. *num_file = num_term;
  1938.     else
  1939. return OK;
  1940.     *file = (char_u **) alloc((unsigned)(*num_file * sizeof(char_u *)));
  1941.     if (*file == NULL)
  1942.     {
  1943. *file = (char_u **)"";
  1944. return FAIL;
  1945.     }
  1946. }
  1947.     }
  1948.     return OK;
  1949. }
  1950.     int
  1951. ExpandOldSetting(num_file, file)
  1952.     int     *num_file;
  1953.     char_u  ***file;
  1954. {
  1955.     char_u  *var = NULL; /* init for GCC */
  1956.     char_u  *buf;
  1957.     *num_file = 0;
  1958.     *file = (char_u **)alloc((unsigned)sizeof(char_u *));
  1959.     if (*file == NULL)
  1960. return FAIL;
  1961.     /*
  1962.      * For a terminal key code expand_option_idx is < 0.
  1963.      */
  1964.     if (expand_option_idx < 0)
  1965.     {
  1966. var = find_termcode(expand_option_name + 2);
  1967. if (var == NULL)
  1968.     expand_option_idx = findoption(expand_option_name);
  1969.     }
  1970.     if (expand_option_idx >= 0)
  1971.     {
  1972. /* put string of option value in NameBuff */
  1973. option_value2string(&options[expand_option_idx]);
  1974. var = NameBuff;
  1975.     }
  1976.     else if (var == NULL)
  1977. var = (char_u *)"";
  1978.     /* A backslash is required before some characters */
  1979.     buf = vim_strsave_escaped(var, escape_chars);
  1980.     if (buf == NULL)
  1981.     {
  1982. vim_free(*file);
  1983. *file = NULL;
  1984. return FAIL;
  1985.     }
  1986.     *file[0] = buf;
  1987.     *num_file = 1;
  1988.     return OK;
  1989. }
  1990. /*
  1991.  * Get the value for the numeric or string option *opp in a nice format into
  1992.  * NameBuff[].  Must not be called with a hidden option!
  1993.  */
  1994.     static void
  1995. option_value2string(opp)
  1996.     struct vimoption *opp;
  1997. {
  1998.     char_u  *varp;
  1999.     varp = get_varp(opp);
  2000.     if (opp->flags & P_NUM)
  2001.     {
  2002. if ((long *)varp == &p_wc)
  2003. {
  2004.     if (IS_SPECIAL(p_wc) || find_special_key_in_table((int)p_wc) >= 0)
  2005. STRCPY(NameBuff, get_special_key_name((int)p_wc, 0));
  2006.     else
  2007. STRCPY(NameBuff, transchar((int)p_wc));
  2008. }
  2009. else
  2010.     sprintf((char *)NameBuff, "%ld", *(long *)varp);
  2011.     }
  2012.     else    /* P_STRING */
  2013.     {
  2014. varp = *(char_u **)(varp);
  2015. if (varp == NULL)     /* just in case */
  2016.     NameBuff[0] = NUL;
  2017. else if (opp->flags & P_EXPAND)
  2018.     home_replace(NULL, varp, NameBuff, MAXPATHL, FALSE);
  2019. else
  2020.     STRNCPY(NameBuff, varp, MAXPATHL);
  2021.     }
  2022. }
  2023. #ifdef HAVE_LANGMAP
  2024. /*
  2025.  * Any character has an equivalent character.  This is used for keyboards that
  2026.  * have a special language mode that sends characters above 128 (although
  2027.  * other characters can be translated too).
  2028.  */
  2029. /*
  2030.  * char_u langmap_mapchar[256];
  2031.  * Normally maps each of the 128 upper chars to an <128 ascii char; used to
  2032.  * "translate" native lang chars in normal mode or some cases of
  2033.  * insert mode without having to tediously switch lang mode back&forth.
  2034.  */
  2035.     static void
  2036. langmap_init()
  2037. {
  2038.     int i;
  2039.     for (i = 0; i < 256; i++) /* we init with a-one-to one map */
  2040. langmap_mapchar[i] = i;
  2041. }
  2042. /*
  2043.  * Called when langmap option is set; the language map can be
  2044.  * changed at any time!
  2045.  */
  2046.     static void
  2047. langmap_set()
  2048. {
  2049.     char_u  *p;
  2050.     char_u  *p2;
  2051.     int     from, to;
  2052.     langmap_init();     /* back to one-to-one map first */
  2053.     for (p = p_langmap; p[0]; )
  2054.     {
  2055. for (p2 = p; p2[0] && p2[0] != ',' && p2[0] != ';'; ++p2)
  2056.     if (p2[0] == '\' && p2[1])
  2057. ++p2;
  2058. if (p2[0] == ';')
  2059.     ++p2;     /* abcd;ABCD form, p2 points to A */
  2060. else
  2061.     p2 = NULL;     /* aAbBcCdD form, p2 is NULL */
  2062. while (p[0])
  2063. {
  2064.     if (p[0] == '\' && p[1])
  2065. ++p;
  2066.     from = p[0];
  2067.     if (p2 == NULL)
  2068.     {
  2069. if (p[1] == '\')
  2070.     ++p;
  2071. to = p[1];
  2072.     }
  2073.     else
  2074.     {
  2075. if (p2[0] == '\')
  2076.     ++p2;
  2077. to = p2[0];
  2078.     }
  2079.     if (to == NUL)
  2080.     {
  2081. EMSG2("'langmap': Matching character missing for %s",
  2082.      transchar(from));
  2083. return;
  2084.     }
  2085.     langmap_mapchar[from] = to;
  2086.     /* Advance to next pair */
  2087.     if (p2 == NULL)
  2088.     {
  2089. p += 2;
  2090. if (p[0] == ',')
  2091. {
  2092.     ++p;
  2093.     break;
  2094. }
  2095.     }
  2096.     else
  2097.     {
  2098. ++p;
  2099. ++p2;
  2100. if (*p == ';')
  2101. {
  2102.     p = p2;
  2103.     if (p[0])
  2104.     {
  2105. if (p[0] != ',')
  2106. {
  2107.     EMSG2("'langmap': Extra characters after semicolon: %s", p);
  2108.     return;
  2109. }
  2110. ++p;
  2111.     }
  2112.     break;
  2113. }
  2114.     }
  2115. }
  2116.     }
  2117. }
  2118. #endif
  2119. /*
  2120.  * Return TRUE if format option 'x' is in effect.
  2121.  * Take care of no formatting when 'paste' is set.
  2122.  */
  2123.     int
  2124. has_format_option(x)
  2125.     int     x;
  2126. {
  2127.     if (p_paste)
  2128. return FALSE;
  2129.     return (vim_strchr(curbuf->b_p_fo, x) != NULL);
  2130. }
  2131. /*
  2132.  * Return TRUE if "x" is present in 'shortmess' option, or
  2133.  * 'shortmess' contains 'a' and "x" is present in SHM_A.
  2134.  */
  2135.     int
  2136. shortmess(x)
  2137.     int     x;
  2138. {
  2139.     return (   vim_strchr(p_shm, x) != NULL
  2140.     || (vim_strchr(p_shm, 'a') != NULL
  2141. && vim_strchr((char_u *)SHM_A, x) != NULL));
  2142. }
  2143. /*
  2144.  * set_paste_option() - Called after p_paste was set or reset.
  2145.  */
  2146.     static void
  2147. paste_option_changed()
  2148. {
  2149.     static int     old_p_paste = FALSE;
  2150.     static int     save_sm = 0;
  2151.     static int     save_ru = 0;
  2152. #ifdef RIGHTLEFT
  2153.     static int     save_ri = 0;
  2154.     static int     save_hkmap = 0;
  2155. #endif
  2156.     BUF     *buf;
  2157.     if (p_paste)
  2158.     {
  2159. /*
  2160.  * Paste switched from off to on.
  2161.  * Save the current values, so they can be restored later.
  2162.  */
  2163. if (!old_p_paste)
  2164. {
  2165.     /* save options for each buffer */
  2166.     for (buf = firstbuf; buf != NULL; buf = buf->b_next)
  2167.     {
  2168. buf->b_p_tw_save = buf->b_p_tw;
  2169. buf->b_p_wm_save = buf->b_p_wm;
  2170. buf->b_p_sts_save = buf->b_p_sts;
  2171. buf->b_p_ai_save = buf->b_p_ai;
  2172. #ifdef SMARTINDENT
  2173. buf->b_p_si_save = buf->b_p_si;
  2174. #endif
  2175. #ifdef CINDENT
  2176. buf->b_p_cin_save = buf->b_p_cin;
  2177. #endif
  2178. #ifdef LISPINDENT
  2179. buf->b_p_lisp_save = buf->b_p_lisp;
  2180. #endif
  2181.     }
  2182.     /* save global options */
  2183.     save_sm = p_sm;
  2184.     save_ru = p_ru;
  2185. #ifdef RIGHTLEFT
  2186.     save_ri = p_ri;
  2187.     save_hkmap = p_hkmap;
  2188. #endif
  2189. }
  2190. /*
  2191.  * Always set the option values, also when 'paste' is set when it is
  2192.  * already on.
  2193.  */
  2194. /* set options for each buffer */
  2195. for (buf = firstbuf; buf != NULL; buf = buf->b_next)
  2196. {
  2197.     buf->b_p_tw = 0;     /* textwidth is 0 */
  2198.     buf->b_p_wm = 0;     /* wrapmargin is 0 */
  2199.     buf->b_p_sts = 0;     /* softtabstop is 0 */
  2200.     buf->b_p_ai = 0;     /* no auto-indent */
  2201. #ifdef SMARTINDENT
  2202.     buf->b_p_si = 0;     /* no smart-indent */
  2203. #endif
  2204. #ifdef CINDENT
  2205.     buf->b_p_cin = 0;     /* no c indenting */
  2206. #endif
  2207. #ifdef LISPINDENT
  2208.     buf->b_p_lisp = 0;     /* no lisp indenting */
  2209. #endif
  2210. }
  2211. /* set global options */
  2212. p_sm = 0;     /* no showmatch */
  2213. p_ru = 0;     /* no ruler */
  2214. #ifdef RIGHTLEFT
  2215. p_ri = 0;     /* no reverse insert */
  2216. p_hkmap = 0;     /* no Hebrew keyboard */
  2217. #endif
  2218.     }
  2219.     /*
  2220.      * Paste switched from on to off: Restore saved values.
  2221.      */
  2222.     else if (old_p_paste)
  2223.     {
  2224. /* restore options for each buffer */
  2225. for (buf = firstbuf; buf != NULL; buf = buf->b_next)
  2226. {
  2227.     buf->b_p_tw = buf->b_p_tw_save;
  2228.     buf->b_p_wm = buf->b_p_wm_save;
  2229.     buf->b_p_sts = buf->b_p_sts_save;
  2230.     buf->b_p_ai = buf->b_p_ai_save;
  2231. #ifdef SMARTINDENT
  2232.     buf->b_p_si = buf->b_p_si_save;
  2233. #endif
  2234. #ifdef CINDENT
  2235.     buf->b_p_cin = buf->b_p_cin_save;
  2236. #endif
  2237. #ifdef LISPINDENT
  2238.     buf->b_p_lisp = buf->b_p_lisp_save;
  2239. #endif
  2240. }
  2241. /* restore global options */
  2242. p_sm = save_sm;
  2243. p_ru = save_ru;
  2244. #ifdef RIGHTLEFT
  2245. p_ri = save_ri;
  2246. p_hkmap = save_hkmap;
  2247. #endif
  2248.     }
  2249.     old_p_paste = p_paste;
  2250. }
  2251. /*
  2252.  * vimrc_found() - Called when a ".vimrc" or "VIMINIT" has been found.
  2253.  *
  2254.  * Reset 'compatible' and set the values for options that didn't get set yet
  2255.  * to the Vim defaults.
  2256.  * Don't do this if the 'compatible' option has been set or reset before.
  2257.  */
  2258.     void
  2259. vimrc_found()
  2260. {
  2261.     int     opt_idx;
  2262.     if (!option_was_set((char_u *)"cp"))
  2263.     {
  2264. p_cp = FALSE;
  2265. for (opt_idx = 0; !istermoption(&options[opt_idx]); opt_idx++)
  2266.     if (!(options[opt_idx].flags & (P_WAS_SET|P_VI_DEF)))
  2267. set_option_default(opt_idx, TRUE);
  2268. init_chartab();     /* make b_p_isk take effect */
  2269.     }
  2270. }
  2271. /*
  2272.  * Set 'compatible' on or off.  Called for "-C" and "-N" command line arg.
  2273.  */
  2274.     void
  2275. change_compatible(on)
  2276.     int     on;
  2277. {
  2278.     if (p_cp != on)
  2279.     {
  2280. p_cp = on;
  2281. compatible_set();
  2282.     }
  2283.     options[findoption((char_u *)"cp")].flags |= P_WAS_SET;
  2284. }
  2285. /*
  2286.  * Return TRUE when option "name" has been set.
  2287.  */
  2288.     int
  2289. option_was_set(name)
  2290.     char_u *name;
  2291. {
  2292.     int idx;
  2293.     idx = findoption(name);
  2294.     if (idx < 0) /* unknown option */
  2295. return FALSE;
  2296.     if (options[idx].flags & P_WAS_SET)
  2297. return TRUE;
  2298.     return FALSE;
  2299. }
  2300. /*
  2301.  * compatible_set() - Called when 'compatible' has been set or unset.
  2302.  *
  2303.  * When 'compatible' set: Set all relevant options (those that have the P_VIM)
  2304.  * flag) to a Vi compatible value.
  2305.  * When 'compatible' is unset: Set all options that have a different default
  2306.  * for Vim (without the P_VI_DEF flag) to that default.
  2307.  */
  2308.     static void
  2309. compatible_set()
  2310. {
  2311.     int     opt_idx;
  2312.     for (opt_idx = 0; !istermoption(&options[opt_idx]); opt_idx++)
  2313. if (    ((options[opt_idx].flags & P_VIM) && p_cp)
  2314. || (!(options[opt_idx].flags & P_VI_DEF) && !p_cp))
  2315.     set_option_default(opt_idx, TRUE);
  2316.     init_chartab();     /* make b_p_isk take effect */
  2317. }
  2318. /*
  2319.  * fill_breakat_flags() -- called when 'breakat' changes value.
  2320.  */
  2321.     static void
  2322. fill_breakat_flags()
  2323. {
  2324.     char_u *c;
  2325.     int i;
  2326.     for (i = 0; i < 256; i++)
  2327. breakat_flags[i] = FALSE;
  2328.     if (p_breakat != NULL)
  2329. for (c = p_breakat; *c; c++)
  2330.     breakat_flags[*c] = TRUE;
  2331. }
  2332. /*
  2333.  * Check an option that can be a range of string values.
  2334.  *
  2335.  * Return OK for correct value, FAIL otherwise.
  2336.  */
  2337.     static int
  2338. check_opt_strings(val, values, list)
  2339.     char_u  *val;
  2340.     char    **values;
  2341.     int     list;     /* when TRUE: accept a list of values */
  2342. {
  2343.     int     i;
  2344.     int     len;
  2345.     while (*val)
  2346.     {
  2347. for (i = 0; ; ++i)
  2348. {
  2349.     if (values[i] == NULL) /* val not found in values[] */
  2350. return FAIL;
  2351.     len = STRLEN(values[i]);
  2352.     if (STRNCMP(values[i], val, len) == 0)
  2353.     {
  2354. if (list && val[len] == ',')
  2355. {
  2356.     val += len + 1;
  2357.     break; /* check next item in val list */
  2358. }
  2359. else if (val[len] == NUL)
  2360.     return OK;
  2361.     }
  2362. }
  2363.     }
  2364.     return OK;
  2365. }
  2366. /*
  2367.  * Read the 'wildmode' option, fill wim_flags[].
  2368.  */
  2369.     static int
  2370. check_opt_wim()
  2371. {
  2372.     char_u new_wim_flags[4];
  2373.     char_u *p;
  2374.     int i;
  2375.     int idx = 0;
  2376.     for (i = 0; i < 4; ++i)
  2377. new_wim_flags[i] = 0;
  2378.     for (p = p_wim; *p; ++p)
  2379.     {
  2380. for (i = 0; isalpha(p[i]); ++i)
  2381.     ;
  2382. if (p[i] != NUL && p[i] != ',' && p[i] != ':')
  2383.     return FAIL;
  2384. if (i == 7 && STRNCMP(p, "longest", 7) == 0)
  2385.     new_wim_flags[idx] |= WIM_LONGEST;
  2386. else if (i == 4 && STRNCMP(p, "full", 4) == 0)
  2387.     new_wim_flags[idx] |= WIM_FULL;
  2388. else if (i == 4 && STRNCMP(p, "list", 4) == 0)
  2389.     new_wim_flags[idx] |= WIM_LIST;
  2390. else
  2391.     return FAIL;
  2392. p += i;
  2393. if (*p == NUL)
  2394.     break;
  2395. if (*p == ',')
  2396. {
  2397.     if (idx == 3)
  2398. return FAIL;
  2399.     ++idx;
  2400. }
  2401.     }
  2402.     /* fill remaining entries with last flag */
  2403.     while (idx < 3)
  2404.     {
  2405. new_wim_flags[idx + 1] = new_wim_flags[idx];
  2406. ++idx;
  2407.     }
  2408.     /* only when there are no errors, wim_flags[] is changed */
  2409.     for (i = 0; i < 4; ++i)
  2410. wim_flags[i] = new_wim_flags[i];
  2411.     return OK;
  2412. }