]> granicus.if.org Git - vim/commitdiff
patch 9.0.1313: some settings use the current codepage instead of 'encoding' v9.0.1313
authorK.Takata <kentkt@csc.jp>
Wed, 15 Feb 2023 19:13:43 +0000 (19:13 +0000)
committerBram Moolenaar <Bram@vim.org>
Wed, 15 Feb 2023 19:13:43 +0000 (19:13 +0000)
Problem:    Some settings use the current codepage instead of 'encoding'.
Solution:   Adjust how options are initialized. (Ken Takata, closes #11992)

src/misc1.c
src/option.c
src/optionstr.c
src/os_win32.c
src/proto/misc1.pro
src/proto/os_win32.pro
src/version.c

index d369f2aa24d16c1e7c8b57c1f62798c2fa0b2a3a..c83b7ae0d5180db6c01255e069981df4bd748e1e 100644 (file)
@@ -1311,6 +1311,32 @@ free_users(void)
 }
 #endif
 
+#if defined(MSWIN) || defined(PROTO)
+/*
+ * Initilize $VIM and $VIMRUNTIME when 'enc' is updated.
+ */
+    void
+init_vimdir(void)
+{
+    int            mustfree;
+    char_u  *p;
+
+    mch_get_exe_name();
+
+    mustfree = FALSE;
+    didset_vim = FALSE;
+    p = vim_getenv((char_u *)"VIM", &mustfree);
+    if (mustfree)
+       vim_free(p);
+
+    mustfree = FALSE;
+    didset_vimruntime = FALSE;
+    p = vim_getenv((char_u *)"VIMRUNTIME", &mustfree);
+    if (mustfree)
+       vim_free(p);
+}
+#endif
+
 /*
  * Call expand_env() and store the result in an allocated string.
  * This is not very memory efficient, this expects the result to be freed
@@ -1696,7 +1722,7 @@ vim_version_dir(char_u *vimdir)
  * Vim's version of getenv().
  * Special handling of $HOME, $VIM and $VIMRUNTIME.
  * Also does ACP to 'enc' conversion for Win32.
- * "mustfree" is set to TRUE when returned is allocated, it must be
+ * "mustfree" is set to TRUE when the returned string is allocated.  It must be
  * initialized to FALSE by the caller.
  */
     char_u *
index 1b581ed355bdaaf917c30972a8f31b220db5302d..2332f2a38822c4db85d7c4601c8be9ce48654c21 100644 (file)
@@ -600,6 +600,8 @@ set_init_1(int clean_arg)
     init_spell_chartab();
 #endif
 
+    set_init_default_encoding();
+
     // Expand environment variables and things like "~" for the defaults.
     set_init_expand_env();
 
@@ -618,7 +620,6 @@ set_init_1(int clean_arg)
     didset_options2();
 
     set_init_lang_env();
-    set_init_default_encoding();
 
 #ifdef FEAT_MULTI_LANG
     // Set the default for 'helplang'.
index 6c9fd3ab32cbce9e107e3e04b1e542151fbc1a14..8acbbf7c98f098c9499a2c020f62fbb6ba8988d3 100644 (file)
@@ -1054,9 +1054,12 @@ did_set_encoding(char_u **varp, char_u **gvarp, int opt_flags)
        }
 
 #if defined(MSWIN)
-       // $HOME may have characters in active code page.
+       // $HOME, $VIM and $VIMRUNTIME may have characters in active code page.
        if (varp == &p_enc)
+       {
            init_homedir();
+           init_vimdir();
+       }
 #endif
     }
 
index 0785e95453766dc87bff480a41cc687f4b404d42..a151b19b04e390e7346477dbdb44c8714cf4aeb8 100644 (file)
@@ -254,7 +254,7 @@ static void restore_console_color_rgb(void);
 static int suppress_winsize = 1;       // don't fiddle with console
 #endif
 
-static char_u *exe_path = NULL;
+static WCHAR *exe_pathw = NULL;
 
 static BOOL win8_or_later = FALSE;
 static BOOL win10_22H2_or_later = FALSE;
