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 -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/20230210145102.C899A1C0396%40moolenaar.net.

Raspunde prin e-mail lui