To: vim_dev@googlegroups.com Subject: Patch 9.0.1295 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 9.0.1295 Problem: The option initialization function is too long. Solution: Move code to separate functions. (Yegappan Lakshmanan, closes #11966) Files: src/option.c *** ../vim-9.0.1294/src/option.c 2023-02-09 22:08:48.515700662 +0000 --- src/option.c 2023-02-10 14:47:05.059052260 +0000 *************** *** 70,105 **** static void compatible_set(void); /* ! * Initialize the options, first part. ! * ! * Called only once from main(), just after creating the first buffer. ! * If "clean_arg" is TRUE Vim was started with --clean. */ ! void ! set_init_1(int clean_arg) { char_u *p; - int opt_idx; - long_u n; - - #ifdef FEAT_LANGMAP - langmap_init(); - #endif - - // Be Vi compatible by default - p_cp = TRUE; - - // Use POSIX compatibility when $VIM_POSIX is set. - if (mch_getenv((char_u *)"VIM_POSIX") != NULL) - { - set_string_default("cpo", (char_u *)CPO_ALL); - set_string_default("shm", (char_u *)SHM_POSIX); - } ! /* ! * Find default value for 'shell' option. ! * Don't use it if it is empty. ! */ if (((p = mch_getenv((char_u *)"SHELL")) != NULL && *p != NUL) #if defined(MSWIN) || ((p = mch_getenv((char_u *)"COMSPEC")) != NULL && *p != NUL) --- 70,84 ---- static void compatible_set(void); /* ! * Initialize the 'shell' option to a default value. */ ! static void ! set_init_default_shell(void) { char_u *p; ! // Find default value for 'shell' option. ! // Don't use it if it is empty. if (((p = mch_getenv((char_u *)"SHELL")) != NULL && *p != NUL) #if defined(MSWIN) || ((p = mch_getenv((char_u *)"COMSPEC")) != NULL && *p != NUL) *************** *** 129,198 **** #else set_string_default_esc("sh", p, TRUE); #endif ! /* ! * Set the default for 'backupskip' to include environment variables for ! * temp files. ! */ ! { #ifdef UNIX ! static char *(names[4]) = {"", "TMPDIR", "TEMP", "TMP"}; #else ! static char *(names[3]) = {"TMPDIR", "TEMP", "TMP"}; #endif ! int len; ! garray_T ga; ! int mustfree; ! char_u *item; ! opt_idx = findoption((char_u *)"backupskip"); ! ga_init2(&ga, 1, 100); ! for (n = 0; n < (long)ARRAY_LENGTH(names); ++n) ! { ! mustfree = FALSE; #ifdef UNIX ! if (*names[n] == NUL) # ifdef MACOS_X ! p = (char_u *)"/private/tmp"; # else ! p = (char_u *)"/tmp"; # endif ! else #endif ! p = vim_getenv((char_u *)names[n], &mustfree); ! if (p != NULL && *p != NUL) { ! // First time count the NUL, otherwise count the ','. ! len = (int)STRLEN(p) + 3; ! item = alloc(len); ! STRCPY(item, p); ! add_pathsep(item); ! STRCAT(item, "*"); ! if (find_dup_item(ga.ga_data, item, options[opt_idx].flags) ! == NULL ! && ga_grow(&ga, len) == OK) ! { ! if (ga.ga_len > 0) ! STRCAT(ga.ga_data, ","); ! STRCAT(ga.ga_data, item); ! ga.ga_len += len; ! } ! vim_free(item); } ! if (mustfree) ! vim_free(p); ! } ! if (ga.ga_data != NULL) ! { ! set_string_default("bsk", ga.ga_data); ! vim_free(ga.ga_data); } } - /* - * 'maxmemtot' and 'maxmem' may have to be adjusted for available memory - */ opt_idx = findoption((char_u *)"maxmemtot"); if (opt_idx >= 0) { --- 108,190 ---- #else set_string_default_esc("sh", p, TRUE); #endif + } ! /* ! * Set the default for 'backupskip' to include environment variables for ! * temp files. ! */ ! static void ! set_init_default_backupskip(void) ! { ! int opt_idx; ! long_u n; ! char_u *p; #ifdef UNIX ! static char *(names[4]) = {"", "TMPDIR", "TEMP", "TMP"}; #else ! static char *(names[3]) = {"TMPDIR", "TEMP", "TMP"}; #endif ! int len; ! garray_T ga; ! int mustfree; ! char_u *item; ! opt_idx = findoption((char_u *)"backupskip"); ! ga_init2(&ga, 1, 100); ! for (n = 0; n < (long)ARRAY_LENGTH(names); ++n) ! { ! mustfree = FALSE; #ifdef UNIX ! if (*names[n] == NUL) # ifdef MACOS_X ! p = (char_u *)"/private/tmp"; # else ! p = (char_u *)"/tmp"; # endif ! else #endif ! p = vim_getenv((char_u *)names[n], &mustfree); ! if (p != NULL && *p != NUL) ! { ! // First time count the NUL, otherwise count the ','. ! len = (int)STRLEN(p) + 3; ! item = alloc(len); ! STRCPY(item, p); ! add_pathsep(item); ! STRCAT(item, "*"); ! if (find_dup_item(ga.ga_data, item, options[opt_idx].flags) ! == NULL ! && ga_grow(&ga, len) == OK) { ! if (ga.ga_len > 0) ! STRCAT(ga.ga_data, ","); ! STRCAT(ga.ga_data, item); ! ga.ga_len += len; } ! vim_free(item); } + if (mustfree) + vim_free(p); } + if (ga.ga_data != NULL) + { + set_string_default("bsk", ga.ga_data); + vim_free(ga.ga_data); + } + } + + /* + * Initialize the 'maxmemtot' and 'maxmem' options to a default value. + * 'maxmemtot' and 'maxmem' may have to be adjusted for available memory. + */ + static void + set_init_default_maxmemtot(void) + { + int opt_idx; + long_u n; opt_idx = findoption((char_u *)"maxmemtot"); if (opt_idx >= 0) { *************** *** 221,286 **** } } } { ! char_u *cdpath; ! char_u *buf; ! int i; ! int j; ! int mustfree = FALSE; ! ! // Initialize the 'cdpath' option's default value. ! cdpath = vim_getenv((char_u *)"CDPATH", &mustfree); ! if (cdpath != NULL) { ! buf = alloc((STRLEN(cdpath) << 1) + 2); ! if (buf != NULL) { ! buf[0] = ','; // start with ",", current dir first ! j = 1; ! for (i = 0; cdpath[i] != NUL; ++i) ! { ! if (vim_ispathlistsep(cdpath[i])) ! buf[j++] = ','; ! else ! { ! if (cdpath[i] == ' ' || cdpath[i] == ',') ! buf[j++] = '\\'; ! buf[j++] = cdpath[i]; ! } ! } ! buf[j] = NUL; ! opt_idx = findoption((char_u *)"cdpath"); ! if (opt_idx >= 0) ! { ! options[opt_idx].def_val[VI_DEFAULT] = buf; ! options[opt_idx].flags |= P_DEF_ALLOCED; ! } ! else ! vim_free(buf); // cannot happen } - if (mustfree) - vim_free(cdpath); } } #if defined(FEAT_POSTSCRIPT) && \ ! (defined(MSWIN) || defined(VMS) || defined(MAC) || defined(hpux)) // Set print encoding on platforms that don't default to latin1 set_string_default("penc", # if defined(MSWIN) ! (char_u *)"cp1252" # elif defined(VMS) ! (char_u *)"dec-mcs" # elif defined(MAC) ! (char_u *)"mac-roman" # else // HPUX ! (char_u *)"hp-roman8" # endif ! ); #endif #ifdef FEAT_POSTSCRIPT // 'printexpr' must be allocated to be able to evaluate it. set_string_default("pexpr", # if defined(MSWIN) --- 213,297 ---- } } } + } + /* + * Initialize the 'cdpath' option to a default value. + */ + static void + set_init_default_cdpath(void) + { + int opt_idx; + char_u *cdpath; + char_u *buf; + int i; + int j; + int mustfree = FALSE; + + cdpath = vim_getenv((char_u *)"CDPATH", &mustfree); + if (cdpath == NULL) + return; + + buf = alloc((STRLEN(cdpath) << 1) + 2); + if (buf != NULL) { ! buf[0] = ','; // start with ",", current dir first ! j = 1; ! for (i = 0; cdpath[i] != NUL; ++i) { ! if (vim_ispathlistsep(cdpath[i])) ! buf[j++] = ','; ! else { ! if (cdpath[i] == ' ' || cdpath[i] == ',') ! buf[j++] = '\\'; ! buf[j++] = cdpath[i]; } } + buf[j] = NUL; + opt_idx = findoption((char_u *)"cdpath"); + if (opt_idx >= 0) + { + options[opt_idx].def_val[VI_DEFAULT] = buf; + options[opt_idx].flags |= P_DEF_ALLOCED; + } + else + vim_free(buf); // cannot happen } + if (mustfree) + vim_free(cdpath); + } + /* + * Initialize the 'printencoding' option to a default value. + */ + static void + set_init_default_printencoding(void) + { #if defined(FEAT_POSTSCRIPT) && \ ! (defined(MSWIN) || defined(VMS) || defined(MAC) || defined(hpux)) // Set print encoding on platforms that don't default to latin1 set_string_default("penc", # if defined(MSWIN) ! (char_u *)"cp1252" # elif defined(VMS) ! (char_u *)"dec-mcs" # elif defined(MAC) ! (char_u *)"mac-roman" # else // HPUX ! (char_u *)"hp-roman8" # endif ! ); #endif + } #ifdef FEAT_POSTSCRIPT + /* + * Initialize the 'printexpr' option to a default value. + */ + static void + set_init_default_printexpr(void) + { // 'printexpr' must be allocated to be able to evaluate it. set_string_default("pexpr", # if defined(MSWIN) *************** *** 292,307 **** (char_u *)"system('lpr' . (&printdevice == '' ? '' : ' -P' . &printdevice) . ' ' . v:fname_in) . delete(v:fname_in) + v:shell_error" # endif ); #endif - /* - * Set all the options (except the terminal options) to their default - * value. Also set the global value for local options. - */ - set_options_default(0); - #ifdef UNIX ! // Force restricted-mode on for "nologin" or "false" $SHELL p = get_isolated_shell_name(); if (p != NULL) { --- 303,320 ---- (char_u *)"system('lpr' . (&printdevice == '' ? '' : ' -P' . &printdevice) . ' ' . v:fname_in) . delete(v:fname_in) + v:shell_error" # endif ); + } #endif #ifdef UNIX ! /* ! * Force restricted-mode on for "nologin" or "false" $SHELL ! */ ! static void ! set_init_restricted_mode(void) ! { ! char_u *p; ! p = get_isolated_shell_name(); if (p != NULL) { *************** *** 309,368 **** restricted = TRUE; vim_free(p); } #endif #ifdef CLEAN_RUNTIMEPATH ! if (clean_arg) { ! opt_idx = findoption((char_u *)"runtimepath"); ! if (opt_idx >= 0) ! { ! options[opt_idx].def_val[VI_DEFAULT] = (char_u *)CLEAN_RUNTIMEPATH; ! p_rtp = (char_u *)CLEAN_RUNTIMEPATH; ! } ! opt_idx = findoption((char_u *)"packpath"); ! if (opt_idx >= 0) ! { ! options[opt_idx].def_val[VI_DEFAULT] = (char_u *)CLEAN_RUNTIMEPATH; ! p_pp = (char_u *)CLEAN_RUNTIMEPATH; ! } } #endif ! #ifdef FEAT_GUI ! if (found_reverse_arg) ! set_option_value_give_err((char_u *)"bg", 0L, (char_u *)"dark", 0); ! #endif ! ! curbuf->b_p_initialized = TRUE; ! curbuf->b_p_ar = -1; // no local 'autoread' value ! curbuf->b_p_ul = NO_LOCAL_UNDOLEVEL; ! check_buf_options(curbuf); ! check_win_options(curwin); ! check_options(); ! ! // Must be before option_expand(), because that one needs vim_isIDc() ! didset_options(); ! ! #ifdef FEAT_SPELL ! // Use the current chartab for the generic chartab. This is not in ! // didset_options() because it only depends on 'encoding'. ! init_spell_chartab(); ! #endif - /* - * Expand environment variables and things like "~" for the defaults. - * If option_expand() returns non-NULL the variable is expanded. This can - * only happen for non-indirect options. - * Also set the default to the expanded value, so ":set" does not list - * them. - * Don't set the P_ALLOCED flag, because we don't want to free the - * default. - */ for (opt_idx = 0; !istermoption_idx(opt_idx); opt_idx++) { if ((options[opt_idx].flags & P_GETTEXT) ! && options[opt_idx].var != NULL) p = (char_u *)_(*(char **)options[opt_idx].var); else p = option_expand(opt_idx, NULL); --- 322,374 ---- restricted = TRUE; vim_free(p); } + } #endif #ifdef CLEAN_RUNTIMEPATH ! /* ! * When Vim is started with the "--clean" argument, set the default value ! * for the 'runtimepath' and 'packpath' options. ! */ ! static void ! set_init_clean_rtp(void) ! { ! int opt_idx; ! ! opt_idx = findoption((char_u *)"runtimepath"); ! if (opt_idx >= 0) { ! options[opt_idx].def_val[VI_DEFAULT] = (char_u *)CLEAN_RUNTIMEPATH; ! p_rtp = (char_u *)CLEAN_RUNTIMEPATH; } + opt_idx = findoption((char_u *)"packpath"); + if (opt_idx >= 0) + { + options[opt_idx].def_val[VI_DEFAULT] = (char_u *)CLEAN_RUNTIMEPATH; + p_pp = (char_u *)CLEAN_RUNTIMEPATH; + } + } #endif ! /* ! * Expand environment variables and things like "~" for the defaults. ! * If option_expand() returns non-NULL the variable is expanded. This can ! * only happen for non-indirect options. ! * Also set the default to the expanded value, so ":set" does not list ! * them. ! * Don't set the P_ALLOCED flag, because we don't want to free the ! * default. ! */ ! static void ! set_init_expand_env(void) ! { ! int opt_idx; ! char_u *p; for (opt_idx = 0; !istermoption_idx(opt_idx); opt_idx++) { if ((options[opt_idx].flags & P_GETTEXT) ! && options[opt_idx].var != NULL) p = (char_u *)_(*(char **)options[opt_idx].var); else p = option_expand(opt_idx, NULL); *************** *** 379,407 **** options[opt_idx].flags |= P_DEF_ALLOCED; } } ! save_file_ff(curbuf); // Buffer is unchanged ! ! #if defined(FEAT_ARABIC) ! // Detect use of mlterm. ! // Mlterm is a terminal emulator akin to xterm that has some special ! // abilities (bidi namely). ! // NOTE: mlterm's author is being asked to 'set' a variable ! // instead of an environment variable due to inheritance. ! if (mch_getenv((char_u *)"MLTERM") != NULL) ! set_option_value_give_err((char_u *)"tbidi", 1L, NULL, 0); ! #endif ! ! didset_options2(); ! ! # if defined(MSWIN) && defined(FEAT_GETTEXT) ! /* ! * If $LANG isn't set, try to get a good value for it. This makes the ! * right language be used automatically. Don't do this for English. ! */ if (mch_getenv((char_u *)"LANG") == NULL) { char buf[20]; // Could use LOCALE_SISO639LANGNAME, but it's not in Win95. // LOCALE_SABBREVLANGNAME gives us three letters, like "enu", we use --- 385,405 ---- options[opt_idx].flags |= P_DEF_ALLOCED; } } + } ! /* ! * Initialize the 'LANG' environment variable to a default value. ! */ ! static void ! set_init_lang_env(void) ! { ! #if defined(MSWIN) && defined(FEAT_GETTEXT) ! // If $LANG isn't set, try to get a good value for it. This makes the ! // right language be used automatically. Don't do this for English. if (mch_getenv((char_u *)"LANG") == NULL) { char buf[20]; + long_u n; // Could use LOCALE_SISO639LANGNAME, but it's not in Win95. // LOCALE_SABBREVLANGNAME gives us three letters, like "enu", we use *************** *** 423,432 **** vim_setenv((char_u *)"LANG", (char_u *)buf); } } ! # elif defined(MACOS_CONVERT) // Moved to os_mac_conv.c to avoid dependency problems. mac_lang_init(); ! # endif # ifdef MSWIN // MS-Windows has builtin support for conversion to and from Unicode, using --- 421,440 ---- vim_setenv((char_u *)"LANG", (char_u *)buf); } } ! #elif defined(MACOS_CONVERT) // Moved to os_mac_conv.c to avoid dependency problems. mac_lang_init(); ! #endif ! } ! ! /* ! * Initialize the 'encoding' option to a default value. ! */ ! static void ! set_init_default_encoding(void) ! { ! char_u *p; ! int opt_idx; # ifdef MSWIN // MS-Windows has builtin support for conversion to and from Unicode, using *************** *** 437,531 **** // This works best for properly configured systems, old and new. p = enc_locale(); # endif ! if (p != NULL) ! { ! char_u *save_enc; ! // Try setting 'encoding' and check if the value is valid. ! // If not, go back to the default encoding. ! save_enc = p_enc; ! p_enc = p; ! if (STRCMP(p_enc, "gb18030") == 0) { ! // We don't support "gb18030", but "cp936" is a good substitute ! // for practical purposes, thus use that. It's not an alias to ! // still support conversion between gb18030 and utf-8. ! p_enc = vim_strsave((char_u *)"cp936"); ! vim_free(p); } - if (mb_init() == NULL) - { - opt_idx = findoption((char_u *)"encoding"); - if (opt_idx >= 0) - { - options[opt_idx].def_val[VI_DEFAULT] = p_enc; - options[opt_idx].flags |= P_DEF_ALLOCED; - } #if defined(MSWIN) || defined(MACOS_X) || defined(VMS) ! if (STRCMP(p_enc, "latin1") == 0 || enc_utf8) ! { ! // Adjust the default for 'isprint' and 'iskeyword' to match ! // latin1. Also set the defaults for when 'nocompatible' is ! // set. ! set_string_option_direct((char_u *)"isp", -1, ! ISP_LATIN1, OPT_FREE, SID_NONE); ! set_string_option_direct((char_u *)"isk", -1, ! ISK_LATIN1, OPT_FREE, SID_NONE); ! opt_idx = findoption((char_u *)"isp"); ! if (opt_idx >= 0) ! options[opt_idx].def_val[VIM_DEFAULT] = ISP_LATIN1; ! opt_idx = findoption((char_u *)"isk"); ! if (opt_idx >= 0) ! options[opt_idx].def_val[VIM_DEFAULT] = ISK_LATIN1; ! (void)init_chartab(); ! } #endif #if defined(MSWIN) && (!defined(FEAT_GUI) || defined(VIMDLL)) ! // Win32 console: When GetACP() returns a different value from ! // GetConsoleCP() set 'termencoding'. ! if ( # ifdef VIMDLL ! (!gui.in_use && !gui.starting) && # endif ! GetACP() != GetConsoleCP()) ! { ! char buf[50]; ! // Win32 console: In ConPTY, GetConsoleCP() returns zero. ! // Use an alternative value. ! if (GetConsoleCP() == 0) ! sprintf(buf, "cp%ld", (long)GetACP()); ! else ! sprintf(buf, "cp%ld", (long)GetConsoleCP()); ! p_tenc = vim_strsave((char_u *)buf); ! if (p_tenc != NULL) { ! opt_idx = findoption((char_u *)"termencoding"); ! if (opt_idx >= 0) ! { ! options[opt_idx].def_val[VI_DEFAULT] = p_tenc; ! options[opt_idx].flags |= P_DEF_ALLOCED; ! } ! convert_setup(&input_conv, p_tenc, p_enc); ! convert_setup(&output_conv, p_enc, p_tenc); } ! else ! p_tenc = empty_option; } #endif #if defined(MSWIN) ! // $HOME may have characters in active code page. ! init_homedir(); #endif - } - else - { - vim_free(p_enc); - p_enc = save_enc; - } } #ifdef FEAT_MULTI_LANG // Set the default for 'helplang'. --- 445,627 ---- // This works best for properly configured systems, old and new. p = enc_locale(); # endif ! if (p == NULL) ! return; ! // Try setting 'encoding' and check if the value is valid. ! // If not, go back to the default encoding. ! char_u *save_enc = p_enc; ! p_enc = p; ! if (STRCMP(p_enc, "gb18030") == 0) ! { ! // We don't support "gb18030", but "cp936" is a good substitute ! // for practical purposes, thus use that. It's not an alias to ! // still support conversion between gb18030 and utf-8. ! p_enc = vim_strsave((char_u *)"cp936"); ! vim_free(p); ! } ! if (mb_init() == NULL) ! { ! opt_idx = findoption((char_u *)"encoding"); ! if (opt_idx >= 0) { ! options[opt_idx].def_val[VI_DEFAULT] = p_enc; ! options[opt_idx].flags |= P_DEF_ALLOCED; } #if defined(MSWIN) || defined(MACOS_X) || defined(VMS) ! if (STRCMP(p_enc, "latin1") == 0 || enc_utf8) ! { ! // Adjust the default for 'isprint' and 'iskeyword' to match ! // latin1. Also set the defaults for when 'nocompatible' is ! // set. ! set_string_option_direct((char_u *)"isp", -1, ! ISP_LATIN1, OPT_FREE, SID_NONE); ! set_string_option_direct((char_u *)"isk", -1, ! ISK_LATIN1, OPT_FREE, SID_NONE); ! opt_idx = findoption((char_u *)"isp"); ! if (opt_idx >= 0) ! options[opt_idx].def_val[VIM_DEFAULT] = ISP_LATIN1; ! opt_idx = findoption((char_u *)"isk"); ! if (opt_idx >= 0) ! options[opt_idx].def_val[VIM_DEFAULT] = ISK_LATIN1; ! (void)init_chartab(); ! } #endif #if defined(MSWIN) && (!defined(FEAT_GUI) || defined(VIMDLL)) ! // Win32 console: When GetACP() returns a different value from ! // GetConsoleCP() set 'termencoding'. ! if ( # ifdef VIMDLL ! (!gui.in_use && !gui.starting) && # endif ! GetACP() != GetConsoleCP()) ! { ! char buf[50]; ! // Win32 console: In ConPTY, GetConsoleCP() returns zero. ! // Use an alternative value. ! if (GetConsoleCP() == 0) ! sprintf(buf, "cp%ld", (long)GetACP()); ! else ! sprintf(buf, "cp%ld", (long)GetConsoleCP()); ! p_tenc = vim_strsave((char_u *)buf); ! if (p_tenc != NULL) ! { ! opt_idx = findoption((char_u *)"termencoding"); ! if (opt_idx >= 0) { ! options[opt_idx].def_val[VI_DEFAULT] = p_tenc; ! options[opt_idx].flags |= P_DEF_ALLOCED; } ! convert_setup(&input_conv, p_tenc, p_enc); ! convert_setup(&output_conv, p_enc, p_tenc); } + else + p_tenc = empty_option; + } #endif #if defined(MSWIN) ! // $HOME may have characters in active code page. ! init_homedir(); #endif } + else + { + vim_free(p_enc); + p_enc = save_enc; + } + + } + + /* + * Initialize the options, first part. + * + * Called only once from main(), just after creating the first buffer. + * If "clean_arg" is TRUE Vim was started with --clean. + */ + void + set_init_1(int clean_arg) + { + #ifdef FEAT_LANGMAP + langmap_init(); + #endif + + // Be Vi compatible by default + p_cp = TRUE; + + // Use POSIX compatibility when $VIM_POSIX is set. + if (mch_getenv((char_u *)"VIM_POSIX") != NULL) + { + set_string_default("cpo", (char_u *)CPO_ALL); + set_string_default("shm", (char_u *)SHM_POSIX); + } + + set_init_default_shell(); + set_init_default_backupskip(); + set_init_default_maxmemtot(); + set_init_default_cdpath(); + set_init_default_printencoding(); + #ifdef FEAT_POSTSCRIPT + set_init_default_printexpr(); + #endif + + /* + * Set all the options (except the terminal options) to their default + * value. Also set the global value for local options. + */ + set_options_default(0); + + #ifdef UNIX + set_init_restricted_mode(); + #endif + + #ifdef CLEAN_RUNTIMEPATH + if (clean_arg) + set_init_clean_rtp(); + #endif + + #ifdef FEAT_GUI + if (found_reverse_arg) + set_option_value_give_err((char_u *)"bg", 0L, (char_u *)"dark", 0); + #endif + + curbuf->b_p_initialized = TRUE; + curbuf->b_p_ar = -1; // no local 'autoread' value + curbuf->b_p_ul = NO_LOCAL_UNDOLEVEL; + check_buf_options(curbuf); + check_win_options(curwin); + check_options(); + + // Must be before option_expand(), because that one needs vim_isIDc() + didset_options(); + + #ifdef FEAT_SPELL + // Use the current chartab for the generic chartab. This is not in + // didset_options() because it only depends on 'encoding'. + init_spell_chartab(); + #endif + + // Expand environment variables and things like "~" for the defaults. + set_init_expand_env(); + + save_file_ff(curbuf); // Buffer is unchanged + + #if defined(FEAT_ARABIC) + // Detect use of mlterm. + // Mlterm is a terminal emulator akin to xterm that has some special + // abilities (bidi namely). + // NOTE: mlterm's author is being asked to 'set' a variable + // instead of an environment variable due to inheritance. + if (mch_getenv((char_u *)"MLTERM") != NULL) + set_option_value_give_err((char_u *)"tbidi", 1L, NULL, 0); + #endif + + didset_options2(); + + set_init_lang_env(); + set_init_default_encoding(); #ifdef FEAT_MULTI_LANG // Set the default for 'helplang'. *** ../vim-9.0.1294/src/version.c 2023-02-09 22:08:48.515700662 +0000 --- src/version.c 2023-02-10 14:50:19.726923185 +0000 *************** *** 697,698 **** --- 697,700 ---- { /* Add new patch number below this line */ + /**/ + 1295, /**/ -- hundred-and-one symptoms of being an internet addict: 108. While reading a magazine, you look for the Zoom icon for a better look at a photograph. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///