@@ -462,27 +462,45 @@ wait_for_single_object(
 # endif
 #endif   // !FEAT_GUI_MSWIN || VIMDLL
 
-    static void
-get_exe_name(void)
+    void
+mch_get_exe_name(void)
 {
     // Maximum length of $PATH is more than MAXPATHL.  8191 is often mentioned
     // as the maximum length that works (plus a NUL byte).
 #define MAX_ENV_PATH_LEN 8192
     char       temp[MAX_ENV_PATH_LEN];
     char_u     *p;
+    WCHAR      buf[MAX_PATH];
+    int                updated = FALSE;
+    static int enc_prev = -1;
 
-    if (exe_name == NULL)
+    if (exe_name == NULL || exe_pathw == NULL || enc_prev != enc_codepage)
     {
        // store the name of the executable, may be used for $VIM
-       GetModuleFileName(NULL, temp, MAX_ENV_PATH_LEN - 1);
-       if (*temp != NUL)
-           exe_name = FullName_save((char_u *)temp, FALSE);
+       GetModuleFileNameW(NULL, buf, MAX_PATH);
+       if (*buf != NUL)
+       {
+           if (enc_codepage == -1)
+               enc_codepage = GetACP();
+           if (exe_name != NULL)
+               vim_free(exe_name);
+           exe_name = utf16_to_enc(buf, NULL);
+           enc_prev = enc_codepage;
+
+           WCHAR *wp = wcsrchr(buf, '\\');
+           if (wp != NULL)
+               *wp = NUL;
+           if (exe_pathw != NULL)
+               vim_free(exe_pathw);
+           exe_pathw = _wcsdup(buf);
+           updated = TRUE;
+       }
     }
 
-    if (exe_path != NULL || exe_name == NULL)
+    if (exe_pathw == NULL || !updated)
        return;
 
-    exe_path = vim_strnsave(exe_name, gettail_sep(exe_name) - exe_name);
+    char_u  *exe_path = utf16_to_enc(exe_pathw, NULL);
     if (exe_path == NULL)
        return;
 
@@ -503,6 +521,7 @@ get_exe_name(void)
        STRCAT(temp, exe_path);
        vim_setenv((char_u *)"PATH", (char_u *)temp);
     }
+    vim_free(exe_path);
 }
 
 /*
@@ -538,10 +557,10 @@ vimLoadLib(const char *name)
 
     // NOTE: Do not use mch_dirname() and mch_chdir() here, they may call
     // vimLoadLib() recursively, which causes a stack overflow.
-    if (exe_path == NULL)
-       get_exe_name();
+    if (exe_pathw == NULL)
+       mch_get_exe_name();
 
-    if (exe_path == NULL)
+    if (exe_pathw == NULL)
        return NULL;
 
     WCHAR old_dirw[MAXPATHL];
@@ -552,7 +571,7 @@ vimLoadLib(const char *name)
     // Change directory to where the executable is, both to make
     // sure we find a .dll there and to avoid looking for a .dll
     // in the current directory.
-    SetCurrentDirectory((LPCSTR)exe_path);
+    SetCurrentDirectoryW(exe_pathw);
     dll = LoadLibrary(name);
     SetCurrentDirectoryW(old_dirw);
     return dll;
@@ -3586,7 +3605,7 @@ mch_check_win(
     int argc UNUSED,
     char **argv UNUSED)
 {
-    get_exe_name();
+    mch_get_exe_name();
 
 #if defined(FEAT_GUI_MSWIN) && !defined(VIMDLL)
     return OK;     // GUI always has a tty
index 167805bd52947a80664a1c85507eaee0738c5bb7..5884821ac3eab10f17e7391ef030c71d15f3e050 100644 (file)
@@ -26,6 +26,7 @@ void vim_beep(unsigned val);
 void init_homedir(void);
 void free_homedir(void);
 void free_users(void);
+void init_vimdir(void);
 char_u *expand_env_save(char_u *src);
 char_u *expand_env_save_opt(char_u *src, int one);
 void expand_env(char_u *src, char_u *dst, int dstlen);
index 9f8b9695838dbb6f79adf48cb00a962b88cc2d8f..7ea53884877463cc746ffd410d557fd7e47ac40e 100644 (file)
@@ -1,4 +1,5 @@
 /* os_win32.c */
+void mch_get_exe_name(void);
 HINSTANCE vimLoadLib(const char *name);
 int mch_is_gui_executable(void);
 HINSTANCE find_imported_module_by_funcname(HINSTANCE hInst, const char *funcname);
index 080c3ad0c35febe904627110d34178a9dac0f473..57b35d77cf1859b6733003ed5630bc61057787f5 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1313,
 /**/
     1312,
 /**/