1 /* vi:set ts=8 sts=4 sw=4 noet: 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 * See README.txt for an overview of the Vim source code. 8 */ 9 10 /* 11 * Code to handle user-settable options. This is all pretty much table- 12 * driven. Checklist for adding a new option: 13 * - Put it in the options array below (copy an existing entry). 14 * - For a global option: Add a variable for it in option.h. 15 * - For a buffer or window local option: 16 * - Add a PV_XX entry to the enum below. 17 * - Add a variable to the window or buffer struct in structs.h. 18 * - For a window option, add some code to copy_winopt(). 19 * - For a buffer option, add some code to buf_copy_options(). 20 * - For a buffer string option, add code to check_buf_options(). 21 * - If it's a numeric option, add any necessary bounds checks to do_set(). 22 * - If it's a list of flags, add some code in do_set(), search for WW_ALL. 23 * - When adding an option with expansion (P_EXPAND), but with a different 24 * default for Vi and Vim (no P_VI_DEF), add some code at VIMEXP. 25 * - Add documentation! One line in doc/quickref.txt, full description in 26 * options.txt, and any other related places. 27 * - Add an entry in runtime/optwin.vim. 28 * When making changes: 29 * - Adjust the help for the option in doc/option.txt. 30 * - When an entry has the P_VIM flag, or is lacking the P_VI_DEF flag, add a 31 * comment at the help for the 'compatible' option. 32 */ 33 34 #define IN_OPTION_C 35 #include "vim.h" 36 #include "optiondefs.h" 37 38 static void set_options_default(int opt_flags); 39 static void set_string_default_esc(char *name, char_u *val, int escape); 40 static char_u *find_dup_item(char_u *origval, char_u *newval, long_u flags); 41 static char_u *option_expand(int opt_idx, char_u *val); 42 static void didset_options(void); 43 static void didset_options2(void); 44 #if defined(FEAT_EVAL) || defined(PROTO) 45 static long_u *insecure_flag(int opt_idx, int opt_flags); 46 #else 47 # define insecure_flag(opt_idx, opt_flags) (&options[opt_idx].flags) 48 #endif 49 static char *set_bool_option(int opt_idx, char_u *varp, int value, int opt_flags); 50 static char *set_num_option(int opt_idx, char_u *varp, long value, char *errbuf, size_t errbuflen, int opt_flags); 51 static int find_key_option(char_u *arg_arg, int has_lt); 52 static void showoptions(int all, int opt_flags); 53 static int optval_default(struct vimoption *, char_u *varp, int compatible); 54 static void showoneopt(struct vimoption *, int opt_flags); 55 static int put_setstring(FILE *fd, char *cmd, char *name, char_u **valuep, long_u flags); 56 static int put_setnum(FILE *fd, char *cmd, char *name, long *valuep); 57 static int put_setbool(FILE *fd, char *cmd, char *name, int value); 58 static int istermoption(struct vimoption *p); 59 static char_u *get_varp_scope(struct vimoption *p, int opt_flags); 60 static char_u *get_varp(struct vimoption *); 61 static void check_win_options(win_T *win); 62 static void option_value2string(struct vimoption *, int opt_flags); 63 static void check_winopt(winopt_T *wop); 64 static int wc_use_keyname(char_u *varp, long *wcp); 65 static void paste_option_changed(void); 66 static void compatible_set(void); 67 68 /* 69 * Initialize the options, first part. 70 * 71 * Called only once from main(), just after creating the first buffer. 72 * If "clean_arg" is TRUE Vim was started with --clean. 73 */ 74 void 75 set_init_1(int clean_arg) 76 { 77 char_u *p; 78 int opt_idx; 79 long_u n; 80 81 #ifdef FEAT_LANGMAP 82 langmap_init(); 83 #endif 84 85 // Be Vi compatible by default 86 p_cp = TRUE; 87 88 // Use POSIX compatibility when $VIM_POSIX is set. 89 if (mch_getenv((char_u *)"VIM_POSIX") != NULL) 90 { 91 set_string_default("cpo", (char_u *)CPO_ALL); 92 set_string_default("shm", (char_u *)SHM_POSIX); 93 } 94 95 /* 96 * Find default value for 'shell' option. 97 * Don't use it if it is empty. 98 */ 99 if (((p = mch_getenv((char_u *)"SHELL")) != NULL && *p != NUL) 100 #if defined(MSWIN) 101 || ((p = mch_getenv((char_u *)"COMSPEC")) != NULL && *p != NUL) 102 || ((p = (char_u *)default_shell()) != NULL && *p != NUL) 103 #endif 104 ) 105 #if defined(MSWIN) 106 { 107 // For MS-Windows put the path in quotes instead of escaping spaces. 108 char_u *cmd; 109 size_t len; 110 111 if (vim_strchr(p, ' ') != NULL) 112 { 113 len = STRLEN(p) + 3; // two quotes and a trailing NUL 114 cmd = alloc(len); 115 if (cmd != NULL) 116 { 117 vim_snprintf((char *)cmd, len, "\"%s\"", p); 118 set_string_default("sh", cmd); 119 vim_free(cmd); 120 } 121 } 122 else 123 set_string_default("sh", p); 124 } 125 #else 126 set_string_default_esc("sh", p, TRUE); 127 #endif 128 129 #ifdef FEAT_WILDIGN 130 /* 131 * Set the default for 'backupskip' to include environment variables for 132 * temp files. 133 */ 134 { 135 # ifdef UNIX 136 static char *(names[4]) = {"", "TMPDIR", "TEMP", "TMP"}; 137 # else 138 static char *(names[3]) = {"TMPDIR", "TEMP", "TMP"}; 139 # endif 140 int len; 141 garray_T ga; 142 int mustfree; 143 char_u *item; 144 145 opt_idx = findoption((char_u *)"backupskip"); 146 147 ga_init2(&ga, 1, 100); 148 for (n = 0; n < (long)ARRAY_LENGTH(names); ++n) 149 { 150 mustfree = FALSE; 151 # ifdef UNIX 152 if (*names[n] == NUL) 153 # ifdef MACOS_X 154 p = (char_u *)"/private/tmp"; 155 # else 156 p = (char_u *)"/tmp"; 157 # endif 158 else 159 # endif 160 p = vim_getenv((char_u *)names[n], &mustfree); 161 if (p != NULL && *p != NUL) 162 { 163 // First time count the NUL, otherwise count the ','. 164 len = (int)STRLEN(p) + 3; 165 item = alloc(len); 166 STRCPY(item, p); 167 add_pathsep(item); 168 STRCAT(item, "*"); 169 if (find_dup_item(ga.ga_data, item, options[opt_idx].flags) 170 == NULL 171 && ga_grow(&ga, len) == OK) 172 { 173 if (ga.ga_len > 0) 174 STRCAT(ga.ga_data, ","); 175 STRCAT(ga.ga_data, item); 176 ga.ga_len += len; 177 } 178 vim_free(item); 179 } 180 if (mustfree) 181 vim_free(p); 182 } 183 if (ga.ga_data != NULL) 184 { 185 set_string_default("bsk", ga.ga_data); 186 vim_free(ga.ga_data); 187 } 188 } 189 #endif 190 191 /* 192 * 'maxmemtot' and 'maxmem' may have to be adjusted for available memory 193 */ 194 opt_idx = findoption((char_u *)"maxmemtot"); 195 if (opt_idx >= 0) 196 { 197 #if !defined(HAVE_AVAIL_MEM) && !defined(HAVE_TOTAL_MEM) 198 if (options[opt_idx].def_val[VI_DEFAULT] == (char_u *)0L) 199 #endif 200 { 201 #ifdef HAVE_AVAIL_MEM 202 // Use amount of memory available at this moment. 203 n = (mch_avail_mem(FALSE) >> 1); 204 #else 205 # ifdef HAVE_TOTAL_MEM 206 // Use amount of memory available to Vim. 207 n = (mch_total_mem(FALSE) >> 1); 208 # else 209 n = (0x7fffffff >> 11); 210 # endif 211 #endif 212 options[opt_idx].def_val[VI_DEFAULT] = (char_u *)n; 213 opt_idx = findoption((char_u *)"maxmem"); 214 if (opt_idx >= 0) 215 { 216 #if !defined(HAVE_AVAIL_MEM) && !defined(HAVE_TOTAL_MEM) 217 if ((long)(long_i)options[opt_idx].def_val[VI_DEFAULT] > (long)n 218 || (long)(long_i)options[opt_idx].def_val[VI_DEFAULT] == 0L) 219 #endif 220 options[opt_idx].def_val[VI_DEFAULT] = (char_u *)n; 221 } 222 } 223 } 224 225 #ifdef FEAT_SEARCHPATH 226 { 227 char_u *cdpath; 228 char_u *buf; 229 int i; 230 int j; 231 int mustfree = FALSE; 232 233 // Initialize the 'cdpath' option's default value. 234 cdpath = vim_getenv((char_u *)"CDPATH", &mustfree); 235 if (cdpath != NULL) 236 { 237 buf = alloc((STRLEN(cdpath) << 1) + 2); 238 if (buf != NULL) 239 { 240 buf[0] = ','; // start with ",", current dir first 241 j = 1; 242 for (i = 0; cdpath[i] != NUL; ++i) 243 { 244 if (vim_ispathlistsep(cdpath[i])) 245 buf[j++] = ','; 246 else 247 { 248 if (cdpath[i] == ' ' || cdpath[i] == ',') 249 buf[j++] = '\\'; 250 buf[j++] = cdpath[i]; 251 } 252 } 253 buf[j] = NUL; 254 opt_idx = findoption((char_u *)"cdpath"); 255 if (opt_idx >= 0) 256 { 257 options[opt_idx].def_val[VI_DEFAULT] = buf; 258 options[opt_idx].flags |= P_DEF_ALLOCED; 259 } 260 else 261 vim_free(buf); // cannot happen 262 } 263 if (mustfree) 264 vim_free(cdpath); 265 } 266 } 267 #endif 268 269 #if defined(FEAT_POSTSCRIPT) && (defined(MSWIN) || defined(VMS) || defined(EBCDIC) || defined(MAC) || defined(hpux)) 270 // Set print encoding on platforms that don't default to latin1 271 set_string_default("penc", 272 # if defined(MSWIN) 273 (char_u *)"cp1252" 274 # else 275 # ifdef VMS 276 (char_u *)"dec-mcs" 277 # else 278 # ifdef EBCDIC 279 (char_u *)"ebcdic-uk" 280 # else 281 # ifdef MAC 282 (char_u *)"mac-roman" 283 # else // HPUX 284 (char_u *)"hp-roman8" 285 # endif 286 # endif 287 # endif 288 # endif 289 ); 290 #endif 291 292 #ifdef FEAT_POSTSCRIPT 293 // 'printexpr' must be allocated to be able to evaluate it. 294 set_string_default("pexpr", 295 # if defined(MSWIN) 296 (char_u *)"system('copy' . ' ' . v:fname_in . (&printdevice == '' ? ' LPT1:' : (' \"' . &printdevice . '\"'))) . delete(v:fname_in)" 297 # else 298 # ifdef VMS 299 (char_u *)"system('print/delete' . (&printdevice == '' ? '' : ' /queue=' . &printdevice) . ' ' . v:fname_in)" 300 301 # else 302 (char_u *)"system('lpr' . (&printdevice == '' ? '' : ' -P' . &printdevice) . ' ' . v:fname_in) . delete(v:fname_in) + v:shell_error" 303 # endif 304 # endif 305 ); 306 #endif 307 308 /* 309 * Set all the options (except the terminal options) to their default 310 * value. Also set the global value for local options. 311 */ 312 set_options_default(0); 313 314 #ifdef CLEAN_RUNTIMEPATH 315 if (clean_arg) 316 { 317 opt_idx = findoption((char_u *)"runtimepath"); 318 if (opt_idx >= 0) 319 { 320 options[opt_idx].def_val[VI_DEFAULT] = (char_u *)CLEAN_RUNTIMEPATH; 321 p_rtp = (char_u *)CLEAN_RUNTIMEPATH; 322 } 323 opt_idx = findoption((char_u *)"packpath"); 324 if (opt_idx >= 0) 325 { 326 options[opt_idx].def_val[VI_DEFAULT] = (char_u *)CLEAN_RUNTIMEPATH; 327 p_pp = (char_u *)CLEAN_RUNTIMEPATH; 328 } 329 } 330 #endif 331 332 #ifdef FEAT_GUI 333 if (found_reverse_arg) 334 set_option_value((char_u *)"bg", 0L, (char_u *)"dark", 0); 335 #endif 336 337 curbuf->b_p_initialized = TRUE; 338 curbuf->b_p_ar = -1; // no local 'autoread' value 339 curbuf->b_p_ul = NO_LOCAL_UNDOLEVEL; 340 check_buf_options(curbuf); 341 check_win_options(curwin); 342 check_options(); 343 344 // Must be before option_expand(), because that one needs vim_isIDc() 345 didset_options(); 346 347 #ifdef FEAT_SPELL 348 // Use the current chartab for the generic chartab. This is not in 349 // didset_options() because it only depends on 'encoding'. 350 init_spell_chartab(); 351 #endif 352 353 /* 354 * Expand environment variables and things like "~" for the defaults. 355 * If option_expand() returns non-NULL the variable is expanded. This can 356 * only happen for non-indirect options. 357 * Also set the default to the expanded value, so ":set" does not list 358 * them. 359 * Don't set the P_ALLOCED flag, because we don't want to free the 360 * default. 361 */ 362 for (opt_idx = 0; !istermoption_idx(opt_idx); opt_idx++) 363 { 364 if ((options[opt_idx].flags & P_GETTEXT) 365 && options[opt_idx].var != NULL) 366 p = (char_u *)_(*(char **)options[opt_idx].var); 367 else 368 p = option_expand(opt_idx, NULL); 369 if (p != NULL && (p = vim_strsave(p)) != NULL) 370 { 371 *(char_u **)options[opt_idx].var = p; 372 // VIMEXP 373 // Defaults for all expanded options are currently the same for Vi 374 // and Vim. When this changes, add some code here! Also need to 375 // split P_DEF_ALLOCED in two. 376 if (options[opt_idx].flags & P_DEF_ALLOCED) 377 vim_free(options[opt_idx].def_val[VI_DEFAULT]); 378 options[opt_idx].def_val[VI_DEFAULT] = p; 379 options[opt_idx].flags |= P_DEF_ALLOCED; 380 } 381 } 382 383 save_file_ff(curbuf); // Buffer is unchanged 384 385 #if defined(FEAT_ARABIC) 386 // Detect use of mlterm. 387 // Mlterm is a terminal emulator akin to xterm that has some special 388 // abilities (bidi namely). 389 // NOTE: mlterm's author is being asked to 'set' a variable 390 // instead of an environment variable due to inheritance. 391 if (mch_getenv((char_u *)"MLTERM") != NULL) 392 set_option_value((char_u *)"tbidi", 1L, NULL, 0); 393 #endif 394 395 didset_options2(); 396 397 # if defined(MSWIN) && defined(FEAT_GETTEXT) 398 /* 399 * If $LANG isn't set, try to get a good value for it. This makes the 400 * right language be used automatically. Don't do this for English. 401 */ 402 if (mch_getenv((char_u *)"LANG") == NULL) 403 { 404 char buf[20]; 405 406 // Could use LOCALE_SISO639LANGNAME, but it's not in Win95. 407 // LOCALE_SABBREVLANGNAME gives us three letters, like "enu", we use 408 // only the first two. 409 n = GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVLANGNAME, 410 (LPTSTR)buf, 20); 411 if (n >= 2 && STRNICMP(buf, "en", 2) != 0) 412 { 413 // There are a few exceptions (probably more) 414 if (STRNICMP(buf, "cht", 3) == 0 || STRNICMP(buf, "zht", 3) == 0) 415 STRCPY(buf, "zh_TW"); 416 else if (STRNICMP(buf, "chs", 3) == 0 417 || STRNICMP(buf, "zhc", 3) == 0) 418 STRCPY(buf, "zh_CN"); 419 else if (STRNICMP(buf, "jp", 2) == 0) 420 STRCPY(buf, "ja"); 421 else 422 buf[2] = NUL; // truncate to two-letter code 423 vim_setenv((char_u *)"LANG", (char_u *)buf); 424 } 425 } 426 # else 427 # ifdef MACOS_CONVERT 428 // Moved to os_mac_conv.c to avoid dependency problems. 429 mac_lang_init(); 430 # endif 431 # endif 432 433 # ifdef MSWIN 434 // MS-Windows has builtin support for conversion to and from Unicode, using 435 // "utf-8" for 'encoding' should work best for most users. 436 p = vim_strsave((char_u *)ENC_DFLT); 437 # else 438 // enc_locale() will try to find the encoding of the current locale. 439 // This works best for properly configured systems, old and new. 440 p = enc_locale(); 441 # endif 442 if (p != NULL) 443 { 444 char_u *save_enc; 445 446 // Try setting 'encoding' and check if the value is valid. 447 // If not, go back to the default encoding. 448 save_enc = p_enc; 449 p_enc = p; 450 if (STRCMP(p_enc, "gb18030") == 0) 451 { 452 // We don't support "gb18030", but "cp936" is a good substitute 453 // for practical purposes, thus use that. It's not an alias to 454 // still support conversion between gb18030 and utf-8. 455 p_enc = vim_strsave((char_u *)"cp936"); 456 vim_free(p); 457 } 458 if (mb_init() == NULL) 459 { 460 opt_idx = findoption((char_u *)"encoding"); 461 if (opt_idx >= 0) 462 { 463 options[opt_idx].def_val[VI_DEFAULT] = p_enc; 464 options[opt_idx].flags |= P_DEF_ALLOCED; 465 } 466 467 #if defined(MSWIN) || defined(MACOS_X) || defined(VMS) 468 if (STRCMP(p_enc, "latin1") == 0 || enc_utf8) 469 { 470 // Adjust the default for 'isprint' and 'iskeyword' to match 471 // latin1. Also set the defaults for when 'nocompatible' is 472 // set. 473 set_string_option_direct((char_u *)"isp", -1, 474 ISP_LATIN1, OPT_FREE, SID_NONE); 475 set_string_option_direct((char_u *)"isk", -1, 476 ISK_LATIN1, OPT_FREE, SID_NONE); 477 opt_idx = findoption((char_u *)"isp"); 478 if (opt_idx >= 0) 479 options[opt_idx].def_val[VIM_DEFAULT] = ISP_LATIN1; 480 opt_idx = findoption((char_u *)"isk"); 481 if (opt_idx >= 0) 482 options[opt_idx].def_val[VIM_DEFAULT] = ISK_LATIN1; 483 (void)init_chartab(); 484 } 485 #endif 486 487 #if defined(MSWIN) && (!defined(FEAT_GUI) || defined(VIMDLL)) 488 // Win32 console: When GetACP() returns a different value from 489 // GetConsoleCP() set 'termencoding'. 490 if ( 491 # ifdef VIMDLL 492 (!gui.in_use && !gui.starting) && 493 # endif 494 GetACP() != GetConsoleCP()) 495 { 496 char buf[50]; 497 498 // Win32 console: In ConPTY, GetConsoleCP() returns zero. 499 // Use an alternative value. 500 if (GetConsoleCP() == 0) 501 sprintf(buf, "cp%ld", (long)GetACP()); 502 else 503 sprintf(buf, "cp%ld", (long)GetConsoleCP()); 504 p_tenc = vim_strsave((char_u *)buf); 505 if (p_tenc != NULL) 506 { 507 opt_idx = findoption((char_u *)"termencoding"); 508 if (opt_idx >= 0) 509 { 510 options[opt_idx].def_val[VI_DEFAULT] = p_tenc; 511 options[opt_idx].flags |= P_DEF_ALLOCED; 512 } 513 convert_setup(&input_conv, p_tenc, p_enc); 514 convert_setup(&output_conv, p_enc, p_tenc); 515 } 516 else 517 p_tenc = empty_option; 518 } 519 #endif 520 #if defined(MSWIN) 521 // $HOME may have characters in active code page. 522 init_homedir(); 523 #endif 524 } 525 else 526 { 527 vim_free(p_enc); 528 p_enc = save_enc; 529 } 530 } 531 532 #ifdef FEAT_MULTI_LANG 533 // Set the default for 'helplang'. 534 set_helplang_default(get_mess_lang()); 535 #endif 536 } 537 538 static char_u *fencs_utf8_default = (char_u *)"ucs-bom,utf-8,default,latin1"; 539 540 /* 541 * Set the "fileencodings" option to the default value for when 'encoding' is 542 * utf-8. 543 */ 544 void 545 set_fencs_unicode() 546 { 547 set_string_option_direct((char_u *)"fencs", -1, fencs_utf8_default, 548 OPT_FREE, 0); 549 } 550 551 /* 552 * Set an option to its default value. 553 * This does not take care of side effects! 554 */ 555 static void 556 set_option_default( 557 int opt_idx, 558 int opt_flags, // OPT_FREE, OPT_LOCAL and/or OPT_GLOBAL 559 int compatible) // use Vi default value 560 { 561 char_u *varp; // pointer to variable for current option 562 int dvi; // index in def_val[] 563 long_u flags; 564 long_u *flagsp; 565 int both = (opt_flags & (OPT_LOCAL | OPT_GLOBAL)) == 0; 566 567 varp = get_varp_scope(&(options[opt_idx]), both ? OPT_LOCAL : opt_flags); 568 flags = options[opt_idx].flags; 569 if (varp != NULL) // skip hidden option, nothing to do for it 570 { 571 dvi = ((flags & P_VI_DEF) || compatible) ? VI_DEFAULT : VIM_DEFAULT; 572 if (flags & P_STRING) 573 { 574 // 'fencs' default value depends on 'encoding' 575 if (options[opt_idx].var == (char_u *)&p_fencs && enc_utf8) 576 set_fencs_unicode(); 577 // Use set_string_option_direct() for local options to handle 578 // freeing and allocating the value. 579 else if (options[opt_idx].indir != PV_NONE) 580 set_string_option_direct(NULL, opt_idx, 581 options[opt_idx].def_val[dvi], opt_flags, 0); 582 else 583 { 584 if ((opt_flags & OPT_FREE) && (flags & P_ALLOCED)) 585 free_string_option(*(char_u **)(varp)); 586 *(char_u **)varp = options[opt_idx].def_val[dvi]; 587 options[opt_idx].flags &= ~P_ALLOCED; 588 } 589 } 590 else if (flags & P_NUM) 591 { 592 if (options[opt_idx].indir == PV_SCROLL) 593 win_comp_scroll(curwin); 594 else 595 { 596 long def_val = (long)(long_i)options[opt_idx].def_val[dvi]; 597 598 if ((long *)varp == &curwin->w_p_so 599 || (long *)varp == &curwin->w_p_siso) 600 // 'scrolloff' and 'sidescrolloff' local values have a 601 // different default value than the global default. 602 *(long *)varp = -1; 603 else 604 *(long *)varp = def_val; 605 // May also set global value for local option. 606 if (both) 607 *(long *)get_varp_scope(&(options[opt_idx]), OPT_GLOBAL) = 608 def_val; 609 } 610 } 611 else // P_BOOL 612 { 613 // the cast to long is required for Manx C, long_i is needed for 614 // MSVC 615 *(int *)varp = (int)(long)(long_i)options[opt_idx].def_val[dvi]; 616 #ifdef UNIX 617 // 'modeline' defaults to off for root 618 if (options[opt_idx].indir == PV_ML && getuid() == ROOT_UID) 619 *(int *)varp = FALSE; 620 #endif 621 // May also set global value for local option. 622 if (both) 623 *(int *)get_varp_scope(&(options[opt_idx]), OPT_GLOBAL) = 624 *(int *)varp; 625 } 626 627 // The default value is not insecure. 628 flagsp = insecure_flag(opt_idx, opt_flags); 629 *flagsp = *flagsp & ~P_INSECURE; 630 } 631 632 #ifdef FEAT_EVAL 633 set_option_sctx_idx(opt_idx, opt_flags, current_sctx); 634 #endif 635 } 636 637 /* 638 * Set all options (except terminal options) to their default value. 639 * When "opt_flags" is non-zero skip 'encoding'. 640 */ 641 static void 642 set_options_default( 643 int opt_flags) // OPT_FREE, OPT_LOCAL and/or OPT_GLOBAL 644 { 645 int i; 646 win_T *wp; 647 tabpage_T *tp; 648 649 for (i = 0; !istermoption_idx(i); i++) 650 if (!(options[i].flags & P_NODEFAULT) 651 && (opt_flags == 0 652 || (options[i].var != (char_u *)&p_enc 653 # if defined(FEAT_CRYPT) 654 && options[i].var != (char_u *)&p_cm 655 && options[i].var != (char_u *)&p_key 656 # endif 657 ))) 658 set_option_default(i, opt_flags, p_cp); 659 660 // The 'scroll' option must be computed for all windows. 661 FOR_ALL_TAB_WINDOWS(tp, wp) 662 win_comp_scroll(wp); 663 #ifdef FEAT_CINDENT 664 parse_cino(curbuf); 665 #endif 666 } 667 668 /* 669 * Set the Vi-default value of a string option. 670 * Used for 'sh', 'backupskip' and 'term'. 671 * When "escape" is TRUE escape spaces with a backslash. 672 */ 673 static void 674 set_string_default_esc(char *name, char_u *val, int escape) 675 { 676 char_u *p; 677 int opt_idx; 678 679 if (escape && vim_strchr(val, ' ') != NULL) 680 p = vim_strsave_escaped(val, (char_u *)" "); 681 else 682 p = vim_strsave(val); 683 if (p != NULL) // we don't want a NULL 684 { 685 opt_idx = findoption((char_u *)name); 686 if (opt_idx >= 0) 687 { 688 if (options[opt_idx].flags & P_DEF_ALLOCED) 689 vim_free(options[opt_idx].def_val[VI_DEFAULT]); 690 options[opt_idx].def_val[VI_DEFAULT] = p; 691 options[opt_idx].flags |= P_DEF_ALLOCED; 692 } 693 } 694 } 695 696 void 697 set_string_default(char *name, char_u *val) 698 { 699 set_string_default_esc(name, val, FALSE); 700 } 701 702 /* 703 * For an option value that contains comma separated items, find "newval" in 704 * "origval". Return NULL if not found. 705 */ 706 static char_u * 707 find_dup_item(char_u *origval, char_u *newval, long_u flags) 708 { 709 int bs = 0; 710 size_t newlen; 711 char_u *s; 712 713 if (origval == NULL) 714 return NULL; 715 716 newlen = STRLEN(newval); 717 for (s = origval; *s != NUL; ++s) 718 { 719 if ((!(flags & P_COMMA) 720 || s == origval 721 || (s[-1] == ',' && !(bs & 1))) 722 && STRNCMP(s, newval, newlen) == 0 723 && (!(flags & P_COMMA) 724 || s[newlen] == ',' 725 || s[newlen] == NUL)) 726 return s; 727 // Count backslashes. Only a comma with an even number of backslashes 728 // or a single backslash preceded by a comma before it is recognized as 729 // a separator. 730 if ((s > origval + 1 731 && s[-1] == '\\' 732 && s[-2] != ',') 733 || (s == origval + 1 734 && s[-1] == '\\')) 735 ++bs; 736 else 737 bs = 0; 738 } 739 return NULL; 740 } 741 742 /* 743 * Set the Vi-default value of a number option. 744 * Used for 'lines' and 'columns'. 745 */ 746 void 747 set_number_default(char *name, long val) 748 { 749 int opt_idx; 750 751 opt_idx = findoption((char_u *)name); 752 if (opt_idx >= 0) 753 options[opt_idx].def_val[VI_DEFAULT] = (char_u *)(long_i)val; 754 } 755 756 /* 757 * Set all window-local and buffer-local options to the Vim default. 758 * local-global options will use the global value. 759 * When "do_buffer" is FALSE don't set buffer-local options. 760 */ 761 void 762 set_local_options_default(win_T *wp, int do_buffer) 763 { 764 win_T *save_curwin = curwin; 765 int i; 766 767 curwin = wp; 768 curbuf = curwin->w_buffer; 769 block_autocmds(); 770 771 for (i = 0; !istermoption_idx(i); i++) 772 { 773 struct vimoption *p = &(options[i]); 774 char_u *varp = get_varp_scope(p, OPT_LOCAL); 775 776 if (p->indir != PV_NONE 777 && (do_buffer || (p->indir & PV_BUF) == 0) 778 && !(options[i].flags & P_NODEFAULT) 779 && !optval_default(p, varp, FALSE)) 780 set_option_default(i, OPT_FREE|OPT_LOCAL, FALSE); 781 } 782 783 unblock_autocmds(); 784 curwin = save_curwin; 785 curbuf = curwin->w_buffer; 786 } 787 788 #if defined(EXITFREE) || defined(PROTO) 789 /* 790 * Free all options. 791 */ 792 void 793 free_all_options(void) 794 { 795 int i; 796 797 for (i = 0; !istermoption_idx(i); i++) 798 { 799 if (options[i].indir == PV_NONE) 800 { 801 // global option: free value and default value. 802 if ((options[i].flags & P_ALLOCED) && options[i].var != NULL) 803 free_string_option(*(char_u **)options[i].var); 804 if (options[i].flags & P_DEF_ALLOCED) 805 free_string_option(options[i].def_val[VI_DEFAULT]); 806 } 807 else if (options[i].var != VAR_WIN 808 && (options[i].flags & P_STRING)) 809 // buffer-local option: free global value 810 free_string_option(*(char_u **)options[i].var); 811 } 812 } 813 #endif 814 815 816 /* 817 * Initialize the options, part two: After getting Rows and Columns and 818 * setting 'term'. 819 */ 820 void 821 set_init_2(void) 822 { 823 int idx; 824 825 /* 826 * 'scroll' defaults to half the window height. The stored default is zero, 827 * which results in the actual value computed from the window height. 828 */ 829 idx = findoption((char_u *)"scroll"); 830 if (idx >= 0 && !(options[idx].flags & P_WAS_SET)) 831 set_option_default(idx, OPT_LOCAL, p_cp); 832 comp_col(); 833 834 /* 835 * 'window' is only for backwards compatibility with Vi. 836 * Default is Rows - 1. 837 */ 838 if (!option_was_set((char_u *)"window")) 839 p_window = Rows - 1; 840 set_number_default("window", Rows - 1); 841 842 // For DOS console the default is always black. 843 #if !((defined(MSWIN)) && !defined(FEAT_GUI)) 844 /* 845 * If 'background' wasn't set by the user, try guessing the value, 846 * depending on the terminal name. Only need to check for terminals 847 * with a dark background, that can handle color. 848 */ 849 idx = findoption((char_u *)"bg"); 850 if (idx >= 0 && !(options[idx].flags & P_WAS_SET) 851 && *term_bg_default() == 'd') 852 { 853 set_string_option_direct(NULL, idx, (char_u *)"dark", OPT_FREE, 0); 854 // don't mark it as set, when starting the GUI it may be 855 // changed again 856 options[idx].flags &= ~P_WAS_SET; 857 } 858 #endif 859 860 #ifdef CURSOR_SHAPE 861 parse_shape_opt(SHAPE_CURSOR); // set cursor shapes from 'guicursor' 862 #endif 863 #ifdef FEAT_MOUSESHAPE 864 parse_shape_opt(SHAPE_MOUSE); // set mouse shapes from 'mouseshape' 865 #endif 866 #ifdef FEAT_PRINTER 867 (void)parse_printoptions(); // parse 'printoptions' default value 868 #endif 869 } 870 871 /* 872 * Initialize the options, part three: After reading the .vimrc 873 */ 874 void 875 set_init_3(void) 876 { 877 #if defined(UNIX) || defined(MSWIN) 878 /* 879 * Set 'shellpipe' and 'shellredir', depending on the 'shell' option. 880 * This is done after other initializations, where 'shell' might have been 881 * set, but only if they have not been set before. 882 */ 883 char_u *p; 884 int idx_srr; 885 int do_srr; 886 # ifdef FEAT_QUICKFIX 887 int idx_sp; 888 int do_sp; 889 # endif 890 891 idx_srr = findoption((char_u *)"srr"); 892 if (idx_srr < 0) 893 do_srr = FALSE; 894 else 895 do_srr = !(options[idx_srr].flags & P_WAS_SET); 896 # ifdef FEAT_QUICKFIX 897 idx_sp = findoption((char_u *)"sp"); 898 if (idx_sp < 0) 899 do_sp = FALSE; 900 else 901 do_sp = !(options[idx_sp].flags & P_WAS_SET); 902 # endif 903 p = get_isolated_shell_name(); 904 if (p != NULL) 905 { 906 /* 907 * Default for p_sp is "| tee", for p_srr is ">". 908 * For known shells it is changed here to include stderr. 909 */ 910 if ( fnamecmp(p, "csh") == 0 911 || fnamecmp(p, "tcsh") == 0 912 # if defined(MSWIN) // also check with .exe extension 913 || fnamecmp(p, "csh.exe") == 0 914 || fnamecmp(p, "tcsh.exe") == 0 915 # endif 916 ) 917 { 918 # if defined(FEAT_QUICKFIX) 919 if (do_sp) 920 { 921 # ifdef MSWIN 922 p_sp = (char_u *)">&"; 923 # else 924 p_sp = (char_u *)"|& tee"; 925 # endif 926 options[idx_sp].def_val[VI_DEFAULT] = p_sp; 927 } 928 # endif 929 if (do_srr) 930 { 931 p_srr = (char_u *)">&"; 932 options[idx_srr].def_val[VI_DEFAULT] = p_srr; 933 } 934 } 935 else 936 // Always use POSIX shell style redirection if we reach this 937 if ( fnamecmp(p, "sh") == 0 938 || fnamecmp(p, "ksh") == 0 939 || fnamecmp(p, "mksh") == 0 940 || fnamecmp(p, "pdksh") == 0 941 || fnamecmp(p, "zsh") == 0 942 || fnamecmp(p, "zsh-beta") == 0 943 || fnamecmp(p, "bash") == 0 944 || fnamecmp(p, "fish") == 0 945 || fnamecmp(p, "ash") == 0 946 || fnamecmp(p, "dash") == 0 947 # ifdef MSWIN 948 || fnamecmp(p, "cmd") == 0 949 || fnamecmp(p, "sh.exe") == 0 950 || fnamecmp(p, "ksh.exe") == 0 951 || fnamecmp(p, "mksh.exe") == 0 952 || fnamecmp(p, "pdksh.exe") == 0 953 || fnamecmp(p, "zsh.exe") == 0 954 || fnamecmp(p, "zsh-beta.exe") == 0 955 || fnamecmp(p, "bash.exe") == 0 956 || fnamecmp(p, "cmd.exe") == 0 957 || fnamecmp(p, "dash.exe") == 0 958 # endif 959 ) 960 { 961 # if defined(FEAT_QUICKFIX) 962 if (do_sp) 963 { 964 # ifdef MSWIN 965 p_sp = (char_u *)">%s 2>&1"; 966 # else 967 p_sp = (char_u *)"2>&1| tee"; 968 # endif 969 options[idx_sp].def_val[VI_DEFAULT] = p_sp; 970 } 971 # endif 972 if (do_srr) 973 { 974 p_srr = (char_u *)">%s 2>&1"; 975 options[idx_srr].def_val[VI_DEFAULT] = p_srr; 976 } 977 } 978 vim_free(p); 979 } 980 #endif 981 982 #if defined(MSWIN) 983 /* 984 * Set 'shellcmdflag', 'shellxquote', and 'shellquote' depending on the 985 * 'shell' option. 986 * This is done after other initializations, where 'shell' might have been 987 * set, but only if they have not been set before. Default for p_shcf is 988 * "/c", for p_shq is "". For "sh" like shells it is changed here to 989 * "-c" and "\"". And for Win32 we need to set p_sxq instead. 990 */ 991 if (strstr((char *)gettail(p_sh), "sh") != NULL) 992 { 993 int idx3; 994 995 idx3 = findoption((char_u *)"shcf"); 996 if (idx3 >= 0 && !(options[idx3].flags & P_WAS_SET)) 997 { 998 p_shcf = (char_u *)"-c"; 999 options[idx3].def_val[VI_DEFAULT] = p_shcf; 1000 } 1001 1002 // Somehow Win32 requires the quotes around the redirection too 1003 idx3 = findoption((char_u *)"sxq"); 1004 if (idx3 >= 0 && !(options[idx3].flags & P_WAS_SET)) 1005 { 1006 p_sxq = (char_u *)"\""; 1007 options[idx3].def_val[VI_DEFAULT] = p_sxq; 1008 } 1009 } 1010 else if (strstr((char *)gettail(p_sh), "cmd.exe") != NULL) 1011 { 1012 int idx3; 1013 1014 /* 1015 * cmd.exe on Windows will strip the first and last double quote given 1016 * on the command line, e.g. most of the time things like: 1017 * cmd /c "my path/to/echo" "my args to echo" 1018 * become: 1019 * my path/to/echo" "my args to echo 1020 * when executed. 1021 * 1022 * To avoid this, set shellxquote to surround the command in 1023 * parenthesis. This appears to make most commands work, without 1024 * breaking commands that worked previously, such as 1025 * '"path with spaces/cmd" "a&b"'. 1026 */ 1027 idx3 = findoption((char_u *)"sxq"); 1028 if (idx3 >= 0 && !(options[idx3].flags & P_WAS_SET)) 1029 { 1030 p_sxq = (char_u *)"("; 1031 options[idx3].def_val[VI_DEFAULT] = p_sxq; 1032 } 1033 1034 idx3 = findoption((char_u *)"shcf"); 1035 if (idx3 >= 0 && !(options[idx3].flags & P_WAS_SET)) 1036 { 1037 p_shcf = (char_u *)"/c"; 1038 options[idx3].def_val[VI_DEFAULT] = p_shcf; 1039 } 1040 } 1041 #endif 1042 1043 if (BUFEMPTY()) 1044 { 1045 int idx_ffs = findoption((char_u *)"ffs"); 1046 1047 // Apply the first entry of 'fileformats' to the initial buffer. 1048 if (idx_ffs >= 0 && (options[idx_ffs].flags & P_WAS_SET)) 1049 set_fileformat(default_fileformat(), OPT_LOCAL); 1050 } 1051 1052 #ifdef FEAT_TITLE 1053 set_title_defaults(); 1054 #endif 1055 } 1056 1057 #if defined(FEAT_MULTI_LANG) || defined(PROTO) 1058 /* 1059 * When 'helplang' is still at its default value, set it to "lang". 1060 * Only the first two characters of "lang" are used. 1061 */ 1062 void 1063 set_helplang_default(char_u *lang) 1064 { 1065 int idx; 1066 1067 if (lang == NULL || STRLEN(lang) < 2) // safety check 1068 return; 1069 idx = findoption((char_u *)"hlg"); 1070 if (idx >= 0 && !(options[idx].flags & P_WAS_SET)) 1071 { 1072 if (options[idx].flags & P_ALLOCED) 1073 free_string_option(p_hlg); 1074 p_hlg = vim_strsave(lang); 1075 if (p_hlg == NULL) 1076 p_hlg = empty_option; 1077 else 1078 { 1079 // zh_CN becomes "cn", zh_TW becomes "tw" 1080 if (STRNICMP(p_hlg, "zh_", 3) == 0 && STRLEN(p_hlg) >= 5) 1081 { 1082 p_hlg[0] = TOLOWER_ASC(p_hlg[3]); 1083 p_hlg[1] = TOLOWER_ASC(p_hlg[4]); 1084 } 1085 // any C like setting, such as C.UTF-8, becomes "en" 1086 else if (STRLEN(p_hlg) >= 1 && *p_hlg == 'C') 1087 { 1088 p_hlg[0] = 'e'; 1089 p_hlg[1] = 'n'; 1090 } 1091 p_hlg[2] = NUL; 1092 } 1093 options[idx].flags |= P_ALLOCED; 1094 } 1095 } 1096 #endif 1097 1098 #ifdef FEAT_TITLE 1099 /* 1100 * 'title' and 'icon' only default to true if they have not been set or reset 1101 * in .vimrc and we can read the old value. 1102 * When 'title' and 'icon' have been reset in .vimrc, we won't even check if 1103 * they can be reset. This reduces startup time when using X on a remote 1104 * machine. 1105 */ 1106 void 1107 set_title_defaults(void) 1108 { 1109 int idx1; 1110 long val; 1111 1112 /* 1113 * If GUI is (going to be) used, we can always set the window title and 1114 * icon name. Saves a bit of time, because the X11 display server does 1115 * not need to be contacted. 1116 */ 1117 idx1 = findoption((char_u *)"title"); 1118 if (idx1 >= 0 && !(options[idx1].flags & P_WAS_SET)) 1119 { 1120 #ifdef FEAT_GUI 1121 if (gui.starting || gui.in_use) 1122 val = TRUE; 1123 else 1124 #endif 1125 val = mch_can_restore_title(); 1126 options[idx1].def_val[VI_DEFAULT] = (char_u *)(long_i)val; 1127 p_title = val; 1128 } 1129 idx1 = findoption((char_u *)"icon"); 1130 if (idx1 >= 0 && !(options[idx1].flags & P_WAS_SET)) 1131 { 1132 #ifdef FEAT_GUI 1133 if (gui.starting || gui.in_use) 1134 val = TRUE; 1135 else 1136 #endif 1137 val = mch_can_restore_icon(); 1138 options[idx1].def_val[VI_DEFAULT] = (char_u *)(long_i)val; 1139 p_icon = val; 1140 } 1141 } 1142 #endif 1143 1144 void 1145 ex_set(exarg_T *eap) 1146 { 1147 int flags = 0; 1148 1149 if (eap->cmdidx == CMD_setlocal) 1150 flags = OPT_LOCAL; 1151 else if (eap->cmdidx == CMD_setglobal) 1152 flags = OPT_GLOBAL; 1153 #if defined(FEAT_EVAL) && defined(FEAT_BROWSE) 1154 if ((cmdmod.cmod_flags & CMOD_BROWSE) && flags == 0) 1155 ex_options(eap); 1156 else 1157 #endif 1158 { 1159 if (eap->forceit) 1160 flags |= OPT_ONECOLUMN; 1161 (void)do_set(eap->arg, flags); 1162 } 1163 } 1164 1165 /* 1166 * Parse 'arg' for option settings. 1167 * 1168 * 'arg' may be IObuff, but only when no errors can be present and option 1169 * does not need to be expanded with option_expand(). 1170 * "opt_flags": 1171 * 0 for ":set" 1172 * OPT_GLOBAL for ":setglobal" 1173 * OPT_LOCAL for ":setlocal" and a modeline 1174 * OPT_MODELINE for a modeline 1175 * OPT_WINONLY to only set window-local options 1176 * OPT_NOWIN to skip setting window-local options 1177 * 1178 * returns FAIL if an error is detected, OK otherwise 1179 */ 1180 int 1181 do_set( 1182 char_u *arg, // option string (may be written to!) 1183 int opt_flags) 1184 { 1185 int opt_idx; 1186 char *errmsg; 1187 char errbuf[80]; 1188 char_u *startarg; 1189 int prefix; // 1: nothing, 0: "no", 2: "inv" in front of name 1190 int nextchar; // next non-white char after option name 1191 int afterchar; // character just after option name 1192 int len; 1193 int i; 1194 varnumber_T value; 1195 int key; 1196 long_u flags; // flags for current option 1197 char_u *varp = NULL; // pointer to variable for current option 1198 int did_show = FALSE; // already showed one value 1199 int adding; // "opt+=arg" 1200 int prepending; // "opt^=arg" 1201 int removing; // "opt-=arg" 1202 int cp_val = 0; 1203 char_u key_name[2]; 1204 1205 if (*arg == NUL) 1206 { 1207 showoptions(0, opt_flags); 1208 did_show = TRUE; 1209 goto theend; 1210 } 1211 1212 while (*arg != NUL) // loop to process all options 1213 { 1214 errmsg = NULL; 1215 startarg = arg; // remember for error message 1216 1217 if (STRNCMP(arg, "all", 3) == 0 && !isalpha(arg[3]) 1218 && !(opt_flags & OPT_MODELINE)) 1219 { 1220 /* 1221 * ":set all" show all options. 1222 * ":set all&" set all options to their default value. 1223 */ 1224 arg += 3; 1225 if (*arg == '&') 1226 { 1227 ++arg; 1228 // Only for :set command set global value of local options. 1229 set_options_default(OPT_FREE | opt_flags); 1230 didset_options(); 1231 didset_options2(); 1232 redraw_all_later(CLEAR); 1233 } 1234 else 1235 { 1236 showoptions(1, opt_flags); 1237 did_show = TRUE; 1238 } 1239 } 1240 else if (STRNCMP(arg, "termcap", 7) == 0 && !(opt_flags & OPT_MODELINE)) 1241 { 1242 showoptions(2, opt_flags); 1243 show_termcodes(); 1244 did_show = TRUE; 1245 arg += 7; 1246 } 1247 else 1248 { 1249 prefix = 1; 1250 if (STRNCMP(arg, "no", 2) == 0 && STRNCMP(arg, "novice", 6) != 0) 1251 { 1252 prefix = 0; 1253 arg += 2; 1254 } 1255 else if (STRNCMP(arg, "inv", 3) == 0) 1256 { 1257 prefix = 2; 1258 arg += 3; 1259 } 1260 1261 // find end of name 1262 key = 0; 1263 if (*arg == '<') 1264 { 1265 opt_idx = -1; 1266 // look out for <t_>;> 1267 if (arg[1] == 't' && arg[2] == '_' && arg[3] && arg[4]) 1268 len = 5; 1269 else 1270 { 1271 len = 1; 1272 while (arg[len] != NUL && arg[len] != '>') 1273 ++len; 1274 } 1275 if (arg[len] != '>') 1276 { 1277 errmsg = e_invarg; 1278 goto skip; 1279 } 1280 arg[len] = NUL; // put NUL after name 1281 if (arg[1] == 't' && arg[2] == '_') // could be term code 1282 opt_idx = findoption(arg + 1); 1283 arg[len++] = '>'; // restore '>' 1284 if (opt_idx == -1) 1285 key = find_key_option(arg + 1, TRUE); 1286 } 1287 else 1288 { 1289 len = 0; 1290 /* 1291 * The two characters after "t_" may not be alphanumeric. 1292 */ 1293 if (arg[0] == 't' && arg[1] == '_' && arg[2] && arg[3]) 1294 len = 4; 1295 else 1296 while (ASCII_ISALNUM(arg[len]) || arg[len] == '_') 1297 ++len; 1298 nextchar = arg[len]; 1299 arg[len] = NUL; // put NUL after name 1300 opt_idx = findoption(arg); 1301 arg[len] = nextchar; // restore nextchar 1302 if (opt_idx == -1) 1303 key = find_key_option(arg, FALSE); 1304 } 1305 1306 // remember character after option name 1307 afterchar = arg[len]; 1308 1309 // skip white space, allow ":set ai ?" 1310 while (VIM_ISWHITE(arg[len])) 1311 ++len; 1312 1313 adding = FALSE; 1314 prepending = FALSE; 1315 removing = FALSE; 1316 if (arg[len] != NUL && arg[len + 1] == '=') 1317 { 1318 if (arg[len] == '+') 1319 { 1320 adding = TRUE; // "+=" 1321 ++len; 1322 } 1323 else if (arg[len] == '^') 1324 { 1325 prepending = TRUE; // "^=" 1326 ++len; 1327 } 1328 else if (arg[len] == '-') 1329 { 1330 removing = TRUE; // "-=" 1331 ++len; 1332 } 1333 } 1334 nextchar = arg[len]; 1335 1336 if (opt_idx == -1 && key == 0) // found a mismatch: skip 1337 { 1338 errmsg = N_("E518: Unknown option"); 1339 goto skip; 1340 } 1341 1342 if (opt_idx >= 0) 1343 { 1344 if (options[opt_idx].var == NULL) // hidden option: skip 1345 { 1346 // Only give an error message when requesting the value of 1347 // a hidden option, ignore setting it. 1348 if (vim_strchr((char_u *)"=:!&<", nextchar) == NULL 1349 && (!(options[opt_idx].flags & P_BOOL) 1350 || nextchar == '?')) 1351 errmsg = N_("E519: Option not supported"); 1352 goto skip; 1353 } 1354 1355 flags = options[opt_idx].flags; 1356 varp = get_varp_scope(&(options[opt_idx]), opt_flags); 1357 } 1358 else 1359 { 1360 flags = P_STRING; 1361 if (key < 0) 1362 { 1363 key_name[0] = KEY2TERMCAP0(key); 1364 key_name[1] = KEY2TERMCAP1(key); 1365 } 1366 else 1367 { 1368 key_name[0] = KS_KEY; 1369 key_name[1] = (key & 0xff); 1370 } 1371 } 1372 1373 // Skip all options that are not window-local (used when showing 1374 // an already loaded buffer in a window). 1375 if ((opt_flags & OPT_WINONLY) 1376 && (opt_idx < 0 || options[opt_idx].var != VAR_WIN)) 1377 goto skip; 1378 1379 // Skip all options that are window-local (used for :vimgrep). 1380 if ((opt_flags & OPT_NOWIN) && opt_idx >= 0 1381 && options[opt_idx].var == VAR_WIN) 1382 goto skip; 1383 1384 // Disallow changing some options from modelines. 1385 if (opt_flags & OPT_MODELINE) 1386 { 1387 if (flags & (P_SECURE | P_NO_ML)) 1388 { 1389 errmsg = N_("E520: Not allowed in a modeline"); 1390 goto skip; 1391 } 1392 if ((flags & P_MLE) && !p_mle) 1393 { 1394 errmsg = N_("E992: Not allowed in a modeline when 'modelineexpr' is off"); 1395 goto skip; 1396 } 1397 #ifdef FEAT_DIFF 1398 // In diff mode some options are overruled. This avoids that 1399 // 'foldmethod' becomes "marker" instead of "diff" and that 1400 // "wrap" gets set. 1401 if (curwin->w_p_diff 1402 && opt_idx >= 0 // shut up coverity warning 1403 && ( 1404 #ifdef FEAT_FOLDING 1405 options[opt_idx].indir == PV_FDM || 1406 #endif 1407 options[opt_idx].indir == PV_WRAP)) 1408 goto skip; 1409 #endif 1410 } 1411 1412 #ifdef HAVE_SANDBOX 1413 // Disallow changing some options in the sandbox 1414 if (sandbox != 0 && (flags & P_SECURE)) 1415 { 1416 errmsg = e_sandbox; 1417 goto skip; 1418 } 1419 #endif 1420 1421 if (vim_strchr((char_u *)"?=:!&<", nextchar) != NULL) 1422 { 1423 arg += len; 1424 cp_val = p_cp; 1425 if (nextchar == '&' && arg[1] == 'v' && arg[2] == 'i') 1426 { 1427 if (arg[3] == 'm') // "opt&vim": set to Vim default 1428 { 1429 cp_val = FALSE; 1430 arg += 3; 1431 } 1432 else // "opt&vi": set to Vi default 1433 { 1434 cp_val = TRUE; 1435 arg += 2; 1436 } 1437 } 1438 if (vim_strchr((char_u *)"?!&<", nextchar) != NULL 1439 && arg[1] != NUL && !VIM_ISWHITE(arg[1])) 1440 { 1441 errmsg = e_trailing; 1442 goto skip; 1443 } 1444 } 1445 1446 /* 1447 * allow '=' and ':' for historical reasons (MSDOS command.com 1448 * allows only one '=' character per "set" command line. grrr. (jw) 1449 */ 1450 if (nextchar == '?' 1451 || (prefix == 1 1452 && vim_strchr((char_u *)"=:&<", nextchar) == NULL 1453 && !(flags & P_BOOL))) 1454 { 1455 /* 1456 * print value 1457 */ 1458 if (did_show) 1459 msg_putchar('\n'); // cursor below last one 1460 else 1461 { 1462 gotocmdline(TRUE); // cursor at status line 1463 did_show = TRUE; // remember that we did a line 1464 } 1465 if (opt_idx >= 0) 1466 { 1467 showoneopt(&options[opt_idx], opt_flags); 1468 #ifdef FEAT_EVAL 1469 if (p_verbose > 0) 1470 { 1471 // Mention where the option was last set. 1472 if (varp == options[opt_idx].var) 1473 last_set_msg(options[opt_idx].script_ctx); 1474 else if ((int)options[opt_idx].indir & PV_WIN) 1475 last_set_msg(curwin->w_p_script_ctx[ 1476 (int)options[opt_idx].indir & PV_MASK]); 1477 else if ((int)options[opt_idx].indir & PV_BUF) 1478 last_set_msg(curbuf->b_p_script_ctx[ 1479 (int)options[opt_idx].indir & PV_MASK]); 1480 } 1481 #endif 1482 } 1483 else 1484 { 1485 char_u *p; 1486 1487 p = find_termcode(key_name); 1488 if (p == NULL) 1489 { 1490 errmsg = N_("E846: Key code not set"); 1491 goto skip; 1492 } 1493 else 1494 (void)show_one_termcode(key_name, p, TRUE); 1495 } 1496 if (nextchar != '?' 1497 && nextchar != NUL && !VIM_ISWHITE(afterchar)) 1498 errmsg = e_trailing; 1499 } 1500 else 1501 { 1502 int value_is_replaced = !prepending && !adding && !removing; 1503 int value_checked = FALSE; 1504 1505 if (flags & P_BOOL) // boolean 1506 { 1507 if (nextchar == '=' || nextchar == ':') 1508 { 1509 errmsg = e_invarg; 1510 goto skip; 1511 } 1512 1513 /* 1514 * ":set opt!": invert 1515 * ":set opt&": reset to default value 1516 * ":set opt<": reset to global value 1517 */ 1518 if (nextchar == '!') 1519 value = *(int *)(varp) ^ 1; 1520 else if (nextchar == '&') 1521 value = (int)(long)(long_i)options[opt_idx].def_val[ 1522 ((flags & P_VI_DEF) || cp_val) 1523 ? VI_DEFAULT : VIM_DEFAULT]; 1524 else if (nextchar == '<') 1525 { 1526 // For 'autoread' -1 means to use global value. 1527 if ((int *)varp == &curbuf->b_p_ar 1528 && opt_flags == OPT_LOCAL) 1529 value = -1; 1530 else 1531 value = *(int *)get_varp_scope(&(options[opt_idx]), 1532 OPT_GLOBAL); 1533 } 1534 else 1535 { 1536 /* 1537 * ":set invopt": invert 1538 * ":set opt" or ":set noopt": set or reset 1539 */ 1540 if (nextchar != NUL && !VIM_ISWHITE(afterchar)) 1541 { 1542 errmsg = e_trailing; 1543 goto skip; 1544 } 1545 if (prefix == 2) // inv 1546 value = *(int *)(varp) ^ 1; 1547 else 1548 value = prefix; 1549 } 1550 1551 errmsg = set_bool_option(opt_idx, varp, (int)value, 1552 opt_flags); 1553 } 1554 else // numeric or string 1555 { 1556 if (vim_strchr((char_u *)"=:&<", nextchar) == NULL 1557 || prefix != 1) 1558 { 1559 errmsg = e_invarg; 1560 goto skip; 1561 } 1562 1563 if (flags & P_NUM) // numeric 1564 { 1565 /* 1566 * Different ways to set a number option: 1567 * & set to default value 1568 * < set to global value 1569 * <xx> accept special key codes for 'wildchar' 1570 * c accept any non-digit for 'wildchar' 1571 * [-]0-9 set number 1572 * other error 1573 */ 1574 ++arg; 1575 if (nextchar == '&') 1576 value = (long)(long_i)options[opt_idx].def_val[ 1577 ((flags & P_VI_DEF) || cp_val) 1578 ? VI_DEFAULT : VIM_DEFAULT]; 1579 else if (nextchar == '<') 1580 { 1581 // For 'undolevels' NO_LOCAL_UNDOLEVEL means to 1582 // use the global value. 1583 if ((long *)varp == &curbuf->b_p_ul 1584 && opt_flags == OPT_LOCAL) 1585 value = NO_LOCAL_UNDOLEVEL; 1586 else 1587 value = *(long *)get_varp_scope( 1588 &(options[opt_idx]), OPT_GLOBAL); 1589 } 1590 else if (((long *)varp == &p_wc 1591 || (long *)varp == &p_wcm) 1592 && (*arg == '<' 1593 || *arg == '^' 1594 || (*arg != NUL 1595 && (!arg[1] || VIM_ISWHITE(arg[1])) 1596 && !VIM_ISDIGIT(*arg)))) 1597 { 1598 value = string_to_key(arg, FALSE); 1599 if (value == 0 && (long *)varp != &p_wcm) 1600 { 1601 errmsg = e_invarg; 1602 goto skip; 1603 } 1604 } 1605 else if (*arg == '-' || VIM_ISDIGIT(*arg)) 1606 { 1607 // Allow negative (for 'undolevels'), octal and 1608 // hex numbers. 1609 vim_str2nr(arg, NULL, &i, STR2NR_ALL, 1610 &value, NULL, 0, TRUE); 1611 if (i == 0 || (arg[i] != NUL 1612 && !VIM_ISWHITE(arg[i]))) 1613 { 1614 errmsg = N_("E521: Number required after ="); 1615 goto skip; 1616 } 1617 } 1618 else 1619 { 1620 errmsg = N_("E521: Number required after ="); 1621 goto skip; 1622 } 1623 1624 if (adding) 1625 value = *(long *)varp + value; 1626 if (prepending) 1627 value = *(long *)varp * value; 1628 if (removing) 1629 value = *(long *)varp - value; 1630 errmsg = set_num_option(opt_idx, varp, value, 1631 errbuf, sizeof(errbuf), opt_flags); 1632 } 1633 else if (opt_idx >= 0) // string 1634 { 1635 char_u *save_arg = NULL; 1636 char_u *s = NULL; 1637 char_u *oldval = NULL; // previous value if *varp 1638 char_u *newval; 1639 char_u *origval = NULL; 1640 char_u *origval_l = NULL; 1641 char_u *origval_g = NULL; 1642 #if defined(FEAT_EVAL) 1643 char_u *saved_origval = NULL; 1644 char_u *saved_origval_l = NULL; 1645 char_u *saved_origval_g = NULL; 1646 char_u *saved_newval = NULL; 1647 #endif 1648 unsigned newlen; 1649 int comma; 1650 int new_value_alloced; // new string option 1651 // was allocated 1652 1653 // When using ":set opt=val" for a global option 1654 // with a local value the local value will be 1655 // reset, use the global value here. 1656 if ((opt_flags & (OPT_LOCAL | OPT_GLOBAL)) == 0 1657 && ((int)options[opt_idx].indir & PV_BOTH)) 1658 varp = options[opt_idx].var; 1659 1660 // The old value is kept until we are sure that the 1661 // new value is valid. 1662 oldval = *(char_u **)varp; 1663 1664 if ((opt_flags & (OPT_LOCAL | OPT_GLOBAL)) == 0) 1665 { 1666 origval_l = *(char_u **)get_varp_scope( 1667 &(options[opt_idx]), OPT_LOCAL); 1668 origval_g = *(char_u **)get_varp_scope( 1669 &(options[opt_idx]), OPT_GLOBAL); 1670 1671 // A global-local string option might have an empty 1672 // option as value to indicate that the global 1673 // value should be used. 1674 if (((int)options[opt_idx].indir & PV_BOTH) 1675 && origval_l == empty_option) 1676 origval_l = origval_g; 1677 } 1678 1679 // When setting the local value of a global 1680 // option, the old value may be the global value. 1681 if (((int)options[opt_idx].indir & PV_BOTH) 1682 && (opt_flags & OPT_LOCAL)) 1683 origval = *(char_u **)get_varp( 1684 &options[opt_idx]); 1685 else 1686 origval = oldval; 1687 1688 if (nextchar == '&') // set to default val 1689 { 1690 newval = options[opt_idx].def_val[ 1691 ((flags & P_VI_DEF) || cp_val) 1692 ? VI_DEFAULT : VIM_DEFAULT]; 1693 if ((char_u **)varp == &p_bg) 1694 { 1695 // guess the value of 'background' 1696 #ifdef FEAT_GUI 1697 if (gui.in_use) 1698 newval = gui_bg_default(); 1699 else 1700 #endif 1701 newval = term_bg_default(); 1702 } 1703 else if ((char_u **)varp == &p_fencs && enc_utf8) 1704 newval = fencs_utf8_default; 1705 1706 // expand environment variables and ~ (since the 1707 // default value was already expanded, only 1708 // required when an environment variable was set 1709 // later 1710 if (newval == NULL) 1711 newval = empty_option; 1712 else 1713 { 1714 s = option_expand(opt_idx, newval); 1715 if (s == NULL) 1716 s = newval; 1717 newval = vim_strsave(s); 1718 } 1719 new_value_alloced = TRUE; 1720 } 1721 else if (nextchar == '<') // set to global val 1722 { 1723 newval = vim_strsave(*(char_u **)get_varp_scope( 1724 &(options[opt_idx]), OPT_GLOBAL)); 1725 new_value_alloced = TRUE; 1726 } 1727 else 1728 { 1729 ++arg; // jump to after the '=' or ':' 1730 1731 /* 1732 * Set 'keywordprg' to ":help" if an empty 1733 * value was passed to :set by the user. 1734 * Misuse errbuf[] for the resulting string. 1735 */ 1736 if (varp == (char_u *)&p_kp 1737 && (*arg == NUL || *arg == ' ')) 1738 { 1739 STRCPY(errbuf, ":help"); 1740 save_arg = arg; 1741 arg = (char_u *)errbuf; 1742 } 1743 /* 1744 * Convert 'backspace' number to string, for 1745 * adding, prepending and removing string. 1746 */ 1747 else if (varp == (char_u *)&p_bs 1748 && VIM_ISDIGIT(**(char_u **)varp)) 1749 { 1750 i = getdigits((char_u **)varp); 1751 switch (i) 1752 { 1753 case 0: 1754 *(char_u **)varp = empty_option; 1755 break; 1756 case 1: 1757 *(char_u **)varp = vim_strsave( 1758 (char_u *)"indent,eol"); 1759 break; 1760 case 2: 1761 *(char_u **)varp = vim_strsave( 1762 (char_u *)"indent,eol,start"); 1763 break; 1764 case 3: 1765 *(char_u **)varp = vim_strsave( 1766 (char_u *)"indent,eol,nostop"); 1767 break; 1768 } 1769 vim_free(oldval); 1770 if (origval == oldval) 1771 origval = *(char_u **)varp; 1772 if (origval_l == oldval) 1773 origval_l = *(char_u **)varp; 1774 if (origval_g == oldval) 1775 origval_g = *(char_u **)varp; 1776 oldval = *(char_u **)varp; 1777 } 1778 /* 1779 * Convert 'whichwrap' number to string, for 1780 * backwards compatibility with Vim 3.0. 1781 * Misuse errbuf[] for the resulting string. 1782 */ 1783 else if (varp == (char_u *)&p_ww 1784 && VIM_ISDIGIT(*arg)) 1785 { 1786 *errbuf = NUL; 1787 i = getdigits(&arg); 1788 if (i & 1) 1789 STRCAT(errbuf, "b,"); 1790 if (i & 2) 1791 STRCAT(errbuf, "s,"); 1792 if (i & 4) 1793 STRCAT(errbuf, "h,l,"); 1794 if (i & 8) 1795 STRCAT(errbuf, "<,>,"); 1796 if (i & 16) 1797 STRCAT(errbuf, "[,],"); 1798 if (*errbuf != NUL) // remove trailing , 1799 errbuf[STRLEN(errbuf) - 1] = NUL; 1800 save_arg = arg; 1801 arg = (char_u *)errbuf; 1802 } 1803 /* 1804 * Remove '>' before 'dir' and 'bdir', for 1805 * backwards compatibility with version 3.0 1806 */ 1807 else if ( *arg == '>' 1808 && (varp == (char_u *)&p_dir 1809 || varp == (char_u *)&p_bdir)) 1810 { 1811 ++arg; 1812 } 1813 1814 /* 1815 * Copy the new string into allocated memory. 1816 * Can't use set_string_option_direct(), because 1817 * we need to remove the backslashes. 1818 */ 1819 // get a bit too much 1820 newlen = (unsigned)STRLEN(arg) + 1; 1821 if (adding || prepending || removing) 1822 newlen += (unsigned)STRLEN(origval) + 1; 1823 newval = alloc(newlen); 1824 if (newval == NULL) // out of mem, don't change 1825 break; 1826 s = newval; 1827 1828 /* 1829 * Copy the string, skip over escaped chars. 1830 * For MS-DOS and WIN32 backslashes before normal 1831 * file name characters are not removed, and keep 1832 * backslash at start, for "\\machine\path", but 1833 * do remove it for "\\\\machine\\path". 1834 * The reverse is found in ExpandOldSetting(). 1835 */ 1836 while (*arg && !VIM_ISWHITE(*arg)) 1837 { 1838 if (*arg == '\\' && arg[1] != NUL 1839 #ifdef BACKSLASH_IN_FILENAME 1840 && !((flags & P_EXPAND) 1841 && vim_isfilec(arg[1]) 1842 && !VIM_ISWHITE(arg[1]) 1843 && (arg[1] != '\\' 1844 || (s == newval 1845 && arg[2] != '\\'))) 1846 #endif 1847 ) 1848 ++arg; // remove backslash 1849 if (has_mbyte 1850 && (i = (*mb_ptr2len)(arg)) > 1) 1851 { 1852 // copy multibyte char 1853 mch_memmove(s, arg, (size_t)i); 1854 arg += i; 1855 s += i; 1856 } 1857 else 1858 *s++ = *arg++; 1859 } 1860 *s = NUL; 1861 1862 /* 1863 * Expand environment variables and ~. 1864 * Don't do it when adding without inserting a 1865 * comma. 1866 */ 1867 if (!(adding || prepending || removing) 1868 || (flags & P_COMMA)) 1869 { 1870 s = option_expand(opt_idx, newval); 1871 if (s != NULL) 1872 { 1873 vim_free(newval); 1874 newlen = (unsigned)STRLEN(s) + 1; 1875 if (adding || prepending || removing) 1876 newlen += (unsigned)STRLEN(origval) + 1; 1877 newval = alloc(newlen); 1878 if (newval == NULL) 1879 break; 1880 STRCPY(newval, s); 1881 } 1882 } 1883 1884 // locate newval[] in origval[] when removing it 1885 // and when adding to avoid duplicates 1886 i = 0; // init for GCC 1887 if (removing || (flags & P_NODUP)) 1888 { 1889 i = (int)STRLEN(newval); 1890 s = find_dup_item(origval, newval, flags); 1891 1892 // do not add if already there 1893 if ((adding || prepending) && s != NULL) 1894 { 1895 prepending = FALSE; 1896 adding = FALSE; 1897 STRCPY(newval, origval); 1898 } 1899 1900 // if no duplicate, move pointer to end of 1901 // original value 1902 if (s == NULL) 1903 s = origval + (int)STRLEN(origval); 1904 } 1905 1906 // concatenate the two strings; add a ',' if 1907 // needed 1908 if (adding || prepending) 1909 { 1910 comma = ((flags & P_COMMA) && *origval != NUL 1911 && *newval != NUL); 1912 if (adding) 1913 { 1914 i = (int)STRLEN(origval); 1915 // strip a trailing comma, would get 2 1916 if (comma && i > 1 1917 && (flags & P_ONECOMMA) == P_ONECOMMA 1918 && origval[i - 1] == ',' 1919 && origval[i - 2] != '\\') 1920 i--; 1921 mch_memmove(newval + i + comma, newval, 1922 STRLEN(newval) + 1); 1923 mch_memmove(newval, origval, (size_t)i); 1924 } 1925 else 1926 { 1927 i = (int)STRLEN(newval); 1928 STRMOVE(newval + i + comma, origval); 1929 } 1930 if (comma) 1931 newval[i] = ','; 1932 } 1933 1934 // Remove newval[] from origval[]. (Note: "i" has 1935 // been set above and is used here). 1936 if (removing) 1937 { 1938 STRCPY(newval, origval); 1939 if (*s) 1940 { 1941 // may need to remove a comma 1942 if (flags & P_COMMA) 1943 { 1944 if (s == origval) 1945 { 1946 // include comma after string 1947 if (s[i] == ',') 1948 ++i; 1949 } 1950 else 1951 { 1952 // include comma before string 1953 --s; 1954 ++i; 1955 } 1956 } 1957 STRMOVE(newval + (s - origval), s + i); 1958 } 1959 } 1960 1961 if (flags & P_FLAGLIST) 1962 { 1963 // Remove flags that appear twice. 1964 for (s = newval; *s;) 1965 { 1966 // if options have P_FLAGLIST and 1967 // P_ONECOMMA such as 'whichwrap' 1968 if (flags & P_ONECOMMA) 1969 { 1970 if (*s != ',' && *(s + 1) == ',' 1971 && vim_strchr(s + 2, *s) != NULL) 1972 { 1973 // Remove the duplicated value and 1974 // the next comma. 1975 STRMOVE(s, s + 2); 1976 continue; 1977 } 1978 } 1979 else 1980 { 1981 if ((!(flags & P_COMMA) || *s != ',') 1982 && vim_strchr(s + 1, *s) != NULL) 1983 { 1984 STRMOVE(s, s + 1); 1985 continue; 1986 } 1987 } 1988 ++s; 1989 } 1990 } 1991 1992 if (save_arg != NULL) // number for 'whichwrap' 1993 arg = save_arg; 1994 new_value_alloced = TRUE; 1995 } 1996 1997 /* 1998 * Set the new value. 1999 */ 2000 *(char_u **)(varp) = newval; 2001 2002 #if defined(FEAT_EVAL) 2003 if (!starting 2004 # ifdef FEAT_CRYPT 2005 && options[opt_idx].indir != PV_KEY 2006 # endif 2007 && origval != NULL && newval != NULL) 2008 { 2009 // origval may be freed by 2010 // did_set_string_option(), make a copy. 2011 saved_origval = vim_strsave(origval); 2012 // newval (and varp) may become invalid if the 2013 // buffer is closed by autocommands. 2014 saved_newval = vim_strsave(newval); 2015 if (origval_l != NULL) 2016 saved_origval_l = vim_strsave(origval_l); 2017 if (origval_g != NULL) 2018 saved_origval_g = vim_strsave(origval_g); 2019 } 2020 #endif 2021 2022 { 2023 long_u *p = insecure_flag(opt_idx, opt_flags); 2024 int secure_saved = secure; 2025 2026 // When an option is set in the sandbox, from a 2027 // modeline or in secure mode, then deal with side 2028 // effects in secure mode. Also when the value was 2029 // set with the P_INSECURE flag and is not 2030 // completely replaced. 2031 if ((opt_flags & OPT_MODELINE) 2032 #ifdef HAVE_SANDBOX 2033 || sandbox != 0 2034 #endif 2035 || (!value_is_replaced && (*p & P_INSECURE))) 2036 secure = 1; 2037 2038 // Handle side effects, and set the global value 2039 // for ":set" on local options. Note: when setting 2040 // 'syntax' or 'filetype' autocommands may be 2041 // triggered that can cause havoc. 2042 errmsg = did_set_string_option( 2043 opt_idx, (char_u **)varp, 2044 new_value_alloced, oldval, errbuf, 2045 opt_flags, &value_checked); 2046 2047 secure = secure_saved; 2048 } 2049 2050 #if defined(FEAT_EVAL) 2051 if (errmsg == NULL) 2052 trigger_optionsset_string( 2053 opt_idx, opt_flags, saved_origval, 2054 saved_origval_l, saved_origval_g, 2055 saved_newval); 2056 vim_free(saved_origval); 2057 vim_free(saved_origval_l); 2058 vim_free(saved_origval_g); 2059 vim_free(saved_newval); 2060 #endif 2061 // If error detected, print the error message. 2062 if (errmsg != NULL) 2063 goto skip; 2064 } 2065 else // key code option 2066 { 2067 char_u *p; 2068 2069 if (nextchar == '&') 2070 { 2071 if (add_termcap_entry(key_name, TRUE) == FAIL) 2072 errmsg = N_("E522: Not found in termcap"); 2073 } 2074 else 2075 { 2076 ++arg; // jump to after the '=' or ':' 2077 for (p = arg; *p && !VIM_ISWHITE(*p); ++p) 2078 if (*p == '\\' && p[1] != NUL) 2079 ++p; 2080 nextchar = *p; 2081 *p = NUL; 2082 add_termcode(key_name, arg, FALSE); 2083 *p = nextchar; 2084 } 2085 if (full_screen) 2086 ttest(FALSE); 2087 redraw_all_later(CLEAR); 2088 } 2089 } 2090 2091 if (opt_idx >= 0) 2092 did_set_option( 2093 opt_idx, opt_flags, value_is_replaced, value_checked); 2094 } 2095 2096 skip: 2097 /* 2098 * Advance to next argument. 2099 * - skip until a blank found, taking care of backslashes 2100 * - skip blanks 2101 * - skip one "=val" argument (for hidden options ":set gfn =xx") 2102 */ 2103 for (i = 0; i < 2 ; ++i) 2104 { 2105 while (*arg != NUL && !VIM_ISWHITE(*arg)) 2106 if (*arg++ == '\\' && *arg != NUL) 2107 ++arg; 2108 arg = skipwhite(arg); 2109 if (*arg != '=') 2110 break; 2111 } 2112 } 2113 2114 if (errmsg != NULL) 2115 { 2116 vim_strncpy(IObuff, (char_u *)_(errmsg), IOSIZE - 1); 2117 i = (int)STRLEN(IObuff) + 2; 2118 if (i + (arg - startarg) < IOSIZE) 2119 { 2120 // append the argument with the error 2121 STRCAT(IObuff, ": "); 2122 mch_memmove(IObuff + i, startarg, (arg - startarg)); 2123 IObuff[i + (arg - startarg)] = NUL; 2124 } 2125 // make sure all characters are printable 2126 trans_characters(IObuff, IOSIZE); 2127 2128 ++no_wait_return; // wait_return done later 2129 emsg((char *)IObuff); // show error highlighted 2130 --no_wait_return; 2131 2132 return FAIL; 2133 } 2134 2135 arg = skipwhite(arg); 2136 } 2137 2138 theend: 2139 if (silent_mode && did_show) 2140 { 2141 // After displaying option values in silent mode. 2142 silent_mode = FALSE; 2143 info_message = TRUE; // use mch_msg(), not mch_errmsg() 2144 msg_putchar('\n'); 2145 cursor_on(); // msg_start() switches it off 2146 out_flush(); 2147 silent_mode = TRUE; 2148 info_message = FALSE; // use mch_msg(), not mch_errmsg() 2149 } 2150 2151 return OK; 2152 } 2153 2154 /* 2155 * Call this when an option has been given a new value through a user command. 2156 * Sets the P_WAS_SET flag and takes care of the P_INSECURE flag. 2157 */ 2158 void 2159 did_set_option( 2160 int opt_idx, 2161 int opt_flags, // possibly with OPT_MODELINE 2162 int new_value, // value was replaced completely 2163 int value_checked) // value was checked to be safe, no need to set the 2164 // P_INSECURE flag. 2165 { 2166 long_u *p; 2167 2168 options[opt_idx].flags |= P_WAS_SET; 2169 2170 // When an option is set in the sandbox, from a modeline or in secure mode 2171 // set the P_INSECURE flag. Otherwise, if a new value is stored reset the 2172 // flag. 2173 p = insecure_flag(opt_idx, opt_flags); 2174 if (!value_checked && (secure 2175 #ifdef HAVE_SANDBOX 2176 || sandbox != 0 2177 #endif 2178 || (opt_flags & OPT_MODELINE))) 2179 *p = *p | P_INSECURE; 2180 else if (new_value) 2181 *p = *p & ~P_INSECURE; 2182 } 2183 2184 /* 2185 * Convert a key name or string into a key value. 2186 * Used for 'wildchar' and 'cedit' options. 2187 * When "multi_byte" is TRUE allow for multi-byte characters. 2188 */ 2189 int 2190 string_to_key(char_u *arg, int multi_byte) 2191 { 2192 if (*arg == '<') 2193 return find_key_option(arg + 1, TRUE); 2194 if (*arg == '^') 2195 return Ctrl_chr(arg[1]); 2196 if (multi_byte) 2197 return PTR2CHAR(arg); 2198 return *arg; 2199 } 2200 2201 #ifdef FEAT_TITLE 2202 /* 2203 * When changing 'title', 'titlestring', 'icon' or 'iconstring', call 2204 * maketitle() to create and display it. 2205 * When switching the title or icon off, call mch_restore_title() to get 2206 * the old value back. 2207 */ 2208 void 2209 did_set_title(void) 2210 { 2211 if (starting != NO_SCREEN 2212 #ifdef FEAT_GUI 2213 && !gui.starting 2214 #endif 2215 ) 2216 maketitle(); 2217 } 2218 #endif 2219 2220 /* 2221 * set_options_bin - called when 'bin' changes value. 2222 */ 2223 void 2224 set_options_bin( 2225 int oldval, 2226 int newval, 2227 int opt_flags) // OPT_LOCAL and/or OPT_GLOBAL 2228 { 2229 /* 2230 * The option values that are changed when 'bin' changes are 2231 * copied when 'bin is set and restored when 'bin' is reset. 2232 */ 2233 if (newval) 2234 { 2235 if (!oldval) // switched on 2236 { 2237 if (!(opt_flags & OPT_GLOBAL)) 2238 { 2239 curbuf->b_p_tw_nobin = curbuf->b_p_tw; 2240 curbuf->b_p_wm_nobin = curbuf->b_p_wm; 2241 curbuf->b_p_ml_nobin = curbuf->b_p_ml; 2242 curbuf->b_p_et_nobin = curbuf->b_p_et; 2243 } 2244 if (!(opt_flags & OPT_LOCAL)) 2245 { 2246 p_tw_nobin = p_tw; 2247 p_wm_nobin = p_wm; 2248 p_ml_nobin = p_ml; 2249 p_et_nobin = p_et; 2250 } 2251 } 2252 2253 if (!(opt_flags & OPT_GLOBAL)) 2254 { 2255 curbuf->b_p_tw = 0; // no automatic line wrap 2256 curbuf->b_p_wm = 0; // no automatic line wrap 2257 curbuf->b_p_ml = 0; // no modelines 2258 curbuf->b_p_et = 0; // no expandtab 2259 } 2260 if (!(opt_flags & OPT_LOCAL)) 2261 { 2262 p_tw = 0; 2263 p_wm = 0; 2264 p_ml = FALSE; 2265 p_et = FALSE; 2266 p_bin = TRUE; // needed when called for the "-b" argument 2267 } 2268 } 2269 else if (oldval) // switched off 2270 { 2271 if (!(opt_flags & OPT_GLOBAL)) 2272 { 2273 curbuf->b_p_tw = curbuf->b_p_tw_nobin; 2274 curbuf->b_p_wm = curbuf->b_p_wm_nobin; 2275 curbuf->b_p_ml = curbuf->b_p_ml_nobin; 2276 curbuf->b_p_et = curbuf->b_p_et_nobin; 2277 } 2278 if (!(opt_flags & OPT_LOCAL)) 2279 { 2280 p_tw = p_tw_nobin; 2281 p_wm = p_wm_nobin; 2282 p_ml = p_ml_nobin; 2283 p_et = p_et_nobin; 2284 } 2285 } 2286 } 2287 2288 /* 2289 * Expand environment variables for some string options. 2290 * These string options cannot be indirect! 2291 * If "val" is NULL expand the current value of the option. 2292 * Return pointer to NameBuff, or NULL when not expanded. 2293 */ 2294 static char_u * 2295 option_expand(int opt_idx, char_u *val) 2296 { 2297 // if option doesn't need expansion nothing to do 2298 if (!(options[opt_idx].flags & P_EXPAND) || options[opt_idx].var == NULL) 2299 return NULL; 2300 2301 // If val is longer than MAXPATHL no meaningful expansion can be done, 2302 // expand_env() would truncate the string. 2303 if (val != NULL && STRLEN(val) > MAXPATHL) 2304 return NULL; 2305 2306 if (val == NULL) 2307 val = *(char_u **)options[opt_idx].var; 2308 2309 /* 2310 * Expanding this with NameBuff, expand_env() must not be passed IObuff. 2311 * Escape spaces when expanding 'tags', they are used to separate file 2312 * names. 2313 * For 'spellsuggest' expand after "file:". 2314 */ 2315 expand_env_esc(val, NameBuff, MAXPATHL, 2316 (char_u **)options[opt_idx].var == &p_tags, FALSE, 2317 #ifdef FEAT_SPELL 2318 (char_u **)options[opt_idx].var == &p_sps ? (char_u *)"file:" : 2319 #endif 2320 NULL); 2321 if (STRCMP(NameBuff, val) == 0) // they are the same 2322 return NULL; 2323 2324 return NameBuff; 2325 } 2326 2327 /* 2328 * After setting various option values: recompute variables that depend on 2329 * option values. 2330 */ 2331 static void 2332 didset_options(void) 2333 { 2334 // initialize the table for 'iskeyword' et.al. 2335 (void)init_chartab(); 2336 2337 didset_string_options(); 2338 2339 #ifdef FEAT_SPELL 2340 (void)spell_check_msm(); 2341 (void)spell_check_sps(); 2342 (void)compile_cap_prog(curwin->w_s); 2343 (void)did_set_spell_option(TRUE); 2344 #endif 2345 #ifdef FEAT_CMDWIN 2346 // set cedit_key 2347 (void)check_cedit(); 2348 #endif 2349 #ifdef FEAT_LINEBREAK 2350 // initialize the table for 'breakat'. 2351 fill_breakat_flags(); 2352 #endif 2353 after_copy_winopt(curwin); 2354 } 2355 2356 /* 2357 * More side effects of setting options. 2358 */ 2359 static void 2360 didset_options2(void) 2361 { 2362 // Initialize the highlight_attr[] table. 2363 (void)highlight_changed(); 2364 2365 // Parse default for 'wildmode' 2366 check_opt_wim(); 2367 2368 // Parse default for 'listchars'. 2369 (void)set_chars_option(curwin, &curwin->w_p_lcs); 2370 2371 // Parse default for 'fillchars'. 2372 (void)set_chars_option(curwin, &p_fcs); 2373 2374 #ifdef FEAT_CLIPBOARD 2375 // Parse default for 'clipboard' 2376 (void)check_clipboard_option(); 2377 #endif 2378 #ifdef FEAT_VARTABS 2379 vim_free(curbuf->b_p_vsts_array); 2380 tabstop_set(curbuf->b_p_vsts, &curbuf->b_p_vsts_array); 2381 vim_free(curbuf->b_p_vts_array); 2382 tabstop_set(curbuf->b_p_vts, &curbuf->b_p_vts_array); 2383 #endif 2384 } 2385 2386 /* 2387 * Check for string options that are NULL (normally only termcap options). 2388 */ 2389 void 2390 check_options(void) 2391 { 2392 int opt_idx; 2393 2394 for (opt_idx = 0; options[opt_idx].fullname != NULL; opt_idx++) 2395 if ((options[opt_idx].flags & P_STRING) && options[opt_idx].var != NULL) 2396 check_string_option((char_u **)get_varp(&(options[opt_idx]))); 2397 } 2398 2399 /* 2400 * Return the option index found by a pointer into term_strings[]. 2401 * Return -1 if not found. 2402 */ 2403 int 2404 get_term_opt_idx(char_u **p) 2405 { 2406 int opt_idx; 2407 2408 for (opt_idx = 1; options[opt_idx].fullname != NULL; opt_idx++) 2409 if (options[opt_idx].var == (char_u *)p) 2410 return opt_idx; 2411 return -1; // cannot happen: didn't find it! 2412 } 2413 2414 /* 2415 * Mark a terminal option as allocated, found by a pointer into term_strings[]. 2416 * Return the option index or -1 if not found. 2417 */ 2418 int 2419 set_term_option_alloced(char_u **p) 2420 { 2421 int opt_idx = get_term_opt_idx(p); 2422 2423 if (opt_idx >= 0) 2424 options[opt_idx].flags |= P_ALLOCED; 2425 return opt_idx; 2426 } 2427 2428 #if defined(FEAT_EVAL) || defined(PROTO) 2429 /* 2430 * Return TRUE when option "opt" was set from a modeline or in secure mode. 2431 * Return FALSE when it wasn't. 2432 * Return -1 for an unknown option. 2433 */ 2434 int 2435 was_set_insecurely(char_u *opt, int opt_flags) 2436 { 2437 int idx = findoption(opt); 2438 long_u *flagp; 2439 2440 if (idx >= 0) 2441 { 2442 flagp = insecure_flag(idx, opt_flags); 2443 return (*flagp & P_INSECURE) != 0; 2444 } 2445 internal_error("was_set_insecurely()"); 2446 return -1; 2447 } 2448 2449 /* 2450 * Get a pointer to the flags used for the P_INSECURE flag of option 2451 * "opt_idx". For some local options a local flags field is used. 2452 * NOTE: Caller must make sure that "curwin" is set to the window from which 2453 * the option is used. 2454 */ 2455 static long_u * 2456 insecure_flag(int opt_idx, int opt_flags) 2457 { 2458 if (opt_flags & OPT_LOCAL) 2459 switch ((int)options[opt_idx].indir) 2460 { 2461 #ifdef FEAT_STL_OPT 2462 case PV_STL: return &curwin->w_p_stl_flags; 2463 #endif 2464 #ifdef FEAT_EVAL 2465 # ifdef FEAT_FOLDING 2466 case PV_FDE: return &curwin->w_p_fde_flags; 2467 case PV_FDT: return &curwin->w_p_fdt_flags; 2468 # endif 2469 # ifdef FEAT_BEVAL 2470 case PV_BEXPR: return &curbuf->b_p_bexpr_flags; 2471 # endif 2472 # if defined(FEAT_CINDENT) 2473 case PV_INDE: return &curbuf->b_p_inde_flags; 2474 # endif 2475 case PV_FEX: return &curbuf->b_p_fex_flags; 2476 # ifdef FEAT_FIND_ID 2477 case PV_INEX: return &curbuf->b_p_inex_flags; 2478 # endif 2479 #endif 2480 } 2481 2482 // Nothing special, return global flags field. 2483 return &options[opt_idx].flags; 2484 } 2485 #endif 2486 2487 #if defined(FEAT_TITLE) || defined(PROTO) 2488 /* 2489 * Redraw the window title and/or tab page text later. 2490 */ 2491 void redraw_titles(void) 2492 { 2493 need_maketitle = TRUE; 2494 redraw_tabline = TRUE; 2495 } 2496 #endif 2497 2498 /* 2499 * Return TRUE if "val" is a valid name: only consists of alphanumeric ASCII 2500 * characters or characters in "allowed". 2501 */ 2502 int 2503 valid_name(char_u *val, char *allowed) 2504 { 2505 char_u *s; 2506 2507 for (s = val; *s != NUL; ++s) 2508 if (!ASCII_ISALNUM(*s) && vim_strchr((char_u *)allowed, *s) == NULL) 2509 return FALSE; 2510 return TRUE; 2511 } 2512 2513 #if defined(FEAT_EVAL) || defined(PROTO) 2514 /* 2515 * Set the script_ctx for an option, taking care of setting the buffer- or 2516 * window-local value. 2517 */ 2518 void 2519 set_option_sctx_idx(int opt_idx, int opt_flags, sctx_T script_ctx) 2520 { 2521 int both = (opt_flags & (OPT_LOCAL | OPT_GLOBAL)) == 0; 2522 int indir = (int)options[opt_idx].indir; 2523 sctx_T new_script_ctx = script_ctx; 2524 2525 // Modeline already has the line number set. 2526 if (!(opt_flags & OPT_MODELINE)) 2527 new_script_ctx.sc_lnum += SOURCING_LNUM; 2528 2529 // Remember where the option was set. For local options need to do that 2530 // in the buffer or window structure. 2531 if (both || (opt_flags & OPT_GLOBAL) || (indir & (PV_BUF|PV_WIN)) == 0) 2532 options[opt_idx].script_ctx = new_script_ctx; 2533 if (both || (opt_flags & OPT_LOCAL)) 2534 { 2535 if (indir & PV_BUF) 2536 curbuf->b_p_script_ctx[indir & PV_MASK] = new_script_ctx; 2537 else if (indir & PV_WIN) 2538 curwin->w_p_script_ctx[indir & PV_MASK] = new_script_ctx; 2539 } 2540 } 2541 2542 /* 2543 * Set the script_ctx for a termcap option. 2544 * "name" must be the two character code, e.g. "RV". 2545 * When "name" is NULL use "opt_idx". 2546 */ 2547 void 2548 set_term_option_sctx_idx(char *name, int opt_idx) 2549 { 2550 char_u buf[5]; 2551 int idx; 2552 2553 if (name == NULL) 2554 idx = opt_idx; 2555 else 2556 { 2557 buf[0] = 't'; 2558 buf[1] = '_'; 2559 buf[2] = name[0]; 2560 buf[3] = name[1]; 2561 buf[4] = 0; 2562 idx = findoption(buf); 2563 } 2564 if (idx >= 0) 2565 set_option_sctx_idx(idx, OPT_GLOBAL, current_sctx); 2566 } 2567 #endif 2568 2569 #if defined(FEAT_EVAL) 2570 /* 2571 * Apply the OptionSet autocommand. 2572 */ 2573 static void 2574 apply_optionset_autocmd( 2575 int opt_idx, 2576 long opt_flags, 2577 long oldval, 2578 long oldval_g, 2579 long newval, 2580 char *errmsg) 2581 { 2582 char_u buf_old[12], buf_old_global[12], buf_new[12], buf_type[12]; 2583 2584 // Don't do this while starting up, failure or recursively. 2585 if (starting || errmsg != NULL || *get_vim_var_str(VV_OPTION_TYPE) != NUL) 2586 return; 2587 2588 vim_snprintf((char *)buf_old, sizeof(buf_old), "%ld", oldval); 2589 vim_snprintf((char *)buf_old_global, sizeof(buf_old_global), "%ld", 2590 oldval_g); 2591 vim_snprintf((char *)buf_new, sizeof(buf_new), "%ld", newval); 2592 vim_snprintf((char *)buf_type, sizeof(buf_type), "%s", 2593 (opt_flags & OPT_LOCAL) ? "local" : "global"); 2594 set_vim_var_string(VV_OPTION_NEW, buf_new, -1); 2595 set_vim_var_string(VV_OPTION_OLD, buf_old, -1); 2596 set_vim_var_string(VV_OPTION_TYPE, buf_type, -1); 2597 if (opt_flags & OPT_LOCAL) 2598 { 2599 set_vim_var_string(VV_OPTION_COMMAND, (char_u *)"setlocal", -1); 2600 set_vim_var_string(VV_OPTION_OLDLOCAL, buf_old, -1); 2601 } 2602 if (opt_flags & OPT_GLOBAL) 2603 { 2604 set_vim_var_string(VV_OPTION_COMMAND, (char_u *)"setglobal", -1); 2605 set_vim_var_string(VV_OPTION_OLDGLOBAL, buf_old, -1); 2606 } 2607 if ((opt_flags & (OPT_LOCAL | OPT_GLOBAL)) == 0) 2608 { 2609 set_vim_var_string(VV_OPTION_COMMAND, (char_u *)"set", -1); 2610 set_vim_var_string(VV_OPTION_OLDLOCAL, buf_old, -1); 2611 set_vim_var_string(VV_OPTION_OLDGLOBAL, buf_old_global, -1); 2612 } 2613 if (opt_flags & OPT_MODELINE) 2614 { 2615 set_vim_var_string(VV_OPTION_COMMAND, (char_u *)"modeline", -1); 2616 set_vim_var_string(VV_OPTION_OLDLOCAL, buf_old, -1); 2617 } 2618 apply_autocmds(EVENT_OPTIONSET, (char_u *)options[opt_idx].fullname, 2619 NULL, FALSE, NULL); 2620 reset_v_option_vars(); 2621 } 2622 #endif 2623 2624 /* 2625 * Set the value of a boolean option, and take care of side effects. 2626 * Returns NULL for success, or an error message for an error. 2627 */ 2628 static char * 2629 set_bool_option( 2630 int opt_idx, // index in options[] table 2631 char_u *varp, // pointer to the option variable 2632 int value, // new value 2633 int opt_flags) // OPT_LOCAL and/or OPT_GLOBAL 2634 { 2635 int old_value = *(int *)varp; 2636 #if defined(FEAT_EVAL) 2637 int old_global_value = 0; 2638 #endif 2639 2640 // Disallow changing some options from secure mode 2641 if ((secure 2642 #ifdef HAVE_SANDBOX 2643 || sandbox != 0 2644 #endif 2645 ) && (options[opt_idx].flags & P_SECURE)) 2646 return e_secure; 2647 2648 #if defined(FEAT_EVAL) 2649 // Save the global value before changing anything. This is needed as for 2650 // a global-only option setting the "local value" in fact sets the global 2651 // value (since there is only one value). 2652 if ((opt_flags & (OPT_LOCAL | OPT_GLOBAL)) == 0) 2653 old_global_value = *(int *)get_varp_scope(&(options[opt_idx]), 2654 OPT_GLOBAL); 2655 #endif 2656 2657 *(int *)varp = value; // set the new value 2658 #ifdef FEAT_EVAL 2659 // Remember where the option was set. 2660 set_option_sctx_idx(opt_idx, opt_flags, current_sctx); 2661 #endif 2662 2663 #ifdef FEAT_GUI 2664 need_mouse_correct = TRUE; 2665 #endif 2666 2667 // May set global value for local option. 2668 if ((opt_flags & (OPT_LOCAL | OPT_GLOBAL)) == 0) 2669 *(int *)get_varp_scope(&(options[opt_idx]), OPT_GLOBAL) = value; 2670 2671 /* 2672 * Handle side effects of changing a bool option. 2673 */ 2674 2675 // 'compatible' 2676 if ((int *)varp == &p_cp) 2677 compatible_set(); 2678 2679 #ifdef FEAT_LANGMAP 2680 if ((int *)varp == &p_lrm) 2681 // 'langremap' -> !'langnoremap' 2682 p_lnr = !p_lrm; 2683 else if ((int *)varp == &p_lnr) 2684 // 'langnoremap' -> !'langremap' 2685 p_lrm = !p_lnr; 2686 #endif 2687 2688 #ifdef FEAT_SYN_HL 2689 else if ((int *)varp == &curwin->w_p_cul && !value && old_value) 2690 reset_cursorline(); 2691 #endif 2692 2693 #ifdef FEAT_PERSISTENT_UNDO 2694 // 'undofile' 2695 else if ((int *)varp == &curbuf->b_p_udf || (int *)varp == &p_udf) 2696 { 2697 // Only take action when the option was set. When reset we do not 2698 // delete the undo file, the option may be set again without making 2699 // any changes in between. 2700 if (curbuf->b_p_udf || p_udf) 2701 { 2702 char_u hash[UNDO_HASH_SIZE]; 2703 buf_T *save_curbuf = curbuf; 2704 2705 FOR_ALL_BUFFERS(curbuf) 2706 { 2707 // When 'undofile' is set globally: for every buffer, otherwise 2708 // only for the current buffer: Try to read in the undofile, 2709 // if one exists, the buffer wasn't changed and the buffer was 2710 // loaded 2711 if ((curbuf == save_curbuf 2712 || (opt_flags & OPT_GLOBAL) || opt_flags == 0) 2713 && !curbufIsChanged() && curbuf->b_ml.ml_mfp != NULL) 2714 { 2715 u_compute_hash(hash); 2716 u_read_undo(NULL, hash, curbuf->b_fname); 2717 } 2718 } 2719 curbuf = save_curbuf; 2720 } 2721 } 2722 #endif 2723 2724 else if ((int *)varp == &curbuf->b_p_ro) 2725 { 2726 // when 'readonly' is reset globally, also reset readonlymode 2727 if (!curbuf->b_p_ro && (opt_flags & OPT_LOCAL) == 0) 2728 readonlymode = FALSE; 2729 2730 // when 'readonly' is set may give W10 again 2731 if (curbuf->b_p_ro) 2732 curbuf->b_did_warn = FALSE; 2733 2734 #ifdef FEAT_TITLE 2735 redraw_titles(); 2736 #endif 2737 } 2738 2739 #ifdef FEAT_GUI 2740 else if ((int *)varp == &p_mh) 2741 { 2742 if (!p_mh) 2743 gui_mch_mousehide(FALSE); 2744 } 2745 #endif 2746 2747 // when 'modifiable' is changed, redraw the window title 2748 else if ((int *)varp == &curbuf->b_p_ma) 2749 { 2750 # ifdef FEAT_TERMINAL 2751 // Cannot set 'modifiable' when in Terminal mode. 2752 if (curbuf->b_p_ma && (term_in_normal_mode() || (bt_terminal(curbuf) 2753 && curbuf->b_term != NULL && !term_is_finished(curbuf)))) 2754 { 2755 curbuf->b_p_ma = FALSE; 2756 return N_("E946: Cannot make a terminal with running job modifiable"); 2757 } 2758 # endif 2759 # ifdef FEAT_TITLE 2760 redraw_titles(); 2761 # endif 2762 } 2763 #ifdef FEAT_TITLE 2764 // when 'endofline' is changed, redraw the window title 2765 else if ((int *)varp == &curbuf->b_p_eol) 2766 { 2767 redraw_titles(); 2768 } 2769 // when 'fixeol' is changed, redraw the window title 2770 else if ((int *)varp == &curbuf->b_p_fixeol) 2771 { 2772 redraw_titles(); 2773 } 2774 // when 'bomb' is changed, redraw the window title and tab page text 2775 else if ((int *)varp == &curbuf->b_p_bomb) 2776 { 2777 redraw_titles(); 2778 } 2779 #endif 2780 2781 // when 'bin' is set also set some other options 2782 else if ((int *)varp == &curbuf->b_p_bin) 2783 { 2784 set_options_bin(old_value, curbuf->b_p_bin, opt_flags); 2785 #ifdef FEAT_TITLE 2786 redraw_titles(); 2787 #endif 2788 } 2789 2790 // when 'buflisted' changes, trigger autocommands 2791 else if ((int *)varp == &curbuf->b_p_bl && old_value != curbuf->b_p_bl) 2792 { 2793 apply_autocmds(curbuf->b_p_bl ? EVENT_BUFADD : EVENT_BUFDELETE, 2794 NULL, NULL, TRUE, curbuf); 2795 } 2796 2797 // when 'swf' is set, create swapfile, when reset remove swapfile 2798 else if ((int *)varp == &curbuf->b_p_swf) 2799 { 2800 if (curbuf->b_p_swf && p_uc) 2801 ml_open_file(curbuf); // create the swap file 2802 else 2803 // no need to reset curbuf->b_may_swap, ml_open_file() will check 2804 // buf->b_p_swf 2805 mf_close_file(curbuf, TRUE); // remove the swap file 2806 } 2807 2808 // when 'terse' is set change 'shortmess' 2809 else if ((int *)varp == &p_terse) 2810 { 2811 char_u *p; 2812 2813 p = vim_strchr(p_shm, SHM_SEARCH); 2814 2815 // insert 's' in p_shm 2816 if (p_terse && p == NULL) 2817 { 2818 STRCPY(IObuff, p_shm); 2819 STRCAT(IObuff, "s"); 2820 set_string_option_direct((char_u *)"shm", -1, IObuff, OPT_FREE, 0); 2821 } 2822 // remove 's' from p_shm 2823 else if (!p_terse && p != NULL) 2824 STRMOVE(p, p + 1); 2825 } 2826 2827 // when 'paste' is set or reset also change other options 2828 else if ((int *)varp == &p_paste) 2829 { 2830 paste_option_changed(); 2831 } 2832 2833 // when 'insertmode' is set from an autocommand need to do work here 2834 else if ((int *)varp == &p_im) 2835 { 2836 if (p_im) 2837 { 2838 if ((State & INSERT) == 0) 2839 need_start_insertmode = TRUE; 2840 stop_insert_mode = FALSE; 2841 } 2842 // only reset if it was set previously 2843 else if (old_value) 2844 { 2845 need_start_insertmode = FALSE; 2846 stop_insert_mode = TRUE; 2847 if (restart_edit != 0 && mode_displayed) 2848 clear_cmdline = TRUE; // remove "(insert)" 2849 restart_edit = 0; 2850 } 2851 } 2852 2853 // when 'ignorecase' is set or reset and 'hlsearch' is set, redraw 2854 else if ((int *)varp == &p_ic && p_hls) 2855 { 2856 redraw_all_later(SOME_VALID); 2857 } 2858 2859 #ifdef FEAT_SEARCH_EXTRA 2860 // when 'hlsearch' is set or reset: reset no_hlsearch 2861 else if ((int *)varp == &p_hls) 2862 { 2863 set_no_hlsearch(FALSE); 2864 } 2865 #endif 2866 2867 // when 'scrollbind' is set: snapshot the current position to avoid a jump 2868 // at the end of normal_cmd() 2869 else if ((int *)varp == &curwin->w_p_scb) 2870 { 2871 if (curwin->w_p_scb) 2872 { 2873 do_check_scrollbind(FALSE); 2874 curwin->w_scbind_pos = curwin->w_topline; 2875 } 2876 } 2877 2878 #if defined(FEAT_QUICKFIX) 2879 // There can be only one window with 'previewwindow' set. 2880 else if ((int *)varp == &curwin->w_p_pvw) 2881 { 2882 if (curwin->w_p_pvw) 2883 { 2884 win_T *win; 2885 2886 FOR_ALL_WINDOWS(win) 2887 if (win->w_p_pvw && win != curwin) 2888 { 2889 curwin->w_p_pvw = FALSE; 2890 return N_("E590: A preview window already exists"); 2891 } 2892 } 2893 } 2894 #endif 2895 2896 // when 'textmode' is set or reset also change 'fileformat' 2897 else if ((int *)varp == &curbuf->b_p_tx) 2898 { 2899 set_fileformat(curbuf->b_p_tx ? EOL_DOS : EOL_UNIX, opt_flags); 2900 } 2901 2902 // when 'textauto' is set or reset also change 'fileformats' 2903 else if ((int *)varp == &p_ta) 2904 { 2905 set_string_option_direct((char_u *)"ffs", -1, 2906 p_ta ? (char_u *)DFLT_FFS_VIM : (char_u *)"", 2907 OPT_FREE | opt_flags, 0); 2908 } 2909 2910 /* 2911 * When 'lisp' option changes include/exclude '-' in 2912 * keyword characters. 2913 */ 2914 #ifdef FEAT_LISP 2915 else if (varp == (char_u *)&(curbuf->b_p_lisp)) 2916 { 2917 (void)buf_init_chartab(curbuf, FALSE); // ignore errors 2918 } 2919 #endif 2920 2921 #ifdef FEAT_TITLE 2922 // when 'title' changed, may need to change the title; same for 'icon' 2923 else if ((int *)varp == &p_title || (int *)varp == &p_icon) 2924 { 2925 did_set_title(); 2926 } 2927 #endif 2928 2929 else if ((int *)varp == &curbuf->b_changed) 2930 { 2931 if (!value) 2932 save_file_ff(curbuf); // Buffer is unchanged 2933 #ifdef FEAT_TITLE 2934 redraw_titles(); 2935 #endif 2936 modified_was_set = value; 2937 } 2938 2939 #ifdef BACKSLASH_IN_FILENAME 2940 else if ((int *)varp == &p_ssl) 2941 { 2942 if (p_ssl) 2943 { 2944 psepc = '/'; 2945 psepcN = '\\'; 2946 pseps[0] = '/'; 2947 } 2948 else 2949 { 2950 psepc = '\\'; 2951 psepcN = '/'; 2952 pseps[0] = '\\'; 2953 } 2954 2955 // need to adjust the file name arguments and buffer names. 2956 buflist_slash_adjust(); 2957 alist_slash_adjust(); 2958 # ifdef FEAT_EVAL 2959 scriptnames_slash_adjust(); 2960 # endif 2961 } 2962 #endif 2963 2964 // If 'wrap' is set, set w_leftcol to zero. 2965 else if ((int *)varp == &curwin->w_p_wrap) 2966 { 2967 if (curwin->w_p_wrap) 2968 curwin->w_leftcol = 0; 2969 } 2970 2971 else if ((int *)varp == &p_ea) 2972 { 2973 if (p_ea && !old_value) 2974 win_equal(curwin, FALSE, 0); 2975 } 2976 2977 else if ((int *)varp == &p_wiv) 2978 { 2979 /* 2980 * When 'weirdinvert' changed, set/reset 't_xs'. 2981 * Then set 'weirdinvert' according to value of 't_xs'. 2982 */ 2983 if (p_wiv && !old_value) 2984 T_XS = (char_u *)"y"; 2985 else if (!p_wiv && old_value) 2986 T_XS = empty_option; 2987 p_wiv = (*T_XS != NUL); 2988 } 2989 2990 #ifdef FEAT_BEVAL_GUI 2991 else if ((int *)varp == &p_beval) 2992 { 2993 if (!balloonEvalForTerm) 2994 { 2995 if (p_beval && !old_value) 2996 gui_mch_enable_beval_area(balloonEval); 2997 else if (!p_beval && old_value) 2998 gui_mch_disable_beval_area(balloonEval); 2999 } 3000 } 3001 #endif 3002 #ifdef FEAT_BEVAL_TERM 3003 else if ((int *)varp == &p_bevalterm) 3004 { 3005 mch_bevalterm_changed(); 3006 } 3007 #endif 3008 3009 #ifdef FEAT_AUTOCHDIR 3010 else if ((int *)varp == &p_acd) 3011 { 3012 // Change directories when the 'acd' option is set now. 3013 DO_AUTOCHDIR; 3014 } 3015 #endif 3016 3017 #ifdef FEAT_DIFF 3018 // 'diff' 3019 else if ((int *)varp == &curwin->w_p_diff) 3020 { 3021 // May add or remove the buffer from the list of diff buffers. 3022 diff_buf_adjust(curwin); 3023 # ifdef FEAT_FOLDING 3024 if (foldmethodIsDiff(curwin)) 3025 foldUpdateAll(curwin); 3026 # endif 3027 } 3028 #endif 3029 3030 #ifdef HAVE_INPUT_METHOD 3031 // 'imdisable' 3032 else if ((int *)varp == &p_imdisable) 3033 { 3034 // Only de-activate it here, it will be enabled when changing mode. 3035 if (p_imdisable) 3036 im_set_active(FALSE); 3037 else if (State & INSERT) 3038 // When the option is set from an autocommand, it may need to take 3039 // effect right away. 3040 im_set_active(curbuf->b_p_iminsert == B_IMODE_IM); 3041 } 3042 #endif 3043 3044 #ifdef FEAT_SPELL 3045 // 'spell' 3046 else if ((int *)varp == &curwin->w_p_spell) 3047 { 3048 if (curwin->w_p_spell) 3049 { 3050 char *errmsg = did_set_spelllang(curwin); 3051 3052 if (errmsg != NULL) 3053 emsg(_(errmsg)); 3054 } 3055 } 3056 #endif 3057 3058 #ifdef FEAT_ARABIC 3059 if ((int *)varp == &curwin->w_p_arab) 3060 { 3061 if (curwin->w_p_arab) 3062 { 3063 /* 3064 * 'arabic' is set, handle various sub-settings. 3065 */ 3066 if (!p_tbidi) 3067 { 3068 // set rightleft mode 3069 if (!curwin->w_p_rl) 3070 { 3071 curwin->w_p_rl = TRUE; 3072 changed_window_setting(); 3073 } 3074 3075 // Enable Arabic shaping (major part of what Arabic requires) 3076 if (!p_arshape) 3077 { 3078 p_arshape = TRUE; 3079 redraw_later_clear(); 3080 } 3081 } 3082 3083 // Arabic requires a utf-8 encoding, inform the user if its not 3084 // set. 3085 if (STRCMP(p_enc, "utf-8") != 0) 3086 { 3087 static char *w_arabic = N_("W17: Arabic requires UTF-8, do ':set encoding=utf-8'"); 3088 3089 msg_source(HL_ATTR(HLF_W)); 3090 msg_attr(_(w_arabic), HL_ATTR(HLF_W)); 3091 #ifdef FEAT_EVAL 3092 set_vim_var_string(VV_WARNINGMSG, (char_u *)_(w_arabic), -1); 3093 #endif 3094 } 3095 3096 // set 'delcombine' 3097 p_deco = TRUE; 3098 3099 # ifdef FEAT_KEYMAP 3100 // Force-set the necessary keymap for arabic 3101 set_option_value((char_u *)"keymap", 0L, (char_u *)"arabic", 3102 OPT_LOCAL); 3103 # endif 3104 } 3105 else 3106 { 3107 /* 3108 * 'arabic' is reset, handle various sub-settings. 3109 */ 3110 if (!p_tbidi) 3111 { 3112 // reset rightleft mode 3113 if (curwin->w_p_rl) 3114 { 3115 curwin->w_p_rl = FALSE; 3116 changed_window_setting(); 3117 } 3118 3119 // 'arabicshape' isn't reset, it is a global option and 3120 // another window may still need it "on". 3121 } 3122 3123 // 'delcombine' isn't reset, it is a global option and another 3124 // window may still want it "on". 3125 3126 # ifdef FEAT_KEYMAP 3127 // Revert to the default keymap 3128 curbuf->b_p_iminsert = B_IMODE_NONE; 3129 curbuf->b_p_imsearch = B_IMODE_USE_INSERT; 3130 # endif 3131 } 3132 } 3133 3134 #endif 3135 3136 #if defined(FEAT_SIGNS) && defined(FEAT_GUI) 3137 else if (((int *)varp == &curwin->w_p_nu 3138 || (int *)varp == &curwin->w_p_rnu) 3139 && gui.in_use 3140 && (*curwin->w_p_scl == 'n' && *(curwin->w_p_scl + 1) == 'u') 3141 && curbuf->b_signlist != NULL) 3142 { 3143 // If the 'number' or 'relativenumber' options are modified and 3144 // 'signcolumn' is set to 'number', then clear the screen for a full 3145 // refresh. Otherwise the sign icons are not displayed properly in the 3146 // number column. If the 'number' option is set and only the 3147 // 'relativenumber' option is toggled, then don't refresh the screen 3148 // (optimization). 3149 if (!(curwin->w_p_nu && ((int *)varp == &curwin->w_p_rnu))) 3150 redraw_all_later(CLEAR); 3151 } 3152 #endif 3153 3154 #ifdef FEAT_TERMGUICOLORS 3155 // 'termguicolors' 3156 else if ((int *)varp == &p_tgc) 3157 { 3158 # ifdef FEAT_VTP 3159 // Do not turn on 'tgc' when 24-bit colors are not supported. 3160 if ( 3161 # ifdef VIMDLL 3162 !gui.in_use && !gui.starting && 3163 # endif 3164 !has_vtp_working()) 3165 { 3166 p_tgc = 0; 3167 return N_("E954: 24-bit colors are not supported on this environment"); 3168 } 3169 if (is_term_win32()) 3170 swap_tcap(); 3171 # endif 3172 # ifdef FEAT_GUI 3173 if (!gui.in_use && !gui.starting) 3174 # endif 3175 highlight_gui_started(); 3176 # ifdef FEAT_VTP 3177 // reset t_Co 3178 if (is_term_win32()) 3179 { 3180 control_console_color_rgb(); 3181 set_termname(T_NAME); 3182 init_highlight(TRUE, FALSE); 3183 } 3184 # endif 3185 } 3186 #endif 3187 3188 /* 3189 * End of handling side effects for bool options. 3190 */ 3191 3192 // after handling side effects, call autocommand 3193 3194 options[opt_idx].flags |= P_WAS_SET; 3195 3196 #if defined(FEAT_EVAL) 3197 apply_optionset_autocmd(opt_idx, opt_flags, 3198 (long)(old_value ? TRUE : FALSE), 3199 (long)(old_global_value ? TRUE : FALSE), 3200 (long)(value ? TRUE : FALSE), NULL); 3201 #endif 3202 3203 comp_col(); // in case 'ruler' or 'showcmd' changed 3204 if (curwin->w_curswant != MAXCOL 3205 && (options[opt_idx].flags & (P_CURSWANT | P_RALL)) != 0) 3206 curwin->w_set_curswant = TRUE; 3207 3208 if ((opt_flags & OPT_NO_REDRAW) == 0) 3209 check_redraw(options[opt_idx].flags); 3210 3211 return NULL; 3212 } 3213 3214 /* 3215 * Set the value of a number option, and take care of side effects. 3216 * Returns NULL for success, or an error message for an error. 3217 */ 3218 static char * 3219 set_num_option( 3220 int opt_idx, // index in options[] table 3221 char_u *varp, // pointer to the option variable 3222 long value, // new value 3223 char *errbuf, // buffer for error messages 3224 size_t errbuflen, // length of "errbuf" 3225 int opt_flags) // OPT_LOCAL, OPT_GLOBAL, 3226 // OPT_MODELINE, etc. 3227 { 3228 char *errmsg = NULL; 3229 long old_value = *(long *)varp; 3230 #if defined(FEAT_EVAL) 3231 long old_global_value = 0; // only used when setting a local and 3232 // global option 3233 #endif 3234 long old_Rows = Rows; // remember old Rows 3235 long old_Columns = Columns; // remember old Columns 3236 long *pp = (long *)varp; 3237 3238 // Disallow changing some options from secure mode. 3239 if ((secure 3240 #ifdef HAVE_SANDBOX 3241 || sandbox != 0 3242 #endif 3243 ) && (options[opt_idx].flags & P_SECURE)) 3244 return e_secure; 3245 3246 #if defined(FEAT_EVAL) 3247 // Save the global value before changing anything. This is needed as for 3248 // a global-only option setting the "local value" in fact sets the global 3249 // value (since there is only one value). 3250 if ((opt_flags & (OPT_LOCAL | OPT_GLOBAL)) == 0) 3251 old_global_value = *(long *)get_varp_scope(&(options[opt_idx]), 3252 OPT_GLOBAL); 3253 #endif 3254 3255 *pp = value; 3256 #ifdef FEAT_EVAL 3257 // Remember where the option was set. 3258 set_option_sctx_idx(opt_idx, opt_flags, current_sctx); 3259 #endif 3260 #ifdef FEAT_GUI 3261 need_mouse_correct = TRUE; 3262 #endif 3263 3264 if (curbuf->b_p_sw < 0) 3265 { 3266 errmsg = e_positive; 3267 #ifdef FEAT_VARTABS 3268 // Use the first 'vartabstop' value, or 'tabstop' if vts isn't in use. 3269 curbuf->b_p_sw = tabstop_count(curbuf->b_p_vts_array) > 0 3270 ? tabstop_first(curbuf->b_p_vts_array) 3271 : curbuf->b_p_ts; 3272 #else 3273 curbuf->b_p_sw = curbuf->b_p_ts; 3274 #endif 3275 } 3276 3277 /* 3278 * Number options that need some action when changed 3279 */ 3280 if (pp == &p_wh || pp == &p_hh) 3281 { 3282 // 'winheight' and 'helpheight' 3283 if (p_wh < 1) 3284 { 3285 errmsg = e_positive; 3286 p_wh = 1; 3287 } 3288 if (p_wmh > p_wh) 3289 { 3290 errmsg = e_winheight; 3291 p_wh = p_wmh; 3292 } 3293 if (p_hh < 0) 3294 { 3295 errmsg = e_positive; 3296 p_hh = 0; 3297 } 3298 3299 // Change window height NOW 3300 if (!ONE_WINDOW) 3301 { 3302 if (pp == &p_wh && curwin->w_height < p_wh) 3303 win_setheight((int)p_wh); 3304 if (pp == &p_hh && curbuf->b_help && curwin->w_height < p_hh) 3305 win_setheight((int)p_hh); 3306 } 3307 } 3308 else if (pp == &p_wmh) 3309 { 3310 // 'winminheight' 3311 if (p_wmh < 0) 3312 { 3313 errmsg = e_positive; 3314 p_wmh = 0; 3315 } 3316 if (p_wmh > p_wh) 3317 { 3318 errmsg = e_winheight; 3319 p_wmh = p_wh; 3320 } 3321 win_setminheight(); 3322 } 3323 else if (pp == &p_wiw) 3324 { 3325 // 'winwidth' 3326 if (p_wiw < 1) 3327 { 3328 errmsg = e_positive; 3329 p_wiw = 1; 3330 } 3331 if (p_wmw > p_wiw) 3332 { 3333 errmsg = e_winwidth; 3334 p_wiw = p_wmw; 3335 } 3336 3337 // Change window width NOW 3338 if (!ONE_WINDOW && curwin->w_width < p_wiw) 3339 win_setwidth((int)p_wiw); 3340 } 3341 else if (pp == &p_wmw) 3342 { 3343 // 'winminwidth' 3344 if (p_wmw < 0) 3345 { 3346 errmsg = e_positive; 3347 p_wmw = 0; 3348 } 3349 if (p_wmw > p_wiw) 3350 { 3351 errmsg = e_winwidth; 3352 p_wmw = p_wiw; 3353 } 3354 win_setminwidth(); 3355 } 3356 3357 // (re)set last window status line 3358 else if (pp == &p_ls) 3359 { 3360 last_status(FALSE); 3361 } 3362 3363 // (re)set tab page line 3364 else if (pp == &p_stal) 3365 { 3366 shell_new_rows(); // recompute window positions and heights 3367 } 3368 3369 #ifdef FEAT_GUI 3370 else if (pp == &p_linespace) 3371 { 3372 // Recompute gui.char_height and resize the Vim window to keep the 3373 // same number of lines. 3374 if (gui.in_use && gui_mch_adjust_charheight() == OK) 3375 gui_set_shellsize(FALSE, FALSE, RESIZE_VERT); 3376 } 3377 #endif 3378 3379 #ifdef FEAT_FOLDING 3380 // 'foldlevel' 3381 else if (pp == &curwin->w_p_fdl) 3382 { 3383 if (curwin->w_p_fdl < 0) 3384 curwin->w_p_fdl = 0; 3385 newFoldLevel(); 3386 } 3387 3388 // 'foldminlines' 3389 else if (pp == &curwin->w_p_fml) 3390 { 3391 foldUpdateAll(curwin); 3392 } 3393 3394 // 'foldnestmax' 3395 else if (pp == &curwin->w_p_fdn) 3396 { 3397 if (foldmethodIsSyntax(curwin) || foldmethodIsIndent(curwin)) 3398 foldUpdateAll(curwin); 3399 } 3400 3401 // 'foldcolumn' 3402 else if (pp == &curwin->w_p_fdc) 3403 { 3404 if (curwin->w_p_fdc < 0) 3405 { 3406 errmsg = e_positive; 3407 curwin->w_p_fdc = 0; 3408 } 3409 else if (curwin->w_p_fdc > 12) 3410 { 3411 errmsg = e_invarg; 3412 curwin->w_p_fdc = 12; 3413 } 3414 } 3415 #endif // FEAT_FOLDING 3416 3417 #if defined(FEAT_FOLDING) || defined(FEAT_CINDENT) 3418 // 'shiftwidth' or 'tabstop' 3419 else if (pp == &curbuf->b_p_sw || pp == &curbuf->b_p_ts) 3420 { 3421 # ifdef FEAT_FOLDING 3422 if (foldmethodIsIndent(curwin)) 3423 foldUpdateAll(curwin); 3424 # endif 3425 # ifdef FEAT_CINDENT 3426 // When 'shiftwidth' changes, or it's zero and 'tabstop' changes: 3427 // parse 'cinoptions'. 3428 if (pp == &curbuf->b_p_sw || curbuf->b_p_sw == 0) 3429 parse_cino(curbuf); 3430 # endif 3431 } 3432 #endif 3433 3434 // 'maxcombine' 3435 else if (pp == &p_mco) 3436 { 3437 if (p_mco > MAX_MCO) 3438 p_mco = MAX_MCO; 3439 else if (p_mco < 0) 3440 p_mco = 0; 3441 screenclear(); // will re-allocate the screen 3442 } 3443 3444 else if (pp == &curbuf->b_p_iminsert) 3445 { 3446 if (curbuf->b_p_iminsert < 0 || curbuf->b_p_iminsert > B_IMODE_LAST) 3447 { 3448 errmsg = e_invarg; 3449 curbuf->b_p_iminsert = B_IMODE_NONE; 3450 } 3451 p_iminsert = curbuf->b_p_iminsert; 3452 if (termcap_active) // don't do this in the alternate screen 3453 showmode(); 3454 #if defined(FEAT_KEYMAP) 3455 // Show/unshow value of 'keymap' in status lines. 3456 status_redraw_curbuf(); 3457 #endif 3458 } 3459 3460 #if defined(FEAT_XIM) && defined(FEAT_GUI_GTK) 3461 // 'imstyle' 3462 else if (pp == &p_imst) 3463 { 3464 if (p_imst != IM_ON_THE_SPOT && p_imst != IM_OVER_THE_SPOT) 3465 errmsg = e_invarg; 3466 } 3467 #endif 3468 3469 else if (pp == &p_window) 3470 { 3471 if (p_window < 1) 3472 p_window = 1; 3473 else if (p_window >= Rows) 3474 p_window = Rows - 1; 3475 } 3476 3477 else if (pp == &curbuf->b_p_imsearch) 3478 { 3479 if (curbuf->b_p_imsearch < -1 || curbuf->b_p_imsearch > B_IMODE_LAST) 3480 { 3481 errmsg = e_invarg; 3482 curbuf->b_p_imsearch = B_IMODE_NONE; 3483 } 3484 p_imsearch = curbuf->b_p_imsearch; 3485 } 3486 3487 #ifdef FEAT_TITLE 3488 // if 'titlelen' has changed, redraw the title 3489 else if (pp == &p_titlelen) 3490 { 3491 if (p_titlelen < 0) 3492 { 3493 errmsg = e_positive; 3494 p_titlelen = 85; 3495 } 3496 if (starting != NO_SCREEN && old_value != p_titlelen) 3497 need_maketitle = TRUE; 3498 } 3499 #endif 3500 3501 // if p_ch changed value, change the command line height 3502 else if (pp == &p_ch) 3503 { 3504 if (p_ch < 1) 3505 { 3506 errmsg = e_positive; 3507 p_ch = 1; 3508 } 3509 if (p_ch > Rows - min_rows() + 1) 3510 p_ch = Rows - min_rows() + 1; 3511 3512 // Only compute the new window layout when startup has been 3513 // completed. Otherwise the frame sizes may be wrong. 3514 if (p_ch != old_value && full_screen 3515 #ifdef FEAT_GUI 3516 && !gui.starting 3517 #endif 3518 ) 3519 command_height(); 3520 } 3521 3522 // when 'updatecount' changes from zero to non-zero, open swap files 3523 else if (pp == &p_uc) 3524 { 3525 if (p_uc < 0) 3526 { 3527 errmsg = e_positive; 3528 p_uc = 100; 3529 } 3530 if (p_uc && !old_value) 3531 ml_open_files(); 3532 } 3533 #ifdef FEAT_CONCEAL 3534 else if (pp == &curwin->w_p_cole) 3535 { 3536 if (curwin->w_p_cole < 0) 3537 { 3538 errmsg = e_positive; 3539 curwin->w_p_cole = 0; 3540 } 3541 else if (curwin->w_p_cole > 3) 3542 { 3543 errmsg = e_invarg; 3544 curwin->w_p_cole = 3; 3545 } 3546 } 3547 #endif 3548 #ifdef MZSCHEME_GUI_THREADS 3549 else if (pp == &p_mzq) 3550 mzvim_reset_timer(); 3551 #endif 3552 3553 #if defined(FEAT_PYTHON) || defined(FEAT_PYTHON3) 3554 // 'pyxversion' 3555 else if (pp == &p_pyx) 3556 { 3557 if (p_pyx != 0 && p_pyx != 2 && p_pyx != 3) 3558 errmsg = e_invarg; 3559 } 3560 #endif 3561 3562 // sync undo before 'undolevels' changes 3563 else if (pp == &p_ul) 3564 { 3565 // use the old value, otherwise u_sync() may not work properly 3566 p_ul = old_value; 3567 u_sync(TRUE); 3568 p_ul = value; 3569 } 3570 else if (pp == &curbuf->b_p_ul) 3571 { 3572 // use the old value, otherwise u_sync() may not work properly 3573 curbuf->b_p_ul = old_value; 3574 u_sync(TRUE); 3575 curbuf->b_p_ul = value; 3576 } 3577 3578 #ifdef FEAT_LINEBREAK 3579 // 'numberwidth' must be positive 3580 else if (pp == &curwin->w_p_nuw) 3581 { 3582 if (curwin->w_p_nuw < 1) 3583 { 3584 errmsg = e_positive; 3585 curwin->w_p_nuw = 1; 3586 } 3587 if (curwin->w_p_nuw > 20) 3588 { 3589 errmsg = e_invarg; 3590 curwin->w_p_nuw = 20; 3591 } 3592 curwin->w_nrwidth_line_count = 0; // trigger a redraw 3593 } 3594 #endif 3595 3596 else if (pp == &curbuf->b_p_tw) 3597 { 3598 if (curbuf->b_p_tw < 0) 3599 { 3600 errmsg = e_positive; 3601 curbuf->b_p_tw = 0; 3602 } 3603 #ifdef FEAT_SYN_HL 3604 { 3605 win_T *wp; 3606 tabpage_T *tp; 3607 3608 FOR_ALL_TAB_WINDOWS(tp, wp) 3609 check_colorcolumn(wp); 3610 } 3611 #endif 3612 } 3613 3614 /* 3615 * Check the bounds for numeric options here 3616 */ 3617 if (Rows < min_rows() && full_screen) 3618 { 3619 if (errbuf != NULL) 3620 { 3621 vim_snprintf((char *)errbuf, errbuflen, 3622 _("E593: Need at least %d lines"), min_rows()); 3623 errmsg = errbuf; 3624 } 3625 Rows = min_rows(); 3626 } 3627 if (Columns < MIN_COLUMNS && full_screen) 3628 { 3629 if (errbuf != NULL) 3630 { 3631 vim_snprintf((char *)errbuf, errbuflen, 3632 _("E594: Need at least %d columns"), MIN_COLUMNS); 3633 errmsg = errbuf; 3634 } 3635 Columns = MIN_COLUMNS; 3636 } 3637 limit_screen_size(); 3638 3639 /* 3640 * If the screen (shell) height has been changed, assume it is the 3641 * physical screenheight. 3642 */ 3643 if (old_Rows != Rows || old_Columns != Columns) 3644 { 3645 // Changing the screen size is not allowed while updating the screen. 3646 if (updating_screen) 3647 *pp = old_value; 3648 else if (full_screen 3649 #ifdef FEAT_GUI 3650 && !gui.starting 3651 #endif 3652 ) 3653 set_shellsize((int)Columns, (int)Rows, TRUE); 3654 else 3655 { 3656 // Postpone the resizing; check the size and cmdline position for 3657 // messages. 3658 check_shellsize(); 3659 if (cmdline_row > Rows - p_ch && Rows > p_ch) 3660 cmdline_row = Rows - p_ch; 3661 } 3662 if (p_window >= Rows || !option_was_set((char_u *)"window")) 3663 p_window = Rows - 1; 3664 } 3665 3666 if (curbuf->b_p_ts <= 0) 3667 { 3668 errmsg = e_positive; 3669 curbuf->b_p_ts = 8; 3670 } 3671 if (p_tm < 0) 3672 { 3673 errmsg = e_positive; 3674 p_tm = 0; 3675 } 3676 if ((curwin->w_p_scr <= 0 3677 || (curwin->w_p_scr > curwin->w_height 3678 && curwin->w_height > 0)) 3679 && full_screen) 3680 { 3681 if (pp == &(curwin->w_p_scr)) 3682 { 3683 if (curwin->w_p_scr != 0) 3684 errmsg = e_scroll; 3685 win_comp_scroll(curwin); 3686 } 3687 // If 'scroll' became invalid because of a side effect silently adjust 3688 // it. 3689 else if (curwin->w_p_scr <= 0) 3690 curwin->w_p_scr = 1; 3691 else // curwin->w_p_scr > curwin->w_height 3692 curwin->w_p_scr = curwin->w_height; 3693 } 3694 if (p_hi < 0) 3695 { 3696 errmsg = e_positive; 3697 p_hi = 0; 3698 } 3699 else if (p_hi > 10000) 3700 { 3701 errmsg = e_invarg; 3702 p_hi = 10000; 3703 } 3704 if (p_re < 0 || p_re > 2) 3705 { 3706 errmsg = e_invarg; 3707 p_re = 0; 3708 } 3709 if (p_report < 0) 3710 { 3711 errmsg = e_positive; 3712 p_report = 1; 3713 } 3714 if ((p_sj < -100 || p_sj >= Rows) && full_screen) 3715 { 3716 if (Rows != old_Rows) // Rows changed, just adjust p_sj 3717 p_sj = Rows / 2; 3718 else 3719 { 3720 errmsg = e_scroll; 3721 p_sj = 1; 3722 } 3723 } 3724 if (p_so < 0 && full_screen) 3725 { 3726 errmsg = e_positive; 3727 p_so = 0; 3728 } 3729 if (p_siso < 0 && full_screen) 3730 { 3731 errmsg = e_positive; 3732 p_siso = 0; 3733 } 3734 #ifdef FEAT_CMDWIN 3735 if (p_cwh < 1) 3736 { 3737 errmsg = e_positive; 3738 p_cwh = 1; 3739 } 3740 #endif 3741 if (p_ut < 0) 3742 { 3743 errmsg = e_positive; 3744 p_ut = 2000; 3745 } 3746 if (p_ss < 0) 3747 { 3748 errmsg = e_positive; 3749 p_ss = 0; 3750 } 3751 3752 // May set global value for local option. 3753 if ((opt_flags & (OPT_LOCAL | OPT_GLOBAL)) == 0) 3754 *(long *)get_varp_scope(&(options[opt_idx]), OPT_GLOBAL) = *pp; 3755 3756 options[opt_idx].flags |= P_WAS_SET; 3757 3758 #if defined(FEAT_EVAL) 3759 apply_optionset_autocmd(opt_idx, opt_flags, old_value, old_global_value, 3760 value, errmsg); 3761 #endif 3762 3763 comp_col(); // in case 'columns' or 'ls' changed 3764 if (curwin->w_curswant != MAXCOL 3765 && (options[opt_idx].flags & (P_CURSWANT | P_RALL)) != 0) 3766 curwin->w_set_curswant = TRUE; 3767 if ((opt_flags & OPT_NO_REDRAW) == 0) 3768 check_redraw(options[opt_idx].flags); 3769 3770 return errmsg; 3771 } 3772 3773 /* 3774 * Called after an option changed: check if something needs to be redrawn. 3775 */ 3776 void 3777 check_redraw(long_u flags) 3778 { 3779 // Careful: P_RCLR and P_RALL are a combination of other P_ flags 3780 int doclear = (flags & P_RCLR) == P_RCLR; 3781 int all = ((flags & P_RALL) == P_RALL || doclear); 3782 3783 if ((flags & P_RSTAT) || all) // mark all status lines dirty 3784 status_redraw_all(); 3785 3786 if ((flags & P_RBUF) || (flags & P_RWIN) || all) 3787 changed_window_setting(); 3788 if (flags & P_RBUF) 3789 redraw_curbuf_later(NOT_VALID); 3790 if (flags & P_RWINONLY) 3791 redraw_later(NOT_VALID); 3792 if (doclear) 3793 redraw_all_later(CLEAR); 3794 else if (all) 3795 redraw_all_later(NOT_VALID); 3796 } 3797 3798 /* 3799 * Find index for option 'arg'. 3800 * Return -1 if not found. 3801 */ 3802 int 3803 findoption(char_u *arg) 3804 { 3805 int opt_idx; 3806 char *s, *p; 3807 static short quick_tab[27] = {0, 0}; // quick access table 3808 int is_term_opt; 3809 3810 /* 3811 * For first call: Initialize the quick-access table. 3812 * It contains the index for the first option that starts with a certain 3813 * letter. There are 26 letters, plus the first "t_" option. 3814 */ 3815 if (quick_tab[1] == 0) 3816 { 3817 p = options[0].fullname; 3818 for (opt_idx = 1; (s = options[opt_idx].fullname) != NULL; opt_idx++) 3819 { 3820 if (s[0] != p[0]) 3821 { 3822 if (s[0] == 't' && s[1] == '_') 3823 quick_tab[26] = opt_idx; 3824 else 3825 quick_tab[CharOrdLow(s[0])] = opt_idx; 3826 } 3827 p = s; 3828 } 3829 } 3830 3831 /* 3832 * Check for name starting with an illegal character. 3833 */ 3834 #ifdef EBCDIC 3835 if (!islower(arg[0])) 3836 #else 3837 if (arg[0] < 'a' || arg[0] > 'z') 3838 #endif 3839 return -1; 3840 3841 is_term_opt = (arg[0] == 't' && arg[1] == '_'); 3842 if (is_term_opt) 3843 opt_idx = quick_tab[26]; 3844 else 3845 opt_idx = quick_tab[CharOrdLow(arg[0])]; 3846 for ( ; (s = options[opt_idx].fullname) != NULL; opt_idx++) 3847 { 3848 if (STRCMP(arg, s) == 0) // match full name 3849 break; 3850 } 3851 if (s == NULL && !is_term_opt) 3852 { 3853 opt_idx = quick_tab[CharOrdLow(arg[0])]; 3854 for ( ; options[opt_idx].fullname != NULL; opt_idx++) 3855 { 3856 s = options[opt_idx].shortname; 3857 if (s != NULL && STRCMP(arg, s) == 0) // match short name 3858 break; 3859 s = NULL; 3860 } 3861 } 3862 if (s == NULL) 3863 opt_idx = -1; 3864 return opt_idx; 3865 } 3866 3867 #if defined(FEAT_EVAL) || defined(FEAT_TCL) || defined(FEAT_MZSCHEME) 3868 /* 3869 * Get the value for an option. 3870 * 3871 * Returns: 3872 * Number option: gov_number, *numval gets value. 3873 * Toggle option: gov_bool, *numval gets value. 3874 * String option: gov_string, *stringval gets allocated string. 3875 * Hidden Number option: gov_hidden_number. 3876 * Hidden Toggle option: gov_hidden_bool. 3877 * Hidden String option: gov_hidden_string. 3878 * Unknown option: gov_unknown. 3879 */ 3880 getoption_T 3881 get_option_value( 3882 char_u *name, 3883 long *numval, 3884 char_u **stringval, // NULL when only checking existence 3885 int opt_flags) 3886 { 3887 int opt_idx; 3888 char_u *varp; 3889 3890 opt_idx = findoption(name); 3891 if (opt_idx < 0) // option not in the table 3892 { 3893 int key; 3894 3895 if (STRLEN(name) == 4 && name[0] == 't' && name[1] == '_' 3896 && (key = find_key_option(name, FALSE)) != 0) 3897 { 3898 char_u key_name[2]; 3899 char_u *p; 3900 3901 // check for a terminal option 3902 if (key < 0) 3903 { 3904 key_name[0] = KEY2TERMCAP0(key); 3905 key_name[1] = KEY2TERMCAP1(key); 3906 } 3907 else 3908 { 3909 key_name[0] = KS_KEY; 3910 key_name[1] = (key & 0xff); 3911 } 3912 p = find_termcode(key_name); 3913 if (p != NULL) 3914 { 3915 if (stringval != NULL) 3916 *stringval = vim_strsave(p); 3917 return gov_string; 3918 } 3919 } 3920 return gov_unknown; 3921 } 3922 3923 varp = get_varp_scope(&(options[opt_idx]), opt_flags); 3924 3925 if (options[opt_idx].flags & P_STRING) 3926 { 3927 if (varp == NULL) // hidden option 3928 return gov_hidden_string; 3929 if (stringval != NULL) 3930 { 3931 #ifdef FEAT_CRYPT 3932 // never return the value of the crypt key 3933 if ((char_u **)varp == &curbuf->b_p_key 3934 && **(char_u **)(varp) != NUL) 3935 *stringval = vim_strsave((char_u *)"*****"); 3936 else 3937 #endif 3938 *stringval = vim_strsave(*(char_u **)(varp)); 3939 } 3940 return gov_string; 3941 } 3942 3943 if (varp == NULL) // hidden option 3944 return (options[opt_idx].flags & P_NUM) 3945 ? gov_hidden_number : gov_hidden_bool; 3946 if (options[opt_idx].flags & P_NUM) 3947 *numval = *(long *)varp; 3948 else 3949 { 3950 // Special case: 'modified' is b_changed, but we also want to consider 3951 // it set when 'ff' or 'fenc' changed. 3952 if ((int *)varp == &curbuf->b_changed) 3953 *numval = curbufIsChanged(); 3954 else 3955 *numval = (long) *(int *)varp; 3956 } 3957 return (options[opt_idx].flags & P_NUM) ? gov_number : gov_bool; 3958 } 3959 #endif 3960 3961 #if defined(FEAT_PYTHON) || defined(FEAT_PYTHON3) || defined(PROTO) 3962 /* 3963 * Returns the option attributes and its value. Unlike the above function it 3964 * will return either global value or local value of the option depending on 3965 * what was requested, but it will never return global value if it was 3966 * requested to return local one and vice versa. Neither it will return 3967 * buffer-local value if it was requested to return window-local one. 3968 * 3969 * Pretends that option is absent if it is not present in the requested scope 3970 * (i.e. has no global, window-local or buffer-local value depending on 3971 * opt_type). Uses 3972 * 3973 * Returned flags: 3974 * 0 hidden or unknown option, also option that does not have requested 3975 * type (see SREQ_* in vim.h) 3976 * see SOPT_* in vim.h for other flags 3977 * 3978 * Possible opt_type values: see SREQ_* in vim.h 3979 */ 3980 int 3981 get_option_value_strict( 3982 char_u *name, 3983 long *numval, 3984 char_u **stringval, // NULL when only obtaining attributes 3985 int opt_type, 3986 void *from) 3987 { 3988 int opt_idx; 3989 char_u *varp = NULL; 3990 struct vimoption *p; 3991 int r = 0; 3992 3993 opt_idx = findoption(name); 3994 if (opt_idx < 0) 3995 return 0; 3996 3997 p = &(options[opt_idx]); 3998 3999 // Hidden option 4000 if (p->var == NULL) 4001 return 0; 4002 4003 if (p->flags & P_BOOL) 4004 r |= SOPT_BOOL; 4005 else if (p->flags & P_NUM) 4006 r |= SOPT_NUM; 4007 else if (p->flags & P_STRING) 4008 r |= SOPT_STRING; 4009 4010 if (p->indir == PV_NONE) 4011 { 4012 if (opt_type == SREQ_GLOBAL) 4013 r |= SOPT_GLOBAL; 4014 else 4015 return 0; // Did not request global-only option 4016 } 4017 else 4018 { 4019 if (p->indir & PV_BOTH) 4020 r |= SOPT_GLOBAL; 4021 else if (opt_type == SREQ_GLOBAL) 4022 return 0; // Requested global option 4023 4024 if (p->indir & PV_WIN) 4025 { 4026 if (opt_type == SREQ_BUF) 4027 return 0; // Did not request window-local option 4028 else 4029 r |= SOPT_WIN; 4030 } 4031 else if (p->indir & PV_BUF) 4032 { 4033 if (opt_type == SREQ_WIN) 4034 return 0; // Did not request buffer-local option 4035 else 4036 r |= SOPT_BUF; 4037 } 4038 } 4039 4040 if (stringval == NULL) 4041 return r; 4042 4043 if (opt_type == SREQ_GLOBAL) 4044 varp = p->var; 4045 else 4046 { 4047 if (opt_type == SREQ_BUF) 4048 { 4049 // Special case: 'modified' is b_changed, but we also want to 4050 // consider it set when 'ff' or 'fenc' changed. 4051 if (p->indir == PV_MOD) 4052 { 4053 *numval = bufIsChanged((buf_T *)from); 4054 varp = NULL; 4055 } 4056 #ifdef FEAT_CRYPT 4057 else if (p->indir == PV_KEY) 4058 { 4059 // never return the value of the crypt key 4060 *stringval = NULL; 4061 varp = NULL; 4062 } 4063 #endif 4064 else 4065 { 4066 buf_T *save_curbuf = curbuf; 4067 4068 // only getting a pointer, no need to use aucmd_prepbuf() 4069 curbuf = (buf_T *)from; 4070 curwin->w_buffer = curbuf; 4071 varp = get_varp(p); 4072 curbuf = save_curbuf; 4073 curwin->w_buffer = curbuf; 4074 } 4075 } 4076 else if (opt_type == SREQ_WIN) 4077 { 4078 win_T *save_curwin = curwin; 4079 4080 curwin = (win_T *)from; 4081 curbuf = curwin->w_buffer; 4082 varp = get_varp(p); 4083 curwin = save_curwin; 4084 curbuf = curwin->w_buffer; 4085 } 4086 if (varp == p->var) 4087 return (r | SOPT_UNSET); 4088 } 4089 4090 if (varp != NULL) 4091 { 4092 if (p->flags & P_STRING) 4093 *stringval = vim_strsave(*(char_u **)(varp)); 4094 else if (p->flags & P_NUM) 4095 *numval = *(long *) varp; 4096 else 4097 *numval = *(int *)varp; 4098 } 4099 4100 return r; 4101 } 4102 4103 /* 4104 * Iterate over options. First argument is a pointer to a pointer to a 4105 * structure inside options[] array, second is option type like in the above 4106 * function. 4107 * 4108 * If first argument points to NULL it is assumed that iteration just started 4109 * and caller needs the very first value. 4110 * If first argument points to the end marker function returns NULL and sets 4111 * first argument to NULL. 4112 * 4113 * Returns full option name for current option on each call. 4114 */ 4115 char_u * 4116 option_iter_next(void **option, int opt_type) 4117 { 4118 struct vimoption *ret = NULL; 4119 do 4120 { 4121 if (*option == NULL) 4122 *option = (void *) options; 4123 else if (((struct vimoption *) (*option))->fullname == NULL) 4124 { 4125 *option = NULL; 4126 return NULL; 4127 } 4128 else 4129 *option = (void *) (((struct vimoption *) (*option)) + 1); 4130 4131 ret = ((struct vimoption *) (*option)); 4132 4133 // Hidden option 4134 if (ret->var == NULL) 4135 { 4136 ret = NULL; 4137 continue; 4138 } 4139 4140 switch (opt_type) 4141 { 4142 case SREQ_GLOBAL: 4143 if (!(ret->indir == PV_NONE || ret->indir & PV_BOTH)) 4144 ret = NULL; 4145 break; 4146 case SREQ_BUF: 4147 if (!(ret->indir & PV_BUF)) 4148 ret = NULL; 4149 break; 4150 case SREQ_WIN: 4151 if (!(ret->indir & PV_WIN)) 4152 ret = NULL; 4153 break; 4154 default: 4155 internal_error("option_iter_next()"); 4156 return NULL; 4157 } 4158 } 4159 while (ret == NULL); 4160 4161 return (char_u *)ret->fullname; 4162 } 4163 #endif 4164 4165 /* 4166 * Return the flags for the option at 'opt_idx'. 4167 */ 4168 long_u 4169 get_option_flags(int opt_idx) 4170 { 4171 return options[opt_idx].flags; 4172 } 4173 4174 /* 4175 * Set a flag for the option at 'opt_idx'. 4176 */ 4177 void 4178 set_option_flag(int opt_idx, long_u flag) 4179 { 4180 options[opt_idx].flags |= flag; 4181 } 4182 4183 /* 4184 * Clear a flag for the option at 'opt_idx'. 4185 */ 4186 void 4187 clear_option_flag(int opt_idx, long_u flag) 4188 { 4189 options[opt_idx].flags &= ~flag; 4190 } 4191 4192 /* 4193 * Returns TRUE if the option at 'opt_idx' is a global option 4194 */ 4195 int 4196 is_global_option(int opt_idx) 4197 { 4198 return options[opt_idx].indir == PV_NONE; 4199 } 4200 4201 /* 4202 * Returns TRUE if the option at 'opt_idx' is a global option which also has a 4203 * local value. 4204 */ 4205 int 4206 is_global_local_option(int opt_idx) 4207 { 4208 return options[opt_idx].indir & PV_BOTH; 4209 } 4210 4211 /* 4212 * Returns TRUE if the option at 'opt_idx' is a window-local option 4213 */ 4214 int 4215 is_window_local_option(int opt_idx) 4216 { 4217 return options[opt_idx].var == VAR_WIN; 4218 } 4219 4220 /* 4221 * Returns TRUE if the option at 'opt_idx' is a hidden option 4222 */ 4223 int 4224 is_hidden_option(int opt_idx) 4225 { 4226 return options[opt_idx].var == NULL; 4227 } 4228 4229 #if defined(FEAT_CRYPT) || defined(PROTO) 4230 /* 4231 * Returns TRUE if the option at 'opt_idx' is a crypt key option 4232 */ 4233 int 4234 is_crypt_key_option(int opt_idx) 4235 { 4236 return options[opt_idx].indir == PV_KEY; 4237 } 4238 #endif 4239 4240 /* 4241 * Set the value of option "name". 4242 * Use "string" for string options, use "number" for other options. 4243 * 4244 * Returns NULL on success or error message on error. 4245 */ 4246 char * 4247 set_option_value( 4248 char_u *name, 4249 long number, 4250 char_u *string, 4251 int opt_flags) // OPT_LOCAL or 0 (both) 4252 { 4253 int opt_idx; 4254 char_u *varp; 4255 long_u flags; 4256 4257 opt_idx = findoption(name); 4258 if (opt_idx < 0) 4259 { 4260 int key; 4261 4262 if (STRLEN(name) == 4 && name[0] == 't' && name[1] == '_' 4263 && (key = find_key_option(name, FALSE)) != 0) 4264 { 4265 char_u key_name[2]; 4266 4267 if (key < 0) 4268 { 4269 key_name[0] = KEY2TERMCAP0(key); 4270 key_name[1] = KEY2TERMCAP1(key); 4271 } 4272 else 4273 { 4274 key_name[0] = KS_KEY; 4275 key_name[1] = (key & 0xff); 4276 } 4277 add_termcode(key_name, string, FALSE); 4278 if (full_screen) 4279 ttest(FALSE); 4280 redraw_all_later(CLEAR); 4281 return NULL; 4282 } 4283 4284 semsg(_("E355: Unknown option: %s"), name); 4285 } 4286 else 4287 { 4288 flags = options[opt_idx].flags; 4289 #ifdef HAVE_SANDBOX 4290 // Disallow changing some options in the sandbox 4291 if (sandbox > 0 && (flags & P_SECURE)) 4292 { 4293 emsg(_(e_sandbox)); 4294 return NULL; 4295 } 4296 #endif 4297 if (flags & P_STRING) 4298 return set_string_option(opt_idx, string, opt_flags); 4299 else 4300 { 4301 varp = get_varp_scope(&(options[opt_idx]), opt_flags); 4302 if (varp != NULL) // hidden option is not changed 4303 { 4304 if (number == 0 && string != NULL) 4305 { 4306 int idx; 4307 4308 // Either we are given a string or we are setting option 4309 // to zero. 4310 for (idx = 0; string[idx] == '0'; ++idx) 4311 ; 4312 if (string[idx] != NUL || idx == 0) 4313 { 4314 // There's another character after zeros or the string 4315 // is empty. In both cases, we are trying to set a 4316 // num option using a string. 4317 semsg(_("E521: Number required: &%s = '%s'"), 4318 name, string); 4319 return NULL; // do nothing as we hit an error 4320 4321 } 4322 } 4323 if (flags & P_NUM) 4324 return set_num_option(opt_idx, varp, number, 4325 NULL, 0, opt_flags); 4326 else 4327 return set_bool_option(opt_idx, varp, (int)number, 4328 opt_flags); 4329 } 4330 } 4331 } 4332 return NULL; 4333 } 4334 4335 /* 4336 * Get the terminal code for a terminal option. 4337 * Returns NULL when not found. 4338 */ 4339 char_u * 4340 get_term_code(char_u *tname) 4341 { 4342 int opt_idx; 4343 char_u *varp; 4344 4345 if (tname[0] != 't' || tname[1] != '_' || 4346 tname[2] == NUL || tname[3] == NUL) 4347 return NULL; 4348 if ((opt_idx = findoption(tname)) >= 0) 4349 { 4350 varp = get_varp(&(options[opt_idx])); 4351 if (varp != NULL) 4352 varp = *(char_u **)(varp); 4353 return varp; 4354 } 4355 return find_termcode(tname + 2); 4356 } 4357 4358 char_u * 4359 get_highlight_default(void) 4360 { 4361 int i; 4362 4363 i = findoption((char_u *)"hl"); 4364 if (i >= 0) 4365 return options[i].def_val[VI_DEFAULT]; 4366 return (char_u *)NULL; 4367 } 4368 4369 char_u * 4370 get_encoding_default(void) 4371 { 4372 int i; 4373 4374 i = findoption((char_u *)"enc"); 4375 if (i >= 0) 4376 return options[i].def_val[VI_DEFAULT]; 4377 return (char_u *)NULL; 4378 } 4379 4380 /* 4381 * Translate a string like "t_xx", "<t_xx>" or "<S-Tab>" to a key number. 4382 * When "has_lt" is true there is a '<' before "*arg_arg". 4383 * Returns 0 when the key is not recognized. 4384 */ 4385 static int 4386 find_key_option(char_u *arg_arg, int has_lt) 4387 { 4388 int key = 0; 4389 int modifiers; 4390 char_u *arg = arg_arg; 4391 4392 /* 4393 * Don't use get_special_key_code() for t_xx, we don't want it to call 4394 * add_termcap_entry(). 4395 */ 4396 if (arg[0] == 't' && arg[1] == '_' && arg[2] && arg[3]) 4397 key = TERMCAP2KEY(arg[2], arg[3]); 4398 else if (has_lt) 4399 { 4400 --arg; // put arg at the '<' 4401 modifiers = 0; 4402 key = find_special_key(&arg, &modifiers, 4403 FSK_KEYCODE | FSK_KEEP_X_KEY | FSK_SIMPLIFY, NULL); 4404 if (modifiers) // can't handle modifiers here 4405 key = 0; 4406 } 4407 return key; 4408 } 4409 4410 /* 4411 * if 'all' == 0: show changed options 4412 * if 'all' == 1: show all normal options 4413 * if 'all' == 2: show all terminal options 4414 */ 4415 static void 4416 showoptions( 4417 int all, 4418 int opt_flags) // OPT_LOCAL and/or OPT_GLOBAL 4419 { 4420 struct vimoption *p; 4421 int col; 4422 int isterm; 4423 char_u *varp; 4424 struct vimoption **items; 4425 int item_count; 4426 int run; 4427 int row, rows; 4428 int cols; 4429 int i; 4430 int len; 4431 4432 #define INC 20 4433 #define GAP 3 4434 4435 items = ALLOC_MULT(struct vimoption *, OPTION_COUNT); 4436 if (items == NULL) 4437 return; 4438 4439 // Highlight title 4440 if (all == 2) 4441 msg_puts_title(_("\n--- Terminal codes ---")); 4442 else if (opt_flags & OPT_GLOBAL) 4443 msg_puts_title(_("\n--- Global option values ---")); 4444 else if (opt_flags & OPT_LOCAL) 4445 msg_puts_title(_("\n--- Local option values ---")); 4446 else 4447 msg_puts_title(_("\n--- Options ---")); 4448 4449 /* 4450 * Do the loop two times: 4451 * 1. display the short items 4452 * 2. display the long items (only strings and numbers) 4453 * When "opt_flags" has OPT_ONECOLUMN do everything in run 2. 4454 */ 4455 for (run = 1; run <= 2 && !got_int; ++run) 4456 { 4457 /* 4458 * collect the items in items[] 4459 */ 4460 item_count = 0; 4461 for (p = &options[0]; p->fullname != NULL; p++) 4462 { 4463 // apply :filter /pat/ 4464 if (message_filtered((char_u *)p->fullname)) 4465 continue; 4466 4467 varp = NULL; 4468 isterm = istermoption(p); 4469 if ((opt_flags & (OPT_LOCAL | OPT_GLOBAL)) != 0) 4470 { 4471 if (p->indir != PV_NONE && !isterm) 4472 varp = get_varp_scope(p, opt_flags); 4473 } 4474 else 4475 varp = get_varp(p); 4476 if (varp != NULL 4477 && ((all == 2 && isterm) 4478 || (all == 1 && !isterm) 4479 || (all == 0 && !optval_default(p, varp, p_cp)))) 4480 { 4481 if (opt_flags & OPT_ONECOLUMN) 4482 len = Columns; 4483 else if (p->flags & P_BOOL) 4484 len = 1; // a toggle option fits always 4485 else 4486 { 4487 option_value2string(p, opt_flags); 4488 len = (int)STRLEN(p->fullname) + vim_strsize(NameBuff) + 1; 4489 } 4490 if ((len <= INC - GAP && run == 1) || 4491 (len > INC - GAP && run == 2)) 4492 items[item_count++] = p; 4493 } 4494 } 4495 4496 /* 4497 * display the items 4498 */ 4499 if (run == 1) 4500 { 4501 cols = (Columns + GAP - 3) / INC; 4502 if (cols == 0) 4503 cols = 1; 4504 rows = (item_count + cols - 1) / cols; 4505 } 4506 else // run == 2 4507 rows = item_count; 4508 for (row = 0; row < rows && !got_int; ++row) 4509 { 4510 msg_putchar('\n'); // go to next line 4511 if (got_int) // 'q' typed in more 4512 break; 4513 col = 0; 4514 for (i = row; i < item_count; i += rows) 4515 { 4516 msg_col = col; // make columns 4517 showoneopt(items[i], opt_flags); 4518 col += INC; 4519 } 4520 out_flush(); 4521 ui_breakcheck(); 4522 } 4523 } 4524 vim_free(items); 4525 } 4526 4527 /* 4528 * Return TRUE if option "p" has its default value. 4529 */ 4530 static int 4531 optval_default(struct vimoption *p, char_u *varp, int compatible) 4532 { 4533 int dvi; 4534 4535 if (varp == NULL) 4536 return TRUE; // hidden option is always at default 4537 dvi = ((p->flags & P_VI_DEF) || compatible) ? VI_DEFAULT : VIM_DEFAULT; 4538 if (p->flags & P_NUM) 4539 return (*(long *)varp == (long)(long_i)p->def_val[dvi]); 4540 if (p->flags & P_BOOL) 4541 // the cast to long is required for Manx C, long_i is 4542 // needed for MSVC 4543 return (*(int *)varp == (int)(long)(long_i)p->def_val[dvi]); 4544 // P_STRING 4545 return (STRCMP(*(char_u **)varp, p->def_val[dvi]) == 0); 4546 } 4547 4548 /* 4549 * showoneopt: show the value of one option 4550 * must not be called with a hidden option! 4551 */ 4552 static void 4553 showoneopt( 4554 struct vimoption *p, 4555 int opt_flags) // OPT_LOCAL or OPT_GLOBAL 4556 { 4557 char_u *varp; 4558 int save_silent = silent_mode; 4559 4560 silent_mode = FALSE; 4561 info_message = TRUE; // use mch_msg(), not mch_errmsg() 4562 4563 varp = get_varp_scope(p, opt_flags); 4564 4565 // for 'modified' we also need to check if 'ff' or 'fenc' changed. 4566 if ((p->flags & P_BOOL) && ((int *)varp == &curbuf->b_changed 4567 ? !curbufIsChanged() : !*(int *)varp)) 4568 msg_puts("no"); 4569 else if ((p->flags & P_BOOL) && *(int *)varp < 0) 4570 msg_puts("--"); 4571 else 4572 msg_puts(" "); 4573 msg_puts(p->fullname); 4574 if (!(p->flags & P_BOOL)) 4575 { 4576 msg_putchar('='); 4577 // put value string in NameBuff 4578 option_value2string(p, opt_flags); 4579 msg_outtrans(NameBuff); 4580 } 4581 4582 silent_mode = save_silent; 4583 info_message = FALSE; 4584 } 4585 4586 /* 4587 * Write modified options as ":set" commands to a file. 4588 * 4589 * There are three values for "opt_flags": 4590 * OPT_GLOBAL: Write global option values and fresh values of 4591 * buffer-local options (used for start of a session 4592 * file). 4593 * OPT_GLOBAL + OPT_LOCAL: Idem, add fresh values of window-local options for 4594 * curwin (used for a vimrc file). 4595 * OPT_LOCAL: Write buffer-local option values for curbuf, fresh 4596 * and local values for window-local options of 4597 * curwin. Local values are also written when at the 4598 * default value, because a modeline or autocommand 4599 * may have set them when doing ":edit file" and the 4600 * user has set them back at the default or fresh 4601 * value. 4602 * When "local_only" is TRUE, don't write fresh 4603 * values, only local values (for ":mkview"). 4604 * (fresh value = value used for a new buffer or window for a local option). 4605 * 4606 * Return FAIL on error, OK otherwise. 4607 */ 4608 int 4609 makeset(FILE *fd, int opt_flags, int local_only) 4610 { 4611 struct vimoption *p; 4612 char_u *varp; // currently used value 4613 char_u *varp_fresh; // local value 4614 char_u *varp_local = NULL; // fresh value 4615 char *cmd; 4616 int round; 4617 int pri; 4618 4619 /* 4620 * The options that don't have a default (terminal name, columns, lines) 4621 * are never written. Terminal options are also not written. 4622 * Do the loop over "options[]" twice: once for options with the 4623 * P_PRI_MKRC flag and once without. 4624 */ 4625 for (pri = 1; pri >= 0; --pri) 4626 { 4627 for (p = &options[0]; !istermoption(p); p++) 4628 if (!(p->flags & P_NO_MKRC) 4629 && !istermoption(p) 4630 && ((pri == 1) == ((p->flags & P_PRI_MKRC) != 0))) 4631 { 4632 // skip global option when only doing locals 4633 if (p->indir == PV_NONE && !(opt_flags & OPT_GLOBAL)) 4634 continue; 4635 4636 // Do not store options like 'bufhidden' and 'syntax' in a vimrc 4637 // file, they are always buffer-specific. 4638 if ((opt_flags & OPT_GLOBAL) && (p->flags & P_NOGLOB)) 4639 continue; 4640 4641 // Global values are only written when not at the default value. 4642 varp = get_varp_scope(p, opt_flags); 4643 if ((opt_flags & OPT_GLOBAL) && optval_default(p, varp, p_cp)) 4644 continue; 4645 4646 if ((opt_flags & OPT_SKIPRTP) && (p->var == (char_u *)&p_rtp 4647 || p->var == (char_u *)&p_pp)) 4648 continue; 4649 4650 round = 2; 4651 if (p->indir != PV_NONE) 4652 { 4653 if (p->var == VAR_WIN) 4654 { 4655 // skip window-local option when only doing globals 4656 if (!(opt_flags & OPT_LOCAL)) 4657 continue; 4658 // When fresh value of window-local option is not at the 4659 // default, need to write it too. 4660 if (!(opt_flags & OPT_GLOBAL) && !local_only) 4661 { 4662 varp_fresh = get_varp_scope(p, OPT_GLOBAL); 4663 if (!optval_default(p, varp_fresh, p_cp)) 4664 { 4665 round = 1; 4666 varp_local = varp; 4667 varp = varp_fresh; 4668 } 4669 } 4670 } 4671 } 4672 4673 // Round 1: fresh value for window-local options. 4674 // Round 2: other values 4675 for ( ; round <= 2; varp = varp_local, ++round) 4676 { 4677 if (round == 1 || (opt_flags & OPT_GLOBAL)) 4678 cmd = "set"; 4679 else 4680 cmd = "setlocal"; 4681 4682 if (p->flags & P_BOOL) 4683 { 4684 if (put_setbool(fd, cmd, p->fullname, *(int *)varp) == FAIL) 4685 return FAIL; 4686 } 4687 else if (p->flags & P_NUM) 4688 { 4689 if (put_setnum(fd, cmd, p->fullname, (long *)varp) == FAIL) 4690 return FAIL; 4691 } 4692 else // P_STRING 4693 { 4694 int do_endif = FALSE; 4695 4696 // Don't set 'syntax' and 'filetype' again if the value is 4697 // already right, avoids reloading the syntax file. 4698 if ( 4699 #if defined(FEAT_SYN_HL) 4700 p->indir == PV_SYN || 4701 #endif 4702 p->indir == PV_FT) 4703 { 4704 if (fprintf(fd, "if &%s != '%s'", p->fullname, 4705 *(char_u **)(varp)) < 0 4706 || put_eol(fd) < 0) 4707 return FAIL; 4708 do_endif = TRUE; 4709 } 4710 if (put_setstring(fd, cmd, p->fullname, (char_u **)varp, 4711 p->flags) == FAIL) 4712 return FAIL; 4713 if (do_endif) 4714 { 4715 if (put_line(fd, "endif") == FAIL) 4716 return FAIL; 4717 } 4718 } 4719 } 4720 } 4721 } 4722 return OK; 4723 } 4724 4725 #if defined(FEAT_FOLDING) || defined(PROTO) 4726 /* 4727 * Generate set commands for the local fold options only. Used when 4728 * 'sessionoptions' or 'viewoptions' contains "folds" but not "options". 4729 */ 4730 int 4731 makefoldset(FILE *fd) 4732 { 4733 if (put_setstring(fd, "setlocal", "fdm", &curwin->w_p_fdm, 0) == FAIL 4734 # ifdef FEAT_EVAL 4735 || put_setstring(fd, "setlocal", "fde", &curwin->w_p_fde, 0) 4736 == FAIL 4737 # endif 4738 || put_setstring(fd, "setlocal", "fmr", &curwin->w_p_fmr, 0) 4739 == FAIL 4740 || put_setstring(fd, "setlocal", "fdi", &curwin->w_p_fdi, 0) 4741 == FAIL 4742 || put_setnum(fd, "setlocal", "fdl", &curwin->w_p_fdl) == FAIL 4743 || put_setnum(fd, "setlocal", "fml", &curwin->w_p_fml) == FAIL 4744 || put_setnum(fd, "setlocal", "fdn", &curwin->w_p_fdn) == FAIL 4745 || put_setbool(fd, "setlocal", "fen", curwin->w_p_fen) == FAIL 4746 ) 4747 return FAIL; 4748 4749 return OK; 4750 } 4751 #endif 4752 4753 static int 4754 put_setstring( 4755 FILE *fd, 4756 char *cmd, 4757 char *name, 4758 char_u **valuep, 4759 long_u flags) 4760 { 4761 char_u *s; 4762 char_u *buf = NULL; 4763 char_u *part = NULL; 4764 char_u *p; 4765 4766 if (fprintf(fd, "%s %s=", cmd, name) < 0) 4767 return FAIL; 4768 if (*valuep != NULL) 4769 { 4770 // Output 'pastetoggle' as key names. For other 4771 // options some characters have to be escaped with 4772 // CTRL-V or backslash 4773 if (valuep == &p_pt) 4774 { 4775 s = *valuep; 4776 while (*s != NUL) 4777 if (put_escstr(fd, str2special(&s, FALSE), 2) == FAIL) 4778 return FAIL; 4779 } 4780 // expand the option value, replace $HOME by ~ 4781 else if ((flags & P_EXPAND) != 0) 4782 { 4783 int size = (int)STRLEN(*valuep) + 1; 4784 4785 // replace home directory in the whole option value into "buf" 4786 buf = alloc(size); 4787 if (buf == NULL) 4788 goto fail; 4789 home_replace(NULL, *valuep, buf, size, FALSE); 4790 4791 // If the option value is longer than MAXPATHL, we need to append 4792 // each comma separated part of the option separately, so that it 4793 // can be expanded when read back. 4794 if (size >= MAXPATHL && (flags & P_COMMA) != 0 4795 && vim_strchr(*valuep, ',') != NULL) 4796 { 4797 part = alloc(size); 4798 if (part == NULL) 4799 goto fail; 4800 4801 // write line break to clear the option, e.g. ':set rtp=' 4802 if (put_eol(fd) == FAIL) 4803 goto fail; 4804 4805 p = buf; 4806 while (*p != NUL) 4807 { 4808 // for each comma separated option part, append value to 4809 // the option, :set rtp+=value 4810 if (fprintf(fd, "%s %s+=", cmd, name) < 0) 4811 goto fail; 4812 (void)copy_option_part(&p, part, size, ","); 4813 if (put_escstr(fd, part, 2) == FAIL || put_eol(fd) == FAIL) 4814 goto fail; 4815 } 4816 vim_free(buf); 4817 vim_free(part); 4818 return OK; 4819 } 4820 if (put_escstr(fd, buf, 2) == FAIL) 4821 { 4822 vim_free(buf); 4823 return FAIL; 4824 } 4825 vim_free(buf); 4826 } 4827 else if (put_escstr(fd, *valuep, 2) == FAIL) 4828 return FAIL; 4829 } 4830 if (put_eol(fd) < 0) 4831 return FAIL; 4832 return OK; 4833 fail: 4834 vim_free(buf); 4835 vim_free(part); 4836 return FAIL; 4837 } 4838 4839 static int 4840 put_setnum( 4841 FILE *fd, 4842 char *cmd, 4843 char *name, 4844 long *valuep) 4845 { 4846 long wc; 4847 4848 if (fprintf(fd, "%s %s=", cmd, name) < 0) 4849 return FAIL; 4850 if (wc_use_keyname((char_u *)valuep, &wc)) 4851 { 4852 // print 'wildchar' and 'wildcharm' as a key name 4853 if (fputs((char *)get_special_key_name((int)wc, 0), fd) < 0) 4854 return FAIL; 4855 } 4856 else if (fprintf(fd, "%ld", *valuep) < 0) 4857 return FAIL; 4858 if (put_eol(fd) < 0) 4859 return FAIL; 4860 return OK; 4861 } 4862 4863 static int 4864 put_setbool( 4865 FILE *fd, 4866 char *cmd, 4867 char *name, 4868 int value) 4869 { 4870 if (value < 0) // global/local option using global value 4871 return OK; 4872 if (fprintf(fd, "%s %s%s", cmd, value ? "" : "no", name) < 0 4873 || put_eol(fd) < 0) 4874 return FAIL; 4875 return OK; 4876 } 4877 4878 /* 4879 * Clear all the terminal options. 4880 * If the option has been allocated, free the memory. 4881 * Terminal options are never hidden or indirect. 4882 */ 4883 void 4884 clear_termoptions(void) 4885 { 4886 /* 4887 * Reset a few things before clearing the old options. This may cause 4888 * outputting a few things that the terminal doesn't understand, but the 4889 * screen will be cleared later, so this is OK. 4890 */ 4891 mch_setmouse(FALSE); // switch mouse off 4892 #ifdef FEAT_TITLE 4893 mch_restore_title(SAVE_RESTORE_BOTH); // restore window titles 4894 #endif 4895 #if defined(FEAT_XCLIPBOARD) && defined(FEAT_GUI) 4896 // When starting the GUI close the display opened for the clipboard. 4897 // After restoring the title, because that will need the display. 4898 if (gui.starting) 4899 clear_xterm_clip(); 4900 #endif 4901 stoptermcap(); // stop termcap mode 4902 4903 free_termoptions(); 4904 } 4905 4906 void 4907 free_termoptions(void) 4908 { 4909 struct vimoption *p; 4910 4911 for (p = options; p->fullname != NULL; p++) 4912 if (istermoption(p)) 4913 { 4914 if (p->flags & P_ALLOCED) 4915 free_string_option(*(char_u **)(p->var)); 4916 if (p->flags & P_DEF_ALLOCED) 4917 free_string_option(p->def_val[VI_DEFAULT]); 4918 *(char_u **)(p->var) = empty_option; 4919 p->def_val[VI_DEFAULT] = empty_option; 4920 p->flags &= ~(P_ALLOCED|P_DEF_ALLOCED); 4921 #ifdef FEAT_EVAL 4922 // remember where the option was cleared 4923 set_option_sctx_idx((int)(p - options), OPT_GLOBAL, current_sctx); 4924 #endif 4925 } 4926 clear_termcodes(); 4927 } 4928 4929 /* 4930 * Free the string for one term option, if it was allocated. 4931 * Set the string to empty_option and clear allocated flag. 4932 * "var" points to the option value. 4933 */ 4934 void 4935 free_one_termoption(char_u *var) 4936 { 4937 struct vimoption *p; 4938 4939 for (p = &options[0]; p->fullname != NULL; p++) 4940 if (p->var == var) 4941 { 4942 if (p->flags & P_ALLOCED) 4943 free_string_option(*(char_u **)(p->var)); 4944 *(char_u **)(p->var) = empty_option; 4945 p->flags &= ~P_ALLOCED; 4946 break; 4947 } 4948 } 4949 4950 /* 4951 * Set the terminal option defaults to the current value. 4952 * Used after setting the terminal name. 4953 */ 4954 void 4955 set_term_defaults(void) 4956 { 4957 struct vimoption *p; 4958 4959 for (p = &options[0]; p->fullname != NULL; p++) 4960 { 4961 if (istermoption(p) && p->def_val[VI_DEFAULT] != *(char_u **)(p->var)) 4962 { 4963 if (p->flags & P_DEF_ALLOCED) 4964 { 4965 free_string_option(p->def_val[VI_DEFAULT]); 4966 p->flags &= ~P_DEF_ALLOCED; 4967 } 4968 p->def_val[VI_DEFAULT] = *(char_u **)(p->var); 4969 if (p->flags & P_ALLOCED) 4970 { 4971 p->flags |= P_DEF_ALLOCED; 4972 p->flags &= ~P_ALLOCED; // don't free the value now 4973 } 4974 } 4975 } 4976 } 4977 4978 /* 4979 * return TRUE if 'p' starts with 't_' 4980 */ 4981 static int 4982 istermoption(struct vimoption *p) 4983 { 4984 return (p->fullname[0] == 't' && p->fullname[1] == '_'); 4985 } 4986 4987 /* 4988 * Returns TRUE if the option at 'opt_idx' starts with 't_' 4989 */ 4990 int 4991 istermoption_idx(int opt_idx) 4992 { 4993 return istermoption(&options[opt_idx]); 4994 } 4995 4996 #if defined(FEAT_PYTHON) || defined(FEAT_PYTHON3) || defined(PROTO) 4997 /* 4998 * Unset local option value, similar to ":set opt<". 4999 */ 5000 void 5001 unset_global_local_option(char_u *name, void *from) 5002 { 5003 struct vimoption *p; 5004 int opt_idx; 5005 buf_T *buf = (buf_T *)from; 5006 5007 opt_idx = findoption(name); 5008 if (opt_idx < 0) 5009 return; 5010 p = &(options[opt_idx]); 5011 5012 switch ((int)p->indir) 5013 { 5014 // global option with local value: use local value if it's been set 5015 case PV_EP: 5016 clear_string_option(&buf->b_p_ep); 5017 break; 5018 case PV_KP: 5019 clear_string_option(&buf->b_p_kp); 5020 break; 5021 case PV_PATH: 5022 clear_string_option(&buf->b_p_path); 5023 break; 5024 case PV_AR: 5025 buf->b_p_ar = -1; 5026 break; 5027 case PV_BKC: 5028 clear_string_option(&buf->b_p_bkc); 5029 buf->b_bkc_flags = 0; 5030 break; 5031 case PV_TAGS: 5032 clear_string_option(&buf->b_p_tags); 5033 break; 5034 case PV_TC: 5035 clear_string_option(&buf->b_p_tc); 5036 buf->b_tc_flags = 0; 5037 break; 5038 case PV_SISO: 5039 curwin->w_p_siso = -1; 5040 break; 5041 case PV_SO: 5042 curwin->w_p_so = -1; 5043 break; 5044 #ifdef FEAT_FIND_ID 5045 case PV_DEF: 5046 clear_string_option(&buf->b_p_def); 5047 break; 5048 case PV_INC: 5049 clear_string_option(&buf->b_p_inc); 5050 break; 5051 #endif 5052 case PV_DICT: 5053 clear_string_option(&buf->b_p_dict); 5054 break; 5055 case PV_TSR: 5056 clear_string_option(&buf->b_p_tsr); 5057 break; 5058 case PV_FP: 5059 clear_string_option(&buf->b_p_fp); 5060 break; 5061 #ifdef FEAT_QUICKFIX 5062 case PV_EFM: 5063 clear_string_option(&buf->b_p_efm); 5064 break; 5065 case PV_GP: 5066 clear_string_option(&buf->b_p_gp); 5067 break; 5068 case PV_MP: 5069 clear_string_option(&buf->b_p_mp); 5070 break; 5071 #endif 5072 #if defined(FEAT_BEVAL) && defined(FEAT_EVAL) 5073 case PV_BEXPR: 5074 clear_string_option(&buf->b_p_bexpr); 5075 break; 5076 #endif 5077 #if defined(FEAT_CRYPT) 5078 case PV_CM: 5079 clear_string_option(&buf->b_p_cm); 5080 break; 5081 #endif 5082 #ifdef FEAT_LINEBREAK 5083 case PV_SBR: 5084 clear_string_option(&((win_T *)from)->w_p_sbr); 5085 break; 5086 #endif 5087 #ifdef FEAT_STL_OPT 5088 case PV_STL: 5089 clear_string_option(&((win_T *)from)->w_p_stl); 5090 break; 5091 #endif 5092 case PV_UL: 5093 buf->b_p_ul = NO_LOCAL_UNDOLEVEL; 5094 break; 5095 #ifdef FEAT_LISP 5096 case PV_LW: 5097 clear_string_option(&buf->b_p_lw); 5098 break; 5099 #endif 5100 case PV_MENC: 5101 clear_string_option(&buf->b_p_menc); 5102 break; 5103 case PV_LCS: 5104 clear_string_option(&((win_T *)from)->w_p_lcs); 5105 set_chars_option((win_T *)from, &((win_T *)from)->w_p_lcs); 5106 redraw_later(NOT_VALID); 5107 break; 5108 } 5109 } 5110 #endif 5111 5112 /* 5113 * Get pointer to option variable, depending on local or global scope. 5114 */ 5115 static char_u * 5116 get_varp_scope(struct vimoption *p, int opt_flags) 5117 { 5118 if ((opt_flags & OPT_GLOBAL) && p->indir != PV_NONE) 5119 { 5120 if (p->var == VAR_WIN) 5121 return (char_u *)GLOBAL_WO(get_varp(p)); 5122 return p->var; 5123 } 5124 if ((opt_flags & OPT_LOCAL) && ((int)p->indir & PV_BOTH)) 5125 { 5126 switch ((int)p->indir) 5127 { 5128 case PV_FP: return (char_u *)&(curbuf->b_p_fp); 5129 #ifdef FEAT_QUICKFIX 5130 case PV_EFM: return (char_u *)&(curbuf->b_p_efm); 5131 case PV_GP: return (char_u *)&(curbuf->b_p_gp); 5132 case PV_MP: return (char_u *)&(curbuf->b_p_mp); 5133 #endif 5134 case PV_EP: return (char_u *)&(curbuf->b_p_ep); 5135 case PV_KP: return (char_u *)&(curbuf->b_p_kp); 5136 case PV_PATH: return (char_u *)&(curbuf->b_p_path); 5137 case PV_AR: return (char_u *)&(curbuf->b_p_ar); 5138 case PV_TAGS: return (char_u *)&(curbuf->b_p_tags); 5139 case PV_TC: return (char_u *)&(curbuf->b_p_tc); 5140 case PV_SISO: return (char_u *)&(curwin->w_p_siso); 5141 case PV_SO: return (char_u *)&(curwin->w_p_so); 5142 #ifdef FEAT_FIND_ID 5143 case PV_DEF: return (char_u *)&(curbuf->b_p_def); 5144 case PV_INC: return (char_u *)&(curbuf->b_p_inc); 5145 #endif 5146 case PV_DICT: return (char_u *)&(curbuf->b_p_dict); 5147 case PV_TSR: return (char_u *)&(curbuf->b_p_tsr); 5148 #if defined(FEAT_BEVAL) && defined(FEAT_EVAL) 5149 case PV_BEXPR: return (char_u *)&(curbuf->b_p_bexpr); 5150 #endif 5151 #if defined(FEAT_CRYPT) 5152 case PV_CM: return (char_u *)&(curbuf->b_p_cm); 5153 #endif 5154 #ifdef FEAT_LINEBREAK 5155 case PV_SBR: return (char_u *)&(curwin->w_p_sbr); 5156 #endif 5157 #ifdef FEAT_STL_OPT 5158 case PV_STL: return (char_u *)&(curwin->w_p_stl); 5159 #endif 5160 case PV_UL: return (char_u *)&(curbuf->b_p_ul); 5161 #ifdef FEAT_LISP 5162 case PV_LW: return (char_u *)&(curbuf->b_p_lw); 5163 #endif 5164 case PV_BKC: return (char_u *)&(curbuf->b_p_bkc); 5165 case PV_MENC: return (char_u *)&(curbuf->b_p_menc); 5166 case PV_LCS: return (char_u *)&(curwin->w_p_lcs); 5167 5168 } 5169 return NULL; // "cannot happen" 5170 } 5171 return get_varp(p); 5172 } 5173 5174 /* 5175 * Get pointer to option variable at 'opt_idx', depending on local or global 5176 * scope. 5177 */ 5178 char_u * 5179 get_option_varp_scope(int opt_idx, int opt_flags) 5180 { 5181 return get_varp_scope(&(options[opt_idx]), opt_flags); 5182 } 5183 5184 /* 5185 * Get pointer to option variable. 5186 */ 5187 static char_u * 5188 get_varp(struct vimoption *p) 5189 { 5190 // hidden option, always return NULL 5191 if (p->var == NULL) 5192 return NULL; 5193 5194 switch ((int)p->indir) 5195 { 5196 case PV_NONE: return p->var; 5197 5198 // global option with local value: use local value if it's been set 5199 case PV_EP: return *curbuf->b_p_ep != NUL 5200 ? (char_u *)&curbuf->b_p_ep : p->var; 5201 case PV_KP: return *curbuf->b_p_kp != NUL 5202 ? (char_u *)&curbuf->b_p_kp : p->var; 5203 case PV_PATH: return *curbuf->b_p_path != NUL 5204 ? (char_u *)&(curbuf->b_p_path) : p->var; 5205 case PV_AR: return curbuf->b_p_ar >= 0 5206 ? (char_u *)&(curbuf->b_p_ar) : p->var; 5207 case PV_TAGS: return *curbuf->b_p_tags != NUL 5208 ? (char_u *)&(curbuf->b_p_tags) : p->var; 5209 case PV_TC: return *curbuf->b_p_tc != NUL 5210 ? (char_u *)&(curbuf->b_p_tc) : p->var; 5211 case PV_BKC: return *curbuf->b_p_bkc != NUL 5212 ? (char_u *)&(curbuf->b_p_bkc) : p->var; 5213 case PV_SISO: return curwin->w_p_siso >= 0 5214 ? (char_u *)&(curwin->w_p_siso) : p->var; 5215 case PV_SO: return curwin->w_p_so >= 0 5216 ? (char_u *)&(curwin->w_p_so) : p->var; 5217 #ifdef FEAT_FIND_ID 5218 case PV_DEF: return *curbuf->b_p_def != NUL 5219 ? (char_u *)&(curbuf->b_p_def) : p->var; 5220 case PV_INC: return *curbuf->b_p_inc != NUL 5221 ? (char_u *)&(curbuf->b_p_inc) : p->var; 5222 #endif 5223 case PV_DICT: return *curbuf->b_p_dict != NUL 5224 ? (char_u *)&(curbuf->b_p_dict) : p->var; 5225 case PV_TSR: return *curbuf->b_p_tsr != NUL 5226 ? (char_u *)&(curbuf->b_p_tsr) : p->var; 5227 case PV_FP: return *curbuf->b_p_fp != NUL 5228 ? (char_u *)&(curbuf->b_p_fp) : p->var; 5229 #ifdef FEAT_QUICKFIX 5230 case PV_EFM: return *curbuf->b_p_efm != NUL 5231 ? (char_u *)&(curbuf->b_p_efm) : p->var; 5232 case PV_GP: return *curbuf->b_p_gp != NUL 5233 ? (char_u *)&(curbuf->b_p_gp) : p->var; 5234 case PV_MP: return *curbuf->b_p_mp != NUL 5235 ? (char_u *)&(curbuf->b_p_mp) : p->var; 5236 #endif 5237 #if defined(FEAT_BEVAL) && defined(FEAT_EVAL) 5238 case PV_BEXPR: return *curbuf->b_p_bexpr != NUL 5239 ? (char_u *)&(curbuf->b_p_bexpr) : p->var; 5240 #endif 5241 #if defined(FEAT_CRYPT) 5242 case PV_CM: return *curbuf->b_p_cm != NUL 5243 ? (char_u *)&(curbuf->b_p_cm) : p->var; 5244 #endif 5245 #ifdef FEAT_LINEBREAK 5246 case PV_SBR: return *curwin->w_p_sbr != NUL 5247 ? (char_u *)&(curwin->w_p_sbr) : p->var; 5248 #endif 5249 #ifdef FEAT_STL_OPT 5250 case PV_STL: return *curwin->w_p_stl != NUL 5251 ? (char_u *)&(curwin->w_p_stl) : p->var; 5252 #endif 5253 case PV_UL: return curbuf->b_p_ul != NO_LOCAL_UNDOLEVEL 5254 ? (char_u *)&(curbuf->b_p_ul) : p->var; 5255 #ifdef FEAT_LISP 5256 case PV_LW: return *curbuf->b_p_lw != NUL 5257 ? (char_u *)&(curbuf->b_p_lw) : p->var; 5258 #endif 5259 case PV_MENC: return *curbuf->b_p_menc != NUL 5260 ? (char_u *)&(curbuf->b_p_menc) : p->var; 5261 #ifdef FEAT_ARABIC 5262 case PV_ARAB: return (char_u *)&(curwin->w_p_arab); 5263 #endif 5264 case PV_LIST: return (char_u *)&(curwin->w_p_list); 5265 case PV_LCS: return *curwin->w_p_lcs != NUL 5266 ? (char_u *)&(curwin->w_p_lcs) : p->var; 5267 #ifdef FEAT_SPELL 5268 case PV_SPELL: return (char_u *)&(curwin->w_p_spell); 5269 #endif 5270 #ifdef FEAT_SYN_HL 5271 case PV_CUC: return (char_u *)&(curwin->w_p_cuc); 5272 case PV_CUL: return (char_u *)&(curwin->w_p_cul); 5273 case PV_CULOPT: return (char_u *)&(curwin->w_p_culopt); 5274 case PV_CC: return (char_u *)&(curwin->w_p_cc); 5275 #endif 5276 #ifdef FEAT_DIFF 5277 case PV_DIFF: return (char_u *)&(curwin->w_p_diff); 5278 #endif 5279 #ifdef FEAT_FOLDING 5280 case PV_FDC: return (char_u *)&(curwin->w_p_fdc); 5281 case PV_FEN: return (char_u *)&(curwin->w_p_fen); 5282 case PV_FDI: return (char_u *)&(curwin->w_p_fdi); 5283 case PV_FDL: return (char_u *)&(curwin->w_p_fdl); 5284 case PV_FDM: return (char_u *)&(curwin->w_p_fdm); 5285 case PV_FML: return (char_u *)&(curwin->w_p_fml); 5286 case PV_FDN: return (char_u *)&(curwin->w_p_fdn); 5287 # ifdef FEAT_EVAL 5288 case PV_FDE: return (char_u *)&(curwin->w_p_fde); 5289 case PV_FDT: return (char_u *)&(curwin->w_p_fdt); 5290 # endif 5291 case PV_FMR: return (char_u *)&(curwin->w_p_fmr); 5292 #endif 5293 case PV_NU: return (char_u *)&(curwin->w_p_nu); 5294 case PV_RNU: return (char_u *)&(curwin->w_p_rnu); 5295 #ifdef FEAT_LINEBREAK 5296 case PV_NUW: return (char_u *)&(curwin->w_p_nuw); 5297 #endif 5298 case PV_WFH: return (char_u *)&(curwin->w_p_wfh); 5299 case PV_WFW: return (char_u *)&(curwin->w_p_wfw); 5300 #if defined(FEAT_QUICKFIX) 5301 case PV_PVW: return (char_u *)&(curwin->w_p_pvw); 5302 #endif 5303 #ifdef FEAT_RIGHTLEFT 5304 case PV_RL: return (char_u *)&(curwin->w_p_rl); 5305 case PV_RLC: return (char_u *)&(curwin->w_p_rlc); 5306 #endif 5307 case PV_SCROLL: return (char_u *)&(curwin->w_p_scr); 5308 case PV_WRAP: return (char_u *)&(curwin->w_p_wrap); 5309 #ifdef FEAT_LINEBREAK 5310 case PV_LBR: return (char_u *)&(curwin->w_p_lbr); 5311 case PV_BRI: return (char_u *)&(curwin->w_p_bri); 5312 case PV_BRIOPT: return (char_u *)&(curwin->w_p_briopt); 5313 #endif 5314 case PV_WCR: return (char_u *)&(curwin->w_p_wcr); 5315 case PV_SCBIND: return (char_u *)&(curwin->w_p_scb); 5316 case PV_CRBIND: return (char_u *)&(curwin->w_p_crb); 5317 #ifdef FEAT_CONCEAL 5318 case PV_COCU: return (char_u *)&(curwin->w_p_cocu); 5319 case PV_COLE: return (char_u *)&(curwin->w_p_cole); 5320 #endif 5321 #ifdef FEAT_TERMINAL 5322 case PV_TWK: return (char_u *)&(curwin->w_p_twk); 5323 case PV_TWS: return (char_u *)&(curwin->w_p_tws); 5324 case PV_TWSL: return (char_u *)&(curbuf->b_p_twsl); 5325 #endif 5326 5327 case PV_AI: return (char_u *)&(curbuf->b_p_ai); 5328 case PV_BIN: return (char_u *)&(curbuf->b_p_bin); 5329 case PV_BOMB: return (char_u *)&(curbuf->b_p_bomb); 5330 case PV_BH: return (char_u *)&(curbuf->b_p_bh); 5331 case PV_BT: return (char_u *)&(curbuf->b_p_bt); 5332 case PV_BL: return (char_u *)&(curbuf->b_p_bl); 5333 case PV_CI: return (char_u *)&(curbuf->b_p_ci); 5334 #ifdef FEAT_CINDENT 5335 case PV_CIN: return (char_u *)&(curbuf->b_p_cin); 5336 case PV_CINK: return (char_u *)&(curbuf->b_p_cink); 5337 case PV_CINO: return (char_u *)&(curbuf->b_p_cino); 5338 #endif 5339 #if defined(FEAT_SMARTINDENT) || defined(FEAT_CINDENT) 5340 case PV_CINW: return (char_u *)&(curbuf->b_p_cinw); 5341 #endif 5342 case PV_COM: return (char_u *)&(curbuf->b_p_com); 5343 #ifdef FEAT_FOLDING 5344 case PV_CMS: return (char_u *)&(curbuf->b_p_cms); 5345 #endif 5346 case PV_CPT: return (char_u *)&(curbuf->b_p_cpt); 5347 #ifdef BACKSLASH_IN_FILENAME 5348 case PV_CSL: return (char_u *)&(curbuf->b_p_csl); 5349 #endif 5350 #ifdef FEAT_COMPL_FUNC 5351 case PV_CFU: return (char_u *)&(curbuf->b_p_cfu); 5352 case PV_OFU: return (char_u *)&(curbuf->b_p_ofu); 5353 #endif 5354 #ifdef FEAT_EVAL 5355 case PV_TFU: return (char_u *)&(curbuf->b_p_tfu); 5356 #endif 5357 case PV_EOL: return (char_u *)&(curbuf->b_p_eol); 5358 case PV_FIXEOL: return (char_u *)&(curbuf->b_p_fixeol); 5359 case PV_ET: return (char_u *)&(curbuf->b_p_et); 5360 case PV_FENC: return (char_u *)&(curbuf->b_p_fenc); 5361 case PV_FF: return (char_u *)&(curbuf->b_p_ff); 5362 case PV_FT: return (char_u *)&(curbuf->b_p_ft); 5363 case PV_FO: return (char_u *)&(curbuf->b_p_fo); 5364 case PV_FLP: return (char_u *)&(curbuf->b_p_flp); 5365 case PV_IMI: return (char_u *)&(curbuf->b_p_iminsert); 5366 case PV_IMS: return (char_u *)&(curbuf->b_p_imsearch); 5367 case PV_INF: return (char_u *)&(curbuf->b_p_inf); 5368 case PV_ISK: return (char_u *)&(curbuf->b_p_isk); 5369 #ifdef FEAT_FIND_ID 5370 # ifdef FEAT_EVAL 5371 case PV_INEX: return (char_u *)&(curbuf->b_p_inex); 5372 # endif 5373 #endif 5374 #if defined(FEAT_CINDENT) && defined(FEAT_EVAL) 5375 case PV_INDE: return (char_u *)&(curbuf->b_p_inde); 5376 case PV_INDK: return (char_u *)&(curbuf->b_p_indk); 5377 #endif 5378 #ifdef FEAT_EVAL 5379 case PV_FEX: return (char_u *)&(curbuf->b_p_fex); 5380 #endif 5381 #ifdef FEAT_CRYPT 5382 case PV_KEY: return (char_u *)&(curbuf->b_p_key); 5383 #endif 5384 #ifdef FEAT_LISP 5385 case PV_LISP: return (char_u *)&(curbuf->b_p_lisp); 5386 #endif 5387 case PV_ML: return (char_u *)&(curbuf->b_p_ml); 5388 case PV_MPS: return (char_u *)&(curbuf->b_p_mps); 5389 case PV_MA: return (char_u *)&(curbuf->b_p_ma); 5390 case PV_MOD: return (char_u *)&(curbuf->b_changed); 5391 case PV_NF: return (char_u *)&(curbuf->b_p_nf); 5392 case PV_PI: return (char_u *)&(curbuf->b_p_pi); 5393 #ifdef FEAT_TEXTOBJ 5394 case PV_QE: return (char_u *)&(curbuf->b_p_qe); 5395 #endif 5396 case PV_RO: return (char_u *)&(curbuf->b_p_ro); 5397 #ifdef FEAT_SMARTINDENT 5398 case PV_SI: return (char_u *)&(curbuf->b_p_si); 5399 #endif 5400 case PV_SN: return (char_u *)&(curbuf->b_p_sn); 5401 case PV_STS: return (char_u *)&(curbuf->b_p_sts); 5402 #ifdef FEAT_SEARCHPATH 5403 case PV_SUA: return (char_u *)&(curbuf->b_p_sua); 5404 #endif 5405 case PV_SWF: return (char_u *)&(curbuf->b_p_swf); 5406 #ifdef FEAT_SYN_HL 5407 case PV_SMC: return (char_u *)&(curbuf->b_p_smc); 5408 case PV_SYN: return (char_u *)&(curbuf->b_p_syn); 5409 #endif 5410 #ifdef FEAT_SPELL 5411 case PV_SPC: return (char_u *)&(curwin->w_s->b_p_spc); 5412 case PV_SPF: return (char_u *)&(curwin->w_s->b_p_spf); 5413 case PV_SPL: return (char_u *)&(curwin->w_s->b_p_spl); 5414 case PV_SPO: return (char_u *)&(curwin->w_s->b_p_spo); 5415 #endif 5416 case PV_SW: return (char_u *)&(curbuf->b_p_sw); 5417 case PV_TS: return (char_u *)&(curbuf->b_p_ts); 5418 case PV_TW: return (char_u *)&(curbuf->b_p_tw); 5419 case PV_TX: return (char_u *)&(curbuf->b_p_tx); 5420 #ifdef FEAT_PERSISTENT_UNDO 5421 case PV_UDF: return (char_u *)&(curbuf->b_p_udf); 5422 #endif 5423 case PV_WM: return (char_u *)&(curbuf->b_p_wm); 5424 #ifdef FEAT_KEYMAP 5425 case PV_KMAP: return (char_u *)&(curbuf->b_p_keymap); 5426 #endif 5427 #ifdef FEAT_SIGNS 5428 case PV_SCL: return (char_u *)&(curwin->w_p_scl); 5429 #endif 5430 #ifdef FEAT_VARTABS 5431 case PV_VSTS: return (char_u *)&(curbuf->b_p_vsts); 5432 case PV_VTS: return (char_u *)&(curbuf->b_p_vts); 5433 #endif 5434 default: iemsg(_("E356: get_varp ERROR")); 5435 } 5436 // always return a valid pointer to avoid a crash! 5437 return (char_u *)&(curbuf->b_p_wm); 5438 } 5439 5440 /* 5441 * Return a pointer to the variable for option at 'opt_idx' 5442 */ 5443 char_u * 5444 get_option_var(int opt_idx) 5445 { 5446 return options[opt_idx].var; 5447 } 5448 5449 /* 5450 * Return the full name of the option at 'opt_idx' 5451 */ 5452 char_u * 5453 get_option_fullname(int opt_idx) 5454 { 5455 return (char_u *)options[opt_idx].fullname; 5456 } 5457 5458 /* 5459 * Get the value of 'equalprg', either the buffer-local one or the global one. 5460 */ 5461 char_u * 5462 get_equalprg(void) 5463 { 5464 if (*curbuf->b_p_ep == NUL) 5465 return p_ep; 5466 return curbuf->b_p_ep; 5467 } 5468 5469 /* 5470 * Copy options from one window to another. 5471 * Used when splitting a window. 5472 */ 5473 void 5474 win_copy_options(win_T *wp_from, win_T *wp_to) 5475 { 5476 copy_winopt(&wp_from->w_onebuf_opt, &wp_to->w_onebuf_opt); 5477 copy_winopt(&wp_from->w_allbuf_opt, &wp_to->w_allbuf_opt); 5478 after_copy_winopt(wp_to); 5479 } 5480 5481 /* 5482 * After copying window options: update variables depending on options. 5483 */ 5484 void 5485 after_copy_winopt(win_T *wp UNUSED) 5486 { 5487 #ifdef FEAT_LINEBREAK 5488 briopt_check(wp); 5489 #endif 5490 #ifdef FEAT_SYN_HL 5491 fill_culopt_flags(NULL, wp); 5492 check_colorcolumn(wp); 5493 #endif 5494 set_chars_option(wp, &wp->w_p_lcs); 5495 } 5496 5497 /* 5498 * Copy the options from one winopt_T to another. 5499 * Doesn't free the old option values in "to", use clear_winopt() for that. 5500 * The 'scroll' option is not copied, because it depends on the window height. 5501 * The 'previewwindow' option is reset, there can be only one preview window. 5502 */ 5503 void 5504 copy_winopt(winopt_T *from, winopt_T *to) 5505 { 5506 #ifdef FEAT_ARABIC 5507 to->wo_arab = from->wo_arab; 5508 #endif 5509 to->wo_list = from->wo_list; 5510 to->wo_lcs = vim_strsave(from->wo_lcs); 5511 to->wo_nu = from->wo_nu; 5512 to->wo_rnu = from->wo_rnu; 5513 #ifdef FEAT_LINEBREAK 5514 to->wo_nuw = from->wo_nuw; 5515 #endif 5516 #ifdef FEAT_RIGHTLEFT 5517 to->wo_rl = from->wo_rl; 5518 to->wo_rlc = vim_strsave(from->wo_rlc); 5519 #endif 5520 #ifdef FEAT_LINEBREAK 5521 to->wo_sbr = vim_strsave(from->wo_sbr); 5522 #endif 5523 #ifdef FEAT_STL_OPT 5524 to->wo_stl = vim_strsave(from->wo_stl); 5525 #endif 5526 to->wo_wrap = from->wo_wrap; 5527 #ifdef FEAT_DIFF 5528 to->wo_wrap_save = from->wo_wrap_save; 5529 #endif 5530 #ifdef FEAT_LINEBREAK 5531 to->wo_lbr = from->wo_lbr; 5532 to->wo_bri = from->wo_bri; 5533 to->wo_briopt = vim_strsave(from->wo_briopt); 5534 #endif 5535 to->wo_wcr = vim_strsave(from->wo_wcr); 5536 to->wo_scb = from->wo_scb; 5537 to->wo_scb_save = from->wo_scb_save; 5538 to->wo_crb = from->wo_crb; 5539 to->wo_crb_save = from->wo_crb_save; 5540 #ifdef FEAT_SPELL 5541 to->wo_spell = from->wo_spell; 5542 #endif 5543 #ifdef FEAT_SYN_HL 5544 to->wo_cuc = from->wo_cuc; 5545 to->wo_cul = from->wo_cul; 5546 to->wo_culopt = vim_strsave(from->wo_culopt); 5547 to->wo_cc = vim_strsave(from->wo_cc); 5548 #endif 5549 #ifdef FEAT_DIFF 5550 to->wo_diff = from->wo_diff; 5551 to->wo_diff_saved = from->wo_diff_saved; 5552 #endif 5553 #ifdef FEAT_CONCEAL 5554 to->wo_cocu = vim_strsave(from->wo_cocu); 5555 to->wo_cole = from->wo_cole; 5556 #endif 5557 #ifdef FEAT_TERMINAL 5558 to->wo_twk = vim_strsave(from->wo_twk); 5559 to->wo_tws = vim_strsave(from->wo_tws); 5560 #endif 5561 #ifdef FEAT_FOLDING 5562 to->wo_fdc = from->wo_fdc; 5563 to->wo_fdc_save = from->wo_fdc_save; 5564 to->wo_fen = from->wo_fen; 5565 to->wo_fen_save = from->wo_fen_save; 5566 to->wo_fdi = vim_strsave(from->wo_fdi); 5567 to->wo_fml = from->wo_fml; 5568 to->wo_fdl = from->wo_fdl; 5569 to->wo_fdl_save = from->wo_fdl_save; 5570 to->wo_fdm = vim_strsave(from->wo_fdm); 5571 to->wo_fdm_save = from->wo_diff_saved 5572 ? vim_strsave(from->wo_fdm_save) : empty_option; 5573 to->wo_fdn = from->wo_fdn; 5574 # ifdef FEAT_EVAL 5575 to->wo_fde = vim_strsave(from->wo_fde); 5576 to->wo_fdt = vim_strsave(from->wo_fdt); 5577 # endif 5578 to->wo_fmr = vim_strsave(from->wo_fmr); 5579 #endif 5580 #ifdef FEAT_SIGNS 5581 to->wo_scl = vim_strsave(from->wo_scl); 5582 #endif 5583 5584 #ifdef FEAT_EVAL 5585 // Copy the script context so that we know where the value was last set. 5586 mch_memmove(to->wo_script_ctx, from->wo_script_ctx, 5587 sizeof(to->wo_script_ctx)); 5588 #endif 5589 check_winopt(to); // don't want NULL pointers 5590 } 5591 5592 /* 5593 * Check string options in a window for a NULL value. 5594 */ 5595 static void 5596 check_win_options(win_T *win) 5597 { 5598 check_winopt(&win->w_onebuf_opt); 5599 check_winopt(&win->w_allbuf_opt); 5600 } 5601 5602 /* 5603 * Check for NULL pointers in a winopt_T and replace them with empty_option. 5604 */ 5605 static void 5606 check_winopt(winopt_T *wop UNUSED) 5607 { 5608 #ifdef FEAT_FOLDING 5609 check_string_option(&wop->wo_fdi); 5610 check_string_option(&wop->wo_fdm); 5611 check_string_option(&wop->wo_fdm_save); 5612 # ifdef FEAT_EVAL 5613 check_string_option(&wop->wo_fde); 5614 check_string_option(&wop->wo_fdt); 5615 # endif 5616 check_string_option(&wop->wo_fmr); 5617 #endif 5618 #ifdef FEAT_SIGNS 5619 check_string_option(&wop->wo_scl); 5620 #endif 5621 #ifdef FEAT_RIGHTLEFT 5622 check_string_option(&wop->wo_rlc); 5623 #endif 5624 #ifdef FEAT_LINEBREAK 5625 check_string_option(&wop->wo_sbr); 5626 #endif 5627 #ifdef FEAT_STL_OPT 5628 check_string_option(&wop->wo_stl); 5629 #endif 5630 #ifdef FEAT_SYN_HL 5631 check_string_option(&wop->wo_culopt); 5632 check_string_option(&wop->wo_cc); 5633 #endif 5634 #ifdef FEAT_CONCEAL 5635 check_string_option(&wop->wo_cocu); 5636 #endif 5637 #ifdef FEAT_TERMINAL 5638 check_string_option(&wop->wo_twk); 5639 check_string_option(&wop->wo_tws); 5640 #endif 5641 #ifdef FEAT_LINEBREAK 5642 check_string_option(&wop->wo_briopt); 5643 #endif 5644 check_string_option(&wop->wo_wcr); 5645 check_string_option(&wop->wo_lcs); 5646 } 5647 5648 /* 5649 * Free the allocated memory inside a winopt_T. 5650 */ 5651 void 5652 clear_winopt(winopt_T *wop UNUSED) 5653 { 5654 #ifdef FEAT_FOLDING 5655 clear_string_option(&wop->wo_fdi); 5656 clear_string_option(&wop->wo_fdm); 5657 clear_string_option(&wop->wo_fdm_save); 5658 # ifdef FEAT_EVAL 5659 clear_string_option(&wop->wo_fde); 5660 clear_string_option(&wop->wo_fdt); 5661 # endif 5662 clear_string_option(&wop->wo_fmr); 5663 #endif 5664 #ifdef FEAT_SIGNS 5665 clear_string_option(&wop->wo_scl); 5666 #endif 5667 #ifdef FEAT_LINEBREAK 5668 clear_string_option(&wop->wo_briopt); 5669 #endif 5670 clear_string_option(&wop->wo_wcr); 5671 #ifdef FEAT_RIGHTLEFT 5672 clear_string_option(&wop->wo_rlc); 5673 #endif 5674 #ifdef FEAT_LINEBREAK 5675 clear_string_option(&wop->wo_sbr); 5676 #endif 5677 #ifdef FEAT_STL_OPT 5678 clear_string_option(&wop->wo_stl); 5679 #endif 5680 #ifdef FEAT_SYN_HL 5681 clear_string_option(&wop->wo_culopt); 5682 clear_string_option(&wop->wo_cc); 5683 #endif 5684 #ifdef FEAT_CONCEAL 5685 clear_string_option(&wop->wo_cocu); 5686 #endif 5687 #ifdef FEAT_TERMINAL 5688 clear_string_option(&wop->wo_twk); 5689 clear_string_option(&wop->wo_tws); 5690 #endif 5691 clear_string_option(&wop->wo_lcs); 5692 } 5693 5694 #ifdef FEAT_EVAL 5695 // Index into the options table for a buffer-local option enum. 5696 static int buf_opt_idx[BV_COUNT]; 5697 # define COPY_OPT_SCTX(buf, bv) buf->b_p_script_ctx[bv] = options[buf_opt_idx[bv]].script_ctx 5698 5699 /* 5700 * Initialize buf_opt_idx[] if not done already. 5701 */ 5702 static void 5703 init_buf_opt_idx(void) 5704 { 5705 static int did_init_buf_opt_idx = FALSE; 5706 int i; 5707 5708 if (did_init_buf_opt_idx) 5709 return; 5710 did_init_buf_opt_idx = TRUE; 5711 for (i = 0; !istermoption_idx(i); i++) 5712 if (options[i].indir & PV_BUF) 5713 buf_opt_idx[options[i].indir & PV_MASK] = i; 5714 } 5715 #else 5716 # define COPY_OPT_SCTX(buf, bv) 5717 #endif 5718 5719 /* 5720 * Copy global option values to local options for one buffer. 5721 * Used when creating a new buffer and sometimes when entering a buffer. 5722 * flags: 5723 * BCO_ENTER We will enter the buffer "buf". 5724 * BCO_ALWAYS Always copy the options, but only set b_p_initialized when 5725 * appropriate. 5726 * BCO_NOHELP Don't copy the values to a help buffer. 5727 */ 5728 void 5729 buf_copy_options(buf_T *buf, int flags) 5730 { 5731 int should_copy = TRUE; 5732 char_u *save_p_isk = NULL; // init for GCC 5733 int dont_do_help; 5734 int did_isk = FALSE; 5735 5736 /* 5737 * Skip this when the option defaults have not been set yet. Happens when 5738 * main() allocates the first buffer. 5739 */ 5740 if (p_cpo != NULL) 5741 { 5742 /* 5743 * Always copy when entering and 'cpo' contains 'S'. 5744 * Don't copy when already initialized. 5745 * Don't copy when 'cpo' contains 's' and not entering. 5746 * 'S' BCO_ENTER initialized 's' should_copy 5747 * yes yes X X TRUE 5748 * yes no yes X FALSE 5749 * no X yes X FALSE 5750 * X no no yes FALSE 5751 * X no no no TRUE 5752 * no yes no X TRUE 5753 */ 5754 if ((vim_strchr(p_cpo, CPO_BUFOPTGLOB) == NULL || !(flags & BCO_ENTER)) 5755 && (buf->b_p_initialized 5756 || (!(flags & BCO_ENTER) 5757 && vim_strchr(p_cpo, CPO_BUFOPT) != NULL))) 5758 should_copy = FALSE; 5759 5760 if (should_copy || (flags & BCO_ALWAYS)) 5761 { 5762 #ifdef FEAT_EVAL 5763 CLEAR_FIELD(buf->b_p_script_ctx); 5764 init_buf_opt_idx(); 5765 #endif 5766 // Don't copy the options specific to a help buffer when 5767 // BCO_NOHELP is given or the options were initialized already 5768 // (jumping back to a help file with CTRL-T or CTRL-O) 5769 dont_do_help = ((flags & BCO_NOHELP) && buf->b_help) 5770 || buf->b_p_initialized; 5771 if (dont_do_help) // don't free b_p_isk 5772 { 5773 save_p_isk = buf->b_p_isk; 5774 buf->b_p_isk = NULL; 5775 } 5776 /* 5777 * Always free the allocated strings. If not already initialized, 5778 * reset 'readonly' and copy 'fileformat'. 5779 */ 5780 if (!buf->b_p_initialized) 5781 { 5782 free_buf_options(buf, TRUE); 5783 buf->b_p_ro = FALSE; // don't copy readonly 5784 buf->b_p_tx = p_tx; 5785 buf->b_p_fenc = vim_strsave(p_fenc); 5786 switch (*p_ffs) 5787 { 5788 case 'm': 5789 buf->b_p_ff = vim_strsave((char_u *)FF_MAC); break; 5790 case 'd': 5791 buf->b_p_ff = vim_strsave((char_u *)FF_DOS); break; 5792 case 'u': 5793 buf->b_p_ff = vim_strsave((char_u *)FF_UNIX); break; 5794 default: 5795 buf->b_p_ff = vim_strsave(p_ff); 5796 } 5797 if (buf->b_p_ff != NULL) 5798 buf->b_start_ffc = *buf->b_p_ff; 5799 buf->b_p_bh = empty_option; 5800 buf->b_p_bt = empty_option; 5801 } 5802 else 5803 free_buf_options(buf, FALSE); 5804 5805 buf->b_p_ai = p_ai; 5806 COPY_OPT_SCTX(buf, BV_AI); 5807 buf->b_p_ai_nopaste = p_ai_nopaste; 5808 buf->b_p_sw = p_sw; 5809 COPY_OPT_SCTX(buf, BV_SW); 5810 buf->b_p_tw = p_tw; 5811 COPY_OPT_SCTX(buf, BV_TW); 5812 buf->b_p_tw_nopaste = p_tw_nopaste; 5813 buf->b_p_tw_nobin = p_tw_nobin; 5814 buf->b_p_wm = p_wm; 5815 COPY_OPT_SCTX(buf, BV_WM); 5816 buf->b_p_wm_nopaste = p_wm_nopaste; 5817 buf->b_p_wm_nobin = p_wm_nobin; 5818 buf->b_p_bin = p_bin; 5819 COPY_OPT_SCTX(buf, BV_BIN); 5820 buf->b_p_bomb = p_bomb; 5821 COPY_OPT_SCTX(buf, BV_BOMB); 5822 buf->b_p_fixeol = p_fixeol; 5823 COPY_OPT_SCTX(buf, BV_FIXEOL); 5824 buf->b_p_et = p_et; 5825 COPY_OPT_SCTX(buf, BV_ET); 5826 buf->b_p_et_nobin = p_et_nobin; 5827 buf->b_p_et_nopaste = p_et_nopaste; 5828 buf->b_p_ml = p_ml; 5829 COPY_OPT_SCTX(buf, BV_ML); 5830 buf->b_p_ml_nobin = p_ml_nobin; 5831 buf->b_p_inf = p_inf; 5832 COPY_OPT_SCTX(buf, BV_INF); 5833 if (cmdmod.cmod_flags & CMOD_NOSWAPFILE) 5834 buf->b_p_swf = FALSE; 5835 else 5836 { 5837 buf->b_p_swf = p_swf; 5838 COPY_OPT_SCTX(buf, BV_INF); 5839 } 5840 buf->b_p_cpt = vim_strsave(p_cpt); 5841 COPY_OPT_SCTX(buf, BV_CPT); 5842 #ifdef BACKSLASH_IN_FILENAME 5843 buf->b_p_csl = vim_strsave(p_csl); 5844 COPY_OPT_SCTX(buf, BV_CSL); 5845 #endif 5846 #ifdef FEAT_COMPL_FUNC 5847 buf->b_p_cfu = vim_strsave(p_cfu); 5848 COPY_OPT_SCTX(buf, BV_CFU); 5849 buf->b_p_ofu = vim_strsave(p_ofu); 5850 COPY_OPT_SCTX(buf, BV_OFU); 5851 #endif 5852 #ifdef FEAT_EVAL 5853 buf->b_p_tfu = vim_strsave(p_tfu); 5854 COPY_OPT_SCTX(buf, BV_TFU); 5855 #endif 5856 buf->b_p_sts = p_sts; 5857 COPY_OPT_SCTX(buf, BV_STS); 5858 buf->b_p_sts_nopaste = p_sts_nopaste; 5859 #ifdef FEAT_VARTABS 5860 buf->b_p_vsts = vim_strsave(p_vsts); 5861 COPY_OPT_SCTX(buf, BV_VSTS); 5862 if (p_vsts && p_vsts != empty_option) 5863 tabstop_set(p_vsts, &buf->b_p_vsts_array); 5864 else 5865 buf->b_p_vsts_array = 0; 5866 buf->b_p_vsts_nopaste = p_vsts_nopaste 5867 ? vim_strsave(p_vsts_nopaste) : NULL; 5868 #endif 5869 buf->b_p_sn = p_sn; 5870 COPY_OPT_SCTX(buf, BV_SN); 5871 buf->b_p_com = vim_strsave(p_com); 5872 COPY_OPT_SCTX(buf, BV_COM); 5873 #ifdef FEAT_FOLDING 5874 buf->b_p_cms = vim_strsave(p_cms); 5875 COPY_OPT_SCTX(buf, BV_CMS); 5876 #endif 5877 buf->b_p_fo = vim_strsave(p_fo); 5878 COPY_OPT_SCTX(buf, BV_FO); 5879 buf->b_p_flp = vim_strsave(p_flp); 5880 COPY_OPT_SCTX(buf, BV_FLP); 5881 // NOTE: Valgrind may report a bogus memory leak for 'nrformats' 5882 // when it is set to 8 bytes in defaults.vim. 5883 buf->b_p_nf = vim_strsave(p_nf); 5884 COPY_OPT_SCTX(buf, BV_NF); 5885 buf->b_p_mps = vim_strsave(p_mps); 5886 COPY_OPT_SCTX(buf, BV_MPS); 5887 #ifdef FEAT_SMARTINDENT 5888 buf->b_p_si = p_si; 5889 COPY_OPT_SCTX(buf, BV_SI); 5890 #endif 5891 buf->b_p_ci = p_ci; 5892 COPY_OPT_SCTX(buf, BV_CI); 5893 #ifdef FEAT_CINDENT 5894 buf->b_p_cin = p_cin; 5895 COPY_OPT_SCTX(buf, BV_CIN); 5896 buf->b_p_cink = vim_strsave(p_cink); 5897 COPY_OPT_SCTX(buf, BV_CINK); 5898 buf->b_p_cino = vim_strsave(p_cino); 5899 COPY_OPT_SCTX(buf, BV_CINO); 5900 #endif 5901 // Don't copy 'filetype', it must be detected 5902 buf->b_p_ft = empty_option; 5903 buf->b_p_pi = p_pi; 5904 COPY_OPT_SCTX(buf, BV_PI); 5905 #if defined(FEAT_SMARTINDENT) || defined(FEAT_CINDENT) 5906 buf->b_p_cinw = vim_strsave(p_cinw); 5907 COPY_OPT_SCTX(buf, BV_CINW); 5908 #endif 5909 #ifdef FEAT_LISP 5910 buf->b_p_lisp = p_lisp; 5911 COPY_OPT_SCTX(buf, BV_LISP); 5912 #endif 5913 #ifdef FEAT_SYN_HL 5914 // Don't copy 'syntax', it must be set 5915 buf->b_p_syn = empty_option; 5916 buf->b_p_smc = p_smc; 5917 COPY_OPT_SCTX(buf, BV_SMC); 5918 buf->b_s.b_syn_isk = empty_option; 5919 #endif 5920 #ifdef FEAT_SPELL 5921 buf->b_s.b_p_spc = vim_strsave(p_spc); 5922 COPY_OPT_SCTX(buf, BV_SPC); 5923 (void)compile_cap_prog(&buf->b_s); 5924 buf->b_s.b_p_spf = vim_strsave(p_spf); 5925 COPY_OPT_SCTX(buf, BV_SPF); 5926 buf->b_s.b_p_spl = vim_strsave(p_spl); 5927 COPY_OPT_SCTX(buf, BV_SPL); 5928 buf->b_s.b_p_spo = vim_strsave(p_spo); 5929 COPY_OPT_SCTX(buf, BV_SPO); 5930 #endif 5931 #if defined(FEAT_CINDENT) && defined(FEAT_EVAL) 5932 buf->b_p_inde = vim_strsave(p_inde); 5933 COPY_OPT_SCTX(buf, BV_INDE); 5934 buf->b_p_indk = vim_strsave(p_indk); 5935 COPY_OPT_SCTX(buf, BV_INDK); 5936 #endif 5937 buf->b_p_fp = empty_option; 5938 #if defined(FEAT_EVAL) 5939 buf->b_p_fex = vim_strsave(p_fex); 5940 COPY_OPT_SCTX(buf, BV_FEX); 5941 #endif 5942 #ifdef FEAT_CRYPT 5943 buf->b_p_key = vim_strsave(p_key); 5944 COPY_OPT_SCTX(buf, BV_KEY); 5945 #endif 5946 #ifdef FEAT_SEARCHPATH 5947 buf->b_p_sua = vim_strsave(p_sua); 5948 COPY_OPT_SCTX(buf, BV_SUA); 5949 #endif 5950 #ifdef FEAT_KEYMAP 5951 buf->b_p_keymap = vim_strsave(p_keymap); 5952 COPY_OPT_SCTX(buf, BV_KMAP); 5953 buf->b_kmap_state |= KEYMAP_INIT; 5954 #endif 5955 #ifdef FEAT_TERMINAL 5956 buf->b_p_twsl = p_twsl; 5957 COPY_OPT_SCTX(buf, BV_TWSL); 5958 #endif 5959 // This isn't really an option, but copying the langmap and IME 5960 // state from the current buffer is better than resetting it. 5961 buf->b_p_iminsert = p_iminsert; 5962 COPY_OPT_SCTX(buf, BV_IMI); 5963 buf->b_p_imsearch = p_imsearch; 5964 COPY_OPT_SCTX(buf, BV_IMS); 5965 5966 // options that are normally global but also have a local value 5967 // are not copied, start using the global value 5968 buf->b_p_ar = -1; 5969 buf->b_p_ul = NO_LOCAL_UNDOLEVEL; 5970 buf->b_p_bkc = empty_option; 5971 buf->b_bkc_flags = 0; 5972 #ifdef FEAT_QUICKFIX 5973 buf->b_p_gp = empty_option; 5974 buf->b_p_mp = empty_option; 5975 buf->b_p_efm = empty_option; 5976 #endif 5977 buf->b_p_ep = empty_option; 5978 buf->b_p_kp = empty_option; 5979 buf->b_p_path = empty_option; 5980 buf->b_p_tags = empty_option; 5981 buf->b_p_tc = empty_option; 5982 buf->b_tc_flags = 0; 5983 #ifdef FEAT_FIND_ID 5984 buf->b_p_def = empty_option; 5985 buf->b_p_inc = empty_option; 5986 # ifdef FEAT_EVAL 5987 buf->b_p_inex = vim_strsave(p_inex); 5988 COPY_OPT_SCTX(buf, BV_INEX); 5989 # endif 5990 #endif 5991 buf->b_p_dict = empty_option; 5992 buf->b_p_tsr = empty_option; 5993 #ifdef FEAT_TEXTOBJ 5994 buf->b_p_qe = vim_strsave(p_qe); 5995 COPY_OPT_SCTX(buf, BV_QE); 5996 #endif 5997 #if defined(FEAT_BEVAL) && defined(FEAT_EVAL) 5998 buf->b_p_bexpr = empty_option; 5999 #endif 6000 #if defined(FEAT_CRYPT) 6001 buf->b_p_cm = empty_option; 6002 #endif 6003 #ifdef FEAT_PERSISTENT_UNDO 6004 buf->b_p_udf = p_udf; 6005 COPY_OPT_SCTX(buf, BV_UDF); 6006 #endif 6007 #ifdef FEAT_LISP 6008 buf->b_p_lw = empty_option; 6009 #endif 6010 buf->b_p_menc = empty_option; 6011 6012 /* 6013 * Don't copy the options set by ex_help(), use the saved values, 6014 * when going from a help buffer to a non-help buffer. 6015 * Don't touch these at all when BCO_NOHELP is used and going from 6016 * or to a help buffer. 6017 */ 6018 if (dont_do_help) 6019 { 6020 buf->b_p_isk = save_p_isk; 6021 #ifdef FEAT_VARTABS 6022 if (p_vts && p_vts != empty_option && !buf->b_p_vts_array) 6023 tabstop_set(p_vts, &buf->b_p_vts_array); 6024 else 6025 buf->b_p_vts_array = NULL; 6026 #endif 6027 } 6028 else 6029 { 6030 buf->b_p_isk = vim_strsave(p_isk); 6031 COPY_OPT_SCTX(buf, BV_ISK); 6032 did_isk = TRUE; 6033 buf->b_p_ts = p_ts; 6034 #ifdef FEAT_VARTABS 6035 buf->b_p_vts = vim_strsave(p_vts); 6036 COPY_OPT_SCTX(buf, BV_VTS); 6037 if (p_vts && p_vts != empty_option && !buf->b_p_vts_array) 6038 tabstop_set(p_vts, &buf->b_p_vts_array); 6039 else 6040 buf->b_p_vts_array = NULL; 6041 #endif 6042 buf->b_help = FALSE; 6043 if (buf->b_p_bt[0] == 'h') 6044 clear_string_option(&buf->b_p_bt); 6045 buf->b_p_ma = p_ma; 6046 COPY_OPT_SCTX(buf, BV_MA); 6047 } 6048 } 6049 6050 /* 6051 * When the options should be copied (ignoring BCO_ALWAYS), set the 6052 * flag that indicates that the options have been initialized. 6053 */ 6054 if (should_copy) 6055 buf->b_p_initialized = TRUE; 6056 } 6057 6058 check_buf_options(buf); // make sure we don't have NULLs 6059 if (did_isk) 6060 (void)buf_init_chartab(buf, FALSE); 6061 } 6062 6063 /* 6064 * Reset the 'modifiable' option and its default value. 6065 */ 6066 void 6067 reset_modifiable(void) 6068 { 6069 int opt_idx; 6070 6071 curbuf->b_p_ma = FALSE; 6072 p_ma = FALSE; 6073 opt_idx = findoption((char_u *)"ma"); 6074 if (opt_idx >= 0) 6075 options[opt_idx].def_val[VI_DEFAULT] = FALSE; 6076 } 6077 6078 /* 6079 * Set the global value for 'iminsert' to the local value. 6080 */ 6081 void 6082 set_iminsert_global(void) 6083 { 6084 p_iminsert = curbuf->b_p_iminsert; 6085 } 6086 6087 /* 6088 * Set the global value for 'imsearch' to the local value. 6089 */ 6090 void 6091 set_imsearch_global(void) 6092 { 6093 p_imsearch = curbuf->b_p_imsearch; 6094 } 6095 6096 static int expand_option_idx = -1; 6097 static char_u expand_option_name[5] = {'t', '_', NUL, NUL, NUL}; 6098 static int expand_option_flags = 0; 6099 6100 void 6101 set_context_in_set_cmd( 6102 expand_T *xp, 6103 char_u *arg, 6104 int opt_flags) // OPT_GLOBAL and/or OPT_LOCAL 6105 { 6106 int nextchar; 6107 long_u flags = 0; // init for GCC 6108 int opt_idx = 0; // init for GCC 6109 char_u *p; 6110 char_u *s; 6111 int is_term_option = FALSE; 6112 int key; 6113 6114 expand_option_flags = opt_flags; 6115 6116 xp->xp_context = EXPAND_SETTINGS; 6117 if (*arg == NUL) 6118 { 6119 xp->xp_pattern = arg; 6120 return; 6121 } 6122 p = arg + STRLEN(arg) - 1; 6123 if (*p == ' ' && *(p - 1) != '\\') 6124 { 6125 xp->xp_pattern = p + 1; 6126 return; 6127 } 6128 while (p > arg) 6129 { 6130 s = p; 6131 // count number of backslashes before ' ' or ',' 6132 if (*p == ' ' || *p == ',') 6133 { 6134 while (s > arg && *(s - 1) == '\\') 6135 --s; 6136 } 6137 // break at a space with an even number of backslashes 6138 if (*p == ' ' && ((p - s) & 1) == 0) 6139 { 6140 ++p; 6141 break; 6142 } 6143 --p; 6144 } 6145 if (STRNCMP(p, "no", 2) == 0 && STRNCMP(p, "novice", 6) != 0) 6146 { 6147 xp->xp_context = EXPAND_BOOL_SETTINGS; 6148 p += 2; 6149 } 6150 if (STRNCMP(p, "inv", 3) == 0) 6151 { 6152 xp->xp_context = EXPAND_BOOL_SETTINGS; 6153 p += 3; 6154 } 6155 xp->xp_pattern = arg = p; 6156 if (*arg == '<') 6157 { 6158 while (*p != '>') 6159 if (*p++ == NUL) // expand terminal option name 6160 return; 6161 key = get_special_key_code(arg + 1); 6162 if (key == 0) // unknown name 6163 { 6164 xp->xp_context = EXPAND_NOTHING; 6165 return; 6166 } 6167 nextchar = *++p; 6168 is_term_option = TRUE; 6169 expand_option_name[2] = KEY2TERMCAP0(key); 6170 expand_option_name[3] = KEY2TERMCAP1(key); 6171 } 6172 else 6173 { 6174 if (p[0] == 't' && p[1] == '_') 6175 { 6176 p += 2; 6177 if (*p != NUL) 6178 ++p; 6179 if (*p == NUL) 6180 return; // expand option name 6181 nextchar = *++p; 6182 is_term_option = TRUE; 6183 expand_option_name[2] = p[-2]; 6184 expand_option_name[3] = p[-1]; 6185 } 6186 else 6187 { 6188 // Allow * wildcard 6189 while (ASCII_ISALNUM(*p) || *p == '_' || *p == '*') 6190 p++; 6191 if (*p == NUL) 6192 return; 6193 nextchar = *p; 6194 *p = NUL; 6195 opt_idx = findoption(arg); 6196 *p = nextchar; 6197 if (opt_idx == -1 || options[opt_idx].var == NULL) 6198 { 6199 xp->xp_context = EXPAND_NOTHING; 6200 return; 6201 } 6202 flags = options[opt_idx].flags; 6203 if (flags & P_BOOL) 6204 { 6205 xp->xp_context = EXPAND_NOTHING; 6206 return; 6207 } 6208 } 6209 } 6210 // handle "-=" and "+=" 6211 if ((nextchar == '-' || nextchar == '+' || nextchar == '^') && p[1] == '=') 6212 { 6213 ++p; 6214 nextchar = '='; 6215 } 6216 if ((nextchar != '=' && nextchar != ':') 6217 || xp->xp_context == EXPAND_BOOL_SETTINGS) 6218 { 6219 xp->xp_context = EXPAND_UNSUCCESSFUL; 6220 return; 6221 } 6222 if (xp->xp_context != EXPAND_BOOL_SETTINGS && p[1] == NUL) 6223 { 6224 xp->xp_context = EXPAND_OLD_SETTING; 6225 if (is_term_option) 6226 expand_option_idx = -1; 6227 else 6228 expand_option_idx = opt_idx; 6229 xp->xp_pattern = p + 1; 6230 return; 6231 } 6232 xp->xp_context = EXPAND_NOTHING; 6233 if (is_term_option || (flags & P_NUM)) 6234 return; 6235 6236 xp->xp_pattern = p + 1; 6237 6238 if (flags & P_EXPAND) 6239 { 6240 p = options[opt_idx].var; 6241 if (p == (char_u *)&p_bdir 6242 || p == (char_u *)&p_dir 6243 || p == (char_u *)&p_path 6244 || p == (char_u *)&p_pp 6245 || p == (char_u *)&p_rtp 6246 #ifdef FEAT_SEARCHPATH 6247 || p == (char_u *)&p_cdpath 6248 #endif 6249 #ifdef FEAT_SESSION 6250 || p == (char_u *)&p_vdir 6251 #endif 6252 ) 6253 { 6254 xp->xp_context = EXPAND_DIRECTORIES; 6255 if (p == (char_u *)&p_path 6256 #ifdef FEAT_SEARCHPATH 6257 || p == (char_u *)&p_cdpath 6258 #endif 6259 ) 6260 xp->xp_backslash = XP_BS_THREE; 6261 else 6262 xp->xp_backslash = XP_BS_ONE; 6263 } 6264 else if (p == (char_u *)&p_ft) 6265 { 6266 xp->xp_context = EXPAND_FILETYPE; 6267 } 6268 else 6269 { 6270 xp->xp_context = EXPAND_FILES; 6271 // for 'tags' need three backslashes for a space 6272 if (p == (char_u *)&p_tags) 6273 xp->xp_backslash = XP_BS_THREE; 6274 else 6275 xp->xp_backslash = XP_BS_ONE; 6276 } 6277 } 6278 6279 // For an option that is a list of file names, find the start of the 6280 // last file name. 6281 for (p = arg + STRLEN(arg) - 1; p > xp->xp_pattern; --p) 6282 { 6283 // count number of backslashes before ' ' or ',' 6284 if (*p == ' ' || *p == ',') 6285 { 6286 s = p; 6287 while (s > xp->xp_pattern && *(s - 1) == '\\') 6288 --s; 6289 if ((*p == ' ' && (xp->xp_backslash == XP_BS_THREE && (p - s) < 3)) 6290 || (*p == ',' && (flags & P_COMMA) && ((p - s) & 1) == 0)) 6291 { 6292 xp->xp_pattern = p + 1; 6293 break; 6294 } 6295 } 6296 6297 #ifdef FEAT_SPELL 6298 // for 'spellsuggest' start at "file:" 6299 if (options[opt_idx].var == (char_u *)&p_sps 6300 && STRNCMP(p, "file:", 5) == 0) 6301 { 6302 xp->xp_pattern = p + 5; 6303 break; 6304 } 6305 #endif 6306 } 6307 6308 return; 6309 } 6310 6311 int 6312 ExpandSettings( 6313 expand_T *xp, 6314 regmatch_T *regmatch, 6315 int *num_file, 6316 char_u ***file) 6317 { 6318 int num_normal = 0; // Nr of matching non-term-code settings 6319 int num_term = 0; // Nr of matching terminal code settings 6320 int opt_idx; 6321 int match; 6322 int count = 0; 6323 char_u *str; 6324 int loop; 6325 int is_term_opt; 6326 char_u name_buf[MAX_KEY_NAME_LEN]; 6327 static char *(names[]) = {"all", "termcap"}; 6328 int ic = regmatch->rm_ic; // remember the ignore-case flag 6329 6330 // do this loop twice: 6331 // loop == 0: count the number of matching options 6332 // loop == 1: copy the matching options into allocated memory 6333 for (loop = 0; loop <= 1; ++loop) 6334 { 6335 regmatch->rm_ic = ic; 6336 if (xp->xp_context != EXPAND_BOOL_SETTINGS) 6337 { 6338 for (match = 0; match < (int)ARRAY_LENGTH(names); ++match) 6339 if (vim_regexec(regmatch, (char_u *)names[match], (colnr_T)0)) 6340 { 6341 if (loop == 0) 6342 num_normal++; 6343 else 6344 (*file)[count++] = vim_strsave((char_u *)names[match]); 6345 } 6346 } 6347 for (opt_idx = 0; (str = (char_u *)options[opt_idx].fullname) != NULL; 6348 opt_idx++) 6349 { 6350 if (options[opt_idx].var == NULL) 6351 continue; 6352 if (xp->xp_context == EXPAND_BOOL_SETTINGS 6353 && !(options[opt_idx].flags & P_BOOL)) 6354 continue; 6355 is_term_opt = istermoption_idx(opt_idx); 6356 if (is_term_opt && num_normal > 0) 6357 continue; 6358 match = FALSE; 6359 if (vim_regexec(regmatch, str, (colnr_T)0) 6360 || (options[opt_idx].shortname != NULL 6361 && vim_regexec(regmatch, 6362 (char_u *)options[opt_idx].shortname, (colnr_T)0))) 6363 match = TRUE; 6364 else if (is_term_opt) 6365 { 6366 name_buf[0] = '<'; 6367 name_buf[1] = 't'; 6368 name_buf[2] = '_'; 6369 name_buf[3] = str[2]; 6370 name_buf[4] = str[3]; 6371 name_buf[5] = '>'; 6372 name_buf[6] = NUL; 6373 if (vim_regexec(regmatch, name_buf, (colnr_T)0)) 6374 { 6375 match = TRUE; 6376 str = name_buf; 6377 } 6378 } 6379 if (match) 6380 { 6381 if (loop == 0) 6382 { 6383 if (is_term_opt) 6384 num_term++; 6385 else 6386 num_normal++; 6387 } 6388 else 6389 (*file)[count++] = vim_strsave(str); 6390 } 6391 } 6392 /* 6393 * Check terminal key codes, these are not in the option table 6394 */ 6395 if (xp->xp_context != EXPAND_BOOL_SETTINGS && num_normal == 0) 6396 { 6397 for (opt_idx = 0; (str = get_termcode(opt_idx)) != NULL; opt_idx++) 6398 { 6399 if (!isprint(str[0]) || !isprint(str[1])) 6400 continue; 6401 6402 name_buf[0] = 't'; 6403 name_buf[1] = '_'; 6404 name_buf[2] = str[0]; 6405 name_buf[3] = str[1]; 6406 name_buf[4] = NUL; 6407 6408 match = FALSE; 6409 if (vim_regexec(regmatch, name_buf, (colnr_T)0)) 6410 match = TRUE; 6411 else 6412 { 6413 name_buf[0] = '<'; 6414 name_buf[1] = 't'; 6415 name_buf[2] = '_'; 6416 name_buf[3] = str[0]; 6417 name_buf[4] = str[1]; 6418 name_buf[5] = '>'; 6419 name_buf[6] = NUL; 6420 6421 if (vim_regexec(regmatch, name_buf, (colnr_T)0)) 6422 match = TRUE; 6423 } 6424 if (match) 6425 { 6426 if (loop == 0) 6427 num_term++; 6428 else 6429 (*file)[count++] = vim_strsave(name_buf); 6430 } 6431 } 6432 6433 /* 6434 * Check special key names. 6435 */ 6436 regmatch->rm_ic = TRUE; // ignore case here 6437 for (opt_idx = 0; (str = get_key_name(opt_idx)) != NULL; opt_idx++) 6438 { 6439 name_buf[0] = '<'; 6440 STRCPY(name_buf + 1, str); 6441 STRCAT(name_buf, ">"); 6442 6443 if (vim_regexec(regmatch, name_buf, (colnr_T)0)) 6444 { 6445 if (loop == 0) 6446 num_term++; 6447 else 6448 (*file)[count++] = vim_strsave(name_buf); 6449 } 6450 } 6451 } 6452 if (loop == 0) 6453 { 6454 if (num_normal > 0) 6455 *num_file = num_normal; 6456 else if (num_term > 0) 6457 *num_file = num_term; 6458 else 6459 return OK; 6460 *file = ALLOC_MULT(char_u *, *num_file); 6461 if (*file == NULL) 6462 { 6463 *file = (char_u **)""; 6464 return FAIL; 6465 } 6466 } 6467 } 6468 return OK; 6469 } 6470 6471 int 6472 ExpandOldSetting(int *num_file, char_u ***file) 6473 { 6474 char_u *var = NULL; // init for GCC 6475 char_u *buf; 6476 6477 *num_file = 0; 6478 *file = ALLOC_ONE(char_u *); 6479 if (*file == NULL) 6480 return FAIL; 6481 6482 /* 6483 * For a terminal key code expand_option_idx is < 0. 6484 */ 6485 if (expand_option_idx < 0) 6486 { 6487 var = find_termcode(expand_option_name + 2); 6488 if (var == NULL) 6489 expand_option_idx = findoption(expand_option_name); 6490 } 6491 6492 if (expand_option_idx >= 0) 6493 { 6494 // put string of option value in NameBuff 6495 option_value2string(&options[expand_option_idx], expand_option_flags); 6496 var = NameBuff; 6497 } 6498 else if (var == NULL) 6499 var = (char_u *)""; 6500 6501 // A backslash is required before some characters. This is the reverse of 6502 // what happens in do_set(). 6503 buf = vim_strsave_escaped(var, escape_chars); 6504 6505 if (buf == NULL) 6506 { 6507 VIM_CLEAR(*file); 6508 return FAIL; 6509 } 6510 6511 #ifdef BACKSLASH_IN_FILENAME 6512 // For MS-Windows et al. we don't double backslashes at the start and 6513 // before a file name character. 6514 for (var = buf; *var != NUL; MB_PTR_ADV(var)) 6515 if (var[0] == '\\' && var[1] == '\\' 6516 && expand_option_idx >= 0 6517 && (options[expand_option_idx].flags & P_EXPAND) 6518 && vim_isfilec(var[2]) 6519 && (var[2] != '\\' || (var == buf && var[4] != '\\'))) 6520 STRMOVE(var, var + 1); 6521 #endif 6522 6523 *file[0] = buf; 6524 *num_file = 1; 6525 return OK; 6526 } 6527 6528 /* 6529 * Get the value for the numeric or string option *opp in a nice format into 6530 * NameBuff[]. Must not be called with a hidden option! 6531 */ 6532 static void 6533 option_value2string( 6534 struct vimoption *opp, 6535 int opt_flags) // OPT_GLOBAL and/or OPT_LOCAL 6536 { 6537 char_u *varp; 6538 6539 varp = get_varp_scope(opp, opt_flags); 6540 6541 if (opp->flags & P_NUM) 6542 { 6543 long wc = 0; 6544 6545 if (wc_use_keyname(varp, &wc)) 6546 STRCPY(NameBuff, get_special_key_name((int)wc, 0)); 6547 else if (wc != 0) 6548 STRCPY(NameBuff, transchar((int)wc)); 6549 else 6550 sprintf((char *)NameBuff, "%ld", *(long *)varp); 6551 } 6552 else // P_STRING 6553 { 6554 varp = *(char_u **)(varp); 6555 if (varp == NULL) // just in case 6556 NameBuff[0] = NUL; 6557 #ifdef FEAT_CRYPT 6558 // don't show the actual value of 'key', only that it's set 6559 else if (opp->var == (char_u *)&p_key && *varp) 6560 STRCPY(NameBuff, "*****"); 6561 #endif 6562 else if (opp->flags & P_EXPAND) 6563 home_replace(NULL, varp, NameBuff, MAXPATHL, FALSE); 6564 // Translate 'pastetoggle' into special key names 6565 else if ((char_u **)opp->var == &p_pt) 6566 str2specialbuf(p_pt, NameBuff, MAXPATHL); 6567 else 6568 vim_strncpy(NameBuff, varp, MAXPATHL - 1); 6569 } 6570 } 6571 6572 /* 6573 * Return TRUE if "varp" points to 'wildchar' or 'wildcharm' and it can be 6574 * printed as a keyname. 6575 * "*wcp" is set to the value of the option if it's 'wildchar' or 'wildcharm'. 6576 */ 6577 static int 6578 wc_use_keyname(char_u *varp, long *wcp) 6579 { 6580 if (((long *)varp == &p_wc) || ((long *)varp == &p_wcm)) 6581 { 6582 *wcp = *(long *)varp; 6583 if (IS_SPECIAL(*wcp) || find_special_key_in_table((int)*wcp) >= 0) 6584 return TRUE; 6585 } 6586 return FALSE; 6587 } 6588 6589 /* 6590 * Return TRUE if "x" is present in 'shortmess' option, or 6591 * 'shortmess' contains 'a' and "x" is present in SHM_A. 6592 */ 6593 int 6594 shortmess(int x) 6595 { 6596 return p_shm != NULL && 6597 ( vim_strchr(p_shm, x) != NULL 6598 || (vim_strchr(p_shm, 'a') != NULL 6599 && vim_strchr((char_u *)SHM_A, x) != NULL)); 6600 } 6601 6602 /* 6603 * paste_option_changed() - Called after p_paste was set or reset. 6604 */ 6605 static void 6606 paste_option_changed(void) 6607 { 6608 static int old_p_paste = FALSE; 6609 static int save_sm = 0; 6610 static int save_sta = 0; 6611 #ifdef FEAT_CMDL_INFO 6612 static int save_ru = 0; 6613 #endif 6614 #ifdef FEAT_RIGHTLEFT 6615 static int save_ri = 0; 6616 static int save_hkmap = 0; 6617 #endif 6618 buf_T *buf; 6619 6620 if (p_paste) 6621 { 6622 /* 6623 * Paste switched from off to on. 6624 * Save the current values, so they can be restored later. 6625 */ 6626 if (!old_p_paste) 6627 { 6628 // save options for each buffer 6629 FOR_ALL_BUFFERS(buf) 6630 { 6631 buf->b_p_tw_nopaste = buf->b_p_tw; 6632 buf->b_p_wm_nopaste = buf->b_p_wm; 6633 buf->b_p_sts_nopaste = buf->b_p_sts; 6634 buf->b_p_ai_nopaste = buf->b_p_ai; 6635 buf->b_p_et_nopaste = buf->b_p_et; 6636 #ifdef FEAT_VARTABS 6637 if (buf->b_p_vsts_nopaste) 6638 vim_free(buf->b_p_vsts_nopaste); 6639 buf->b_p_vsts_nopaste = buf->b_p_vsts && buf->b_p_vsts != empty_option 6640 ? vim_strsave(buf->b_p_vsts) : NULL; 6641 #endif 6642 } 6643 6644 // save global options 6645 save_sm = p_sm; 6646 save_sta = p_sta; 6647 #ifdef FEAT_CMDL_INFO 6648 save_ru = p_ru; 6649 #endif 6650 #ifdef FEAT_RIGHTLEFT 6651 save_ri = p_ri; 6652 save_hkmap = p_hkmap; 6653 #endif 6654 // save global values for local buffer options 6655 p_ai_nopaste = p_ai; 6656 p_et_nopaste = p_et; 6657 p_sts_nopaste = p_sts; 6658 p_tw_nopaste = p_tw; 6659 p_wm_nopaste = p_wm; 6660 #ifdef FEAT_VARTABS 6661 if (p_vsts_nopaste) 6662 vim_free(p_vsts_nopaste); 6663 p_vsts_nopaste = p_vsts && p_vsts != empty_option ? vim_strsave(p_vsts) : NULL; 6664 #endif 6665 } 6666 6667 /* 6668 * Always set the option values, also when 'paste' is set when it is 6669 * already on. 6670 */ 6671 // set options for each buffer 6672 FOR_ALL_BUFFERS(buf) 6673 { 6674 buf->b_p_tw = 0; // textwidth is 0 6675 buf->b_p_wm = 0; // wrapmargin is 0 6676 buf->b_p_sts = 0; // softtabstop is 0 6677 buf->b_p_ai = 0; // no auto-indent 6678 buf->b_p_et = 0; // no expandtab 6679 #ifdef FEAT_VARTABS 6680 if (buf->b_p_vsts) 6681 free_string_option(buf->b_p_vsts); 6682 buf->b_p_vsts = empty_option; 6683 if (buf->b_p_vsts_array) 6684 vim_free(buf->b_p_vsts_array); 6685 buf->b_p_vsts_array = 0; 6686 #endif 6687 } 6688 6689 // set global options 6690 p_sm = 0; // no showmatch 6691 p_sta = 0; // no smarttab 6692 #ifdef FEAT_CMDL_INFO 6693 if (p_ru) 6694 status_redraw_all(); // redraw to remove the ruler 6695 p_ru = 0; // no ruler 6696 #endif 6697 #ifdef FEAT_RIGHTLEFT 6698 p_ri = 0; // no reverse insert 6699 p_hkmap = 0; // no Hebrew keyboard 6700 #endif 6701 // set global values for local buffer options 6702 p_tw = 0; 6703 p_wm = 0; 6704 p_sts = 0; 6705 p_ai = 0; 6706 #ifdef FEAT_VARTABS 6707 if (p_vsts) 6708 free_string_option(p_vsts); 6709 p_vsts = empty_option; 6710 #endif 6711 } 6712 6713 /* 6714 * Paste switched from on to off: Restore saved values. 6715 */ 6716 else if (old_p_paste) 6717 { 6718 // restore options for each buffer 6719 FOR_ALL_BUFFERS(buf) 6720 { 6721 buf->b_p_tw = buf->b_p_tw_nopaste; 6722 buf->b_p_wm = buf->b_p_wm_nopaste; 6723 buf->b_p_sts = buf->b_p_sts_nopaste; 6724 buf->b_p_ai = buf->b_p_ai_nopaste; 6725 buf->b_p_et = buf->b_p_et_nopaste; 6726 #ifdef FEAT_VARTABS 6727 if (buf->b_p_vsts) 6728 free_string_option(buf->b_p_vsts); 6729 buf->b_p_vsts = buf->b_p_vsts_nopaste 6730 ? vim_strsave(buf->b_p_vsts_nopaste) : empty_option; 6731 if (buf->b_p_vsts_array) 6732 vim_free(buf->b_p_vsts_array); 6733 if (buf->b_p_vsts && buf->b_p_vsts != empty_option) 6734 tabstop_set(buf->b_p_vsts, &buf->b_p_vsts_array); 6735 else 6736 buf->b_p_vsts_array = 0; 6737 #endif 6738 } 6739 6740 // restore global options 6741 p_sm = save_sm; 6742 p_sta = save_sta; 6743 #ifdef FEAT_CMDL_INFO 6744 if (p_ru != save_ru) 6745 status_redraw_all(); // redraw to draw the ruler 6746 p_ru = save_ru; 6747 #endif 6748 #ifdef FEAT_RIGHTLEFT 6749 p_ri = save_ri; 6750 p_hkmap = save_hkmap; 6751 #endif 6752 // set global values for local buffer options 6753 p_ai = p_ai_nopaste; 6754 p_et = p_et_nopaste; 6755 p_sts = p_sts_nopaste; 6756 p_tw = p_tw_nopaste; 6757 p_wm = p_wm_nopaste; 6758 #ifdef FEAT_VARTABS 6759 if (p_vsts) 6760 free_string_option(p_vsts); 6761 p_vsts = p_vsts_nopaste ? vim_strsave(p_vsts_nopaste) : empty_option; 6762 #endif 6763 } 6764 6765 old_p_paste = p_paste; 6766 } 6767 6768 /* 6769 * vimrc_found() - Called when a ".vimrc" or "VIMINIT" has been found. 6770 * 6771 * Reset 'compatible' and set the values for options that didn't get set yet 6772 * to the Vim defaults. 6773 * Don't do this if the 'compatible' option has been set or reset before. 6774 * When "fname" is not NULL, use it to set $"envname" when it wasn't set yet. 6775 */ 6776 void 6777 vimrc_found(char_u *fname, char_u *envname) 6778 { 6779 int opt_idx; 6780 int dofree = FALSE; 6781 char_u *p; 6782 6783 if (!option_was_set((char_u *)"cp")) 6784 { 6785 p_cp = FALSE; 6786 for (opt_idx = 0; !istermoption_idx(opt_idx); opt_idx++) 6787 if (!(options[opt_idx].flags & (P_WAS_SET|P_VI_DEF))) 6788 set_option_default(opt_idx, OPT_FREE, FALSE); 6789 didset_options(); 6790 didset_options2(); 6791 } 6792 6793 if (fname != NULL) 6794 { 6795 p = vim_getenv(envname, &dofree); 6796 if (p == NULL) 6797 { 6798 // Set $MYVIMRC to the first vimrc file found. 6799 p = FullName_save(fname, FALSE); 6800 if (p != NULL) 6801 { 6802 vim_setenv(envname, p); 6803 vim_free(p); 6804 } 6805 } 6806 else if (dofree) 6807 vim_free(p); 6808 } 6809 } 6810 6811 /* 6812 * Set 'compatible' on or off. Called for "-C" and "-N" command line arg. 6813 */ 6814 void 6815 change_compatible(int on) 6816 { 6817 int opt_idx; 6818 6819 if (p_cp != on) 6820 { 6821 p_cp = on; 6822 compatible_set(); 6823 } 6824 opt_idx = findoption((char_u *)"cp"); 6825 if (opt_idx >= 0) 6826 options[opt_idx].flags |= P_WAS_SET; 6827 } 6828 6829 /* 6830 * Return TRUE when option "name" has been set. 6831 * Only works correctly for global options. 6832 */ 6833 int 6834 option_was_set(char_u *name) 6835 { 6836 int idx; 6837 6838 idx = findoption(name); 6839 if (idx < 0) // unknown option 6840 return FALSE; 6841 if (options[idx].flags & P_WAS_SET) 6842 return TRUE; 6843 return FALSE; 6844 } 6845 6846 /* 6847 * Reset the flag indicating option "name" was set. 6848 */ 6849 int 6850 reset_option_was_set(char_u *name) 6851 { 6852 int idx = findoption(name); 6853 6854 if (idx >= 0) 6855 { 6856 options[idx].flags &= ~P_WAS_SET; 6857 return OK; 6858 } 6859 return FAIL; 6860 } 6861 6862 /* 6863 * compatible_set() - Called when 'compatible' has been set or unset. 6864 * 6865 * When 'compatible' set: Set all relevant options (those that have the P_VIM) 6866 * flag) to a Vi compatible value. 6867 * When 'compatible' is unset: Set all options that have a different default 6868 * for Vim (without the P_VI_DEF flag) to that default. 6869 */ 6870 static void 6871 compatible_set(void) 6872 { 6873 int opt_idx; 6874 6875 for (opt_idx = 0; !istermoption_idx(opt_idx); opt_idx++) 6876 if ( ((options[opt_idx].flags & P_VIM) && p_cp) 6877 || (!(options[opt_idx].flags & P_VI_DEF) && !p_cp)) 6878 set_option_default(opt_idx, OPT_FREE, p_cp); 6879 didset_options(); 6880 didset_options2(); 6881 } 6882 6883 #if defined(FEAT_LINEBREAK) || defined(PROTO) 6884 6885 /* 6886 * fill_breakat_flags() -- called when 'breakat' changes value. 6887 */ 6888 void 6889 fill_breakat_flags(void) 6890 { 6891 char_u *p; 6892 int i; 6893 6894 for (i = 0; i < 256; i++) 6895 breakat_flags[i] = FALSE; 6896 6897 if (p_breakat != NULL) 6898 for (p = p_breakat; *p; p++) 6899 breakat_flags[*p] = TRUE; 6900 } 6901 #endif 6902 6903 /* 6904 * Check if backspacing over something is allowed. 6905 */ 6906 int 6907 can_bs( 6908 int what) // BS_INDENT, BS_EOL, BS_START or BS_NOSTOP 6909 { 6910 #ifdef FEAT_JOB_CHANNEL 6911 if (what == BS_START && bt_prompt(curbuf)) 6912 return FALSE; 6913 #endif 6914 switch (*p_bs) 6915 { 6916 case '3': return TRUE; 6917 case '2': return (what != BS_NOSTOP); 6918 case '1': return (what != BS_START); 6919 case '0': return FALSE; 6920 } 6921 return vim_strchr(p_bs, what) != NULL; 6922 } 6923 6924 /* 6925 * Return the effective 'scrolloff' value for the current window, using the 6926 * global value when appropriate. 6927 */ 6928 long 6929 get_scrolloff_value(void) 6930 { 6931 return curwin->w_p_so < 0 ? p_so : curwin->w_p_so; 6932 } 6933 6934 /* 6935 * Return the effective 'sidescrolloff' value for the current window, using the 6936 * global value when appropriate. 6937 */ 6938 long 6939 get_sidescrolloff_value(void) 6940 { 6941 return curwin->w_p_siso < 0 ? p_siso : curwin->w_p_siso; 6942 } 6943 6944 /* 6945 * Get the local or global value of 'backupcopy'. 6946 */ 6947 unsigned int 6948 get_bkc_value(buf_T *buf) 6949 { 6950 return buf->b_bkc_flags ? buf->b_bkc_flags : bkc_flags; 6951 } 6952 6953 #if defined(FEAT_LINEBREAK) || defined(PROTO) 6954 /* 6955 * Get the local or global value of 'showbreak'. 6956 */ 6957 char_u * 6958 get_showbreak_value(win_T *win) 6959 { 6960 if (win->w_p_sbr == NULL || *win->w_p_sbr == NUL) 6961 return p_sbr; 6962 if (STRCMP(win->w_p_sbr, "NONE") == 0) 6963 return empty_option; 6964 return win->w_p_sbr; 6965 } 6966 #endif 6967 6968 #if defined(FEAT_EVAL) || defined(PROTO) 6969 /* 6970 * Get window or buffer local options. 6971 */ 6972 dict_T * 6973 get_winbuf_options(int bufopt) 6974 { 6975 dict_T *d; 6976 int opt_idx; 6977 6978 d = dict_alloc(); 6979 if (d == NULL) 6980 return NULL; 6981 6982 for (opt_idx = 0; !istermoption_idx(opt_idx); opt_idx++) 6983 { 6984 struct vimoption *opt = &options[opt_idx]; 6985 6986 if ((bufopt && (opt->indir & PV_BUF)) 6987 || (!bufopt && (opt->indir & PV_WIN))) 6988 { 6989 char_u *varp = get_varp(opt); 6990 6991 if (varp != NULL) 6992 { 6993 if (opt->flags & P_STRING) 6994 dict_add_string(d, opt->fullname, *(char_u **)varp); 6995 else if (opt->flags & P_NUM) 6996 dict_add_number(d, opt->fullname, *(long *)varp); 6997 else 6998 dict_add_number(d, opt->fullname, *(int *)varp); 6999 } 7000 } 7001 } 7002 7003 return d; 7004 } 7005 #endif 7006 7007 #if defined(FEAT_SYN_HL) || defined(PROTO) 7008 /* 7009 * This is called when 'culopt' is changed 7010 */ 7011 int 7012 fill_culopt_flags(char_u *val, win_T *wp) 7013 { 7014 char_u *p; 7015 char_u culopt_flags_new = 0; 7016 7017 if (val == NULL) 7018 p = wp->w_p_culopt; 7019 else 7020 p = val; 7021 while (*p != NUL) 7022 { 7023 if (STRNCMP(p, "line", 4) == 0) 7024 { 7025 p += 4; 7026 culopt_flags_new |= CULOPT_LINE; 7027 } 7028 else if (STRNCMP(p, "both", 4) == 0) 7029 { 7030 p += 4; 7031 culopt_flags_new |= CULOPT_LINE | CULOPT_NBR; 7032 } 7033 else if (STRNCMP(p, "number", 6) == 0) 7034 { 7035 p += 6; 7036 culopt_flags_new |= CULOPT_NBR; 7037 } 7038 else if (STRNCMP(p, "screenline", 10) == 0) 7039 { 7040 p += 10; 7041 culopt_flags_new |= CULOPT_SCRLINE; 7042 } 7043 7044 if (*p != ',' && *p != NUL) 7045 return FAIL; 7046 if (*p == ',') 7047 ++p; 7048 } 7049 7050 // Can't have both "line" and "screenline". 7051 if ((culopt_flags_new & CULOPT_LINE) && (culopt_flags_new & CULOPT_SCRLINE)) 7052 return FAIL; 7053 wp->w_p_culopt_flags = culopt_flags_new; 7054 7055 return OK; 7056 } 7057 #endif 7058 7059 /* 7060 * Get the value of 'magic' adjusted for Vim9 script. 7061 */ 7062 int 7063 magic_isset(void) 7064 { 7065 switch (magic_overruled) 7066 { 7067 case OPTION_MAGIC_ON: return TRUE; 7068 case OPTION_MAGIC_OFF: return FALSE; 7069 case OPTION_MAGIC_NOT_SET: break; 7070 } 7071 #ifdef FEAT_EVAL 7072 if (in_vim9script()) 7073 return TRUE; 7074 #endif 7075 return p_magic; 7076 } 7077