changeset 31926:6072c1d9fe2a v9.0.1295

patch 9.0.1295: the option initialization function is too long Commit: https://github.com/vim/vim/commit/6c41bedeed2a1f98fb9c55ff85634138782ad92a Author: Yegappan Lakshmanan <yegappan@yahoo.com> Date: Fri Feb 10 14:50:31 2023 +0000 patch 9.0.1295: the option initialization function is too long Problem: The option initialization function is too long. Solution: Move code to separate functions. (Yegappan Lakshmanan, closes #11966)
author Bram Moolenaar <Bram@vim.org>
date Fri, 10 Feb 2023 16:00:04 +0100
parents 04bb907f937c
children 5fff7ec54ca6
files src/option.c src/version.c
diffstat 2 files changed, 413 insertions(+), 315 deletions(-) [+]
line wrap: on
line diff
--- a/src/option.c
+++ b/src/option.c
@@ -70,36 +70,15 @@ static void paste_option_changed(void);
 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)
+ * Initialize the 'shell' option to a default value.
+ */
+    static void
+set_init_default_shell(void)
 {
     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.
-     */
+
+    // 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,70 +108,83 @@ set_init_1(int clean_arg)
 #else
 	set_string_default_esc("sh", p, TRUE);
 #endif
-
-    /*
-     * Set the default for 'backupskip' to include environment variables for
-     * temp files.
-     */
-    {
+}
+
+/*
+ * 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"};
+    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;
+    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)
+	if (*names[n] == NUL)
 # ifdef MACOS_X
-		p = (char_u *)"/private/tmp";
+	    p = (char_u *)"/private/tmp";
 # else
-		p = (char_u *)"/tmp";
+	p = (char_u *)"/tmp";
 # endif
-	    else
-#endif
-		p = vim_getenv((char_u *)names[n], &mustfree);
-	    if (p != NULL && *p != NUL)
+	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)
 	    {
-		// 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 (ga.ga_len > 0)
+		    STRCAT(ga.ga_data, ",");
+		STRCAT(ga.ga_data, item);
+		ga.ga_len += len;
 	    }
-	    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
-     */
+	    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,66 +213,85 @@ set_init_1(int clean_arg)
 	    }
 	}
     }
-
-    {
-	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)
+}
+
+/*
+ * 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
 	    {
-		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 (cdpath[i] == ' ' || cdpath[i] == ',')
+		    buf[j++] = '\\';
+		buf[j++] = cdpath[i];
 	    }
-	    if (mustfree)
-		vim_free(cdpath);
-	}
-    }
-
+	}
+	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))
+    (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"
+	    (char_u *)"cp1252"
 # elif defined(VMS)
-		       (char_u *)"dec-mcs"
+	    (char_u *)"dec-mcs"
 # elif defined(MAC)
-		       (char_u *)"mac-roman"
+	    (char_u *)"mac-roman"
 # else // HPUX
-		       (char_u *)"hp-roman8"
+	    (char_u *)"hp-roman8"
 # endif
-		       );
-#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,6 +303,268 @@ set_init_1(int clean_arg)
 	    (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)
+    {
+	if (fnamecmp(p, "nologin") == 0 || fnamecmp(p, "false") == 0)
+	    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);
+	if (p != NULL && (p = vim_strsave(p)) != NULL)
+	{
+	    *(char_u **)options[opt_idx].var = p;
+	    // VIMEXP
+	    // Defaults for all expanded options are currently the same for Vi
+	    // and Vim.  When this changes, add some code here!  Also need to
+	    // split P_DEF_ALLOCED in two.
+	    if (options[opt_idx].flags & P_DEF_ALLOCED)
+		vim_free(options[opt_idx].def_val[VI_DEFAULT]);
+	    options[opt_idx].def_val[VI_DEFAULT] = p;
+	    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
+	// only the first two.
+	n = GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVLANGNAME,
+							     (LPTSTR)buf, 20);
+	if (n >= 2 && STRNICMP(buf, "en", 2) != 0)
+	{
+	    // There are a few exceptions (probably more)
+	    if (STRNICMP(buf, "cht", 3) == 0 || STRNICMP(buf, "zht", 3) == 0)
+		STRCPY(buf, "zh_TW");
+	    else if (STRNICMP(buf, "chs", 3) == 0
+					      || STRNICMP(buf, "zhc", 3) == 0)
+		STRCPY(buf, "zh_CN");
+	    else if (STRNICMP(buf, "jp", 2) == 0)
+		STRCPY(buf, "ja");
+	    else
+		buf[2] = NUL;		// truncate to two-letter code
+	    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
+    // "utf-8" for 'encoding' should work best for most users.
+    p = vim_strsave((char_u *)ENC_DFLT);
+# else
+    // enc_locale() will try to find the encoding of the current locale.
+    // 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
 
     /*
@@ -301,32 +574,12 @@ set_init_1(int clean_arg)
     set_options_default(0);
 
 #ifdef UNIX
-    // Force restricted-mode on for "nologin" or "false" $SHELL
-    p = get_isolated_shell_name();
-    if (p != NULL)
-    {
-	if (fnamecmp(p, "nologin") == 0 || fnamecmp(p, "false") == 0)
-	    restricted = TRUE;
-	vim_free(p);
-    }
+    set_init_restricted_mode();
 #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;
-	}
-    }
+	set_init_clean_rtp();
 #endif
 
 #ifdef FEAT_GUI
@@ -350,35 +603,8 @@ set_init_1(int clean_arg)
     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);
-	if (p != NULL && (p = vim_strsave(p)) != NULL)
-	{
-	    *(char_u **)options[opt_idx].var = p;
-	    // VIMEXP
-	    // Defaults for all expanded options are currently the same for Vi
-	    // and Vim.  When this changes, add some code here!  Also need to
-	    // split P_DEF_ALLOCED in two.
-	    if (options[opt_idx].flags & P_DEF_ALLOCED)
-		vim_free(options[opt_idx].def_val[VI_DEFAULT]);
-	    options[opt_idx].def_val[VI_DEFAULT] = p;
-	    options[opt_idx].flags |= P_DEF_ALLOCED;
-	}
-    }
+    // Expand environment variables and things like "~" for the defaults.
+    set_init_expand_env();
 
     save_file_ff(curbuf);	// Buffer is unchanged
 
@@ -394,138 +620,8 @@ set_init_1(int clean_arg)
 
     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
-	// only the first two.
-	n = GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVLANGNAME,
-							     (LPTSTR)buf, 20);
-	if (n >= 2 && STRNICMP(buf, "en", 2) != 0)
-	{
-	    // There are a few exceptions (probably more)
-	    if (STRNICMP(buf, "cht", 3) == 0 || STRNICMP(buf, "zht", 3) == 0)
-		STRCPY(buf, "zh_TW");
-	    else if (STRNICMP(buf, "chs", 3) == 0
-					      || STRNICMP(buf, "zhc", 3) == 0)
-		STRCPY(buf, "zh_CN");
-	    else if (STRNICMP(buf, "jp", 2) == 0)
-		STRCPY(buf, "ja");
-	    else
-		buf[2] = NUL;		// truncate to two-letter code
-	    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
-    // "utf-8" for 'encoding' should work best for most users.
-    p = vim_strsave((char_u *)ENC_DFLT);
-# else
-    // enc_locale() will try to find the encoding of the current locale.
-    // 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;
-	}
-    }
+    set_init_lang_env();
+    set_init_default_encoding();
 
 #ifdef FEAT_MULTI_LANG
     // Set the default for 'helplang'.
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1295,
+/**/
     1294,
 /**/
     1293,