patch 9.1.1159: $MYVIMDIR may not always be set

Commit: 
https://github.com/vim/vim/commit/3e2affc324034085a98356003b226bd4a6f6c1ad
Author: Christian Brabandt <c...@256bit.org>
Date:   Fri Feb 28 17:34:46 2025 +0100

    patch 9.1.1159: $MYVIMDIR may not always be set
    
    Problem:  $MYVIMDIR may not always be set (after 9.1.0718)
              (sandwm)
    Solution: always set $MYVIMDIR to first item in runtimepath
              (except when using --clean), update it when changing &rtp
    
    fixes: #16609
    closes: #16709
    
    Signed-off-by: Christian Brabandt <c...@256bit.org>

diff --git a/runtime/doc/starting.txt b/runtime/doc/starting.txt
index 94ed836fc..ccedc1ad4 100644
--- a/runtime/doc/starting.txt
+++ b/runtime/doc/starting.txt
@@ -1,4 +1,4 @@
-*starting.txt*  For Vim version 9.1.  Last change: 2024 Dec 19
+*starting.txt*  For Vim version 9.1.  Last change: 2025 Feb 27
 
 
                  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -828,8 +828,9 @@ accordingly.  Vim proceeds in this order:
        easy to copy it to another system.
 
        If Vim was started with "-u filename", the file "filename" is used.
-       All following initializations until 4. are skipped. $MYVIMRC and
-       $MYVIMDIR are not set.
+       All following initializations until 4. are skipped. `$MYVIMRC` and
+       `$MYVIMDIR` are not set (but `$MYVIMDIR` will be set, if 'rtp' is
+       updated).
        "vim -u NORC" can be used to skip these initializations without
        reading a file.  "vim -u NONE" also skips loading plugins.  |-u|
 
@@ -850,9 +851,9 @@ accordingly.  Vim proceeds in this order:
                        *VIMINIT* *.vimrc* *_vimrc* *EXINIT* *.exrc* *_exrc*
                        *$MYVIMRC* *$MYVIMDIR*
      c. Five places are searched for initializations.  The first that exists
-       is used, the others are ignored.  The $MYVIMRC environment variable is
-       set to the file that was first found, unless $MYVIMRC was already set
-       and when using VIMINIT.  The $MYVIMDIR environment variable is
+       is used, the others are ignored.  The `$MYVIMRC` environment variable is
+       set to the file that was first found, unless `$MYVIMRC` was already set
+       when using VIMINIT.  The `$MYVIMDIR` environment variable is
        set to the personal 'rtp' directory, however it is not verified
        that the directory actually exists.
        I   The environment variable VIMINIT (see also |compatible-default|) (*)
@@ -973,9 +974,10 @@ accordingly.  Vim proceeds in this order:
        The |v:vim_did_enter| variable is set to 1.
        The |VimEnter| autocommands are executed.
 
-The $MYVIMRC or $MYGVIMRC environment variable will be set to the first found
-vimrc and/or gvimrc file while $MYVIMDIR is set to the users personal runtime
-directory 'rtp' (typically the first entry in 'runtimepath').
+The `$MYVIMRC` or `$MYGVIMRC` environment variable will be set to the first 
found
+vimrc and/or gvimrc file while `$MYVIMDIR` is set to the users personal runtime
+directory 'rtp' (typically the first entry in 'runtimepath').  If 'rtp'
+changes, `$MYVIMDIR` will be updated.
 Note: These environment variables resolve symbolic links, but 'rtp' does not.
 
 
diff --git a/src/option.c b/src/option.c
index 60e1cf064..fa3454680 100644
--- a/src/option.c
+++ b/src/option.c
@@ -8418,55 +8418,6 @@ vimrc_found(char_u *fname, char_u *envname)
            if (p != NULL)
            {
                vim_setenv(envname, p);
-               if (vim_getenv((char_u *)"MYVIMDIR", &dofree) == NULL)
-               {
-                   size_t  usedlen = 0;
-                   size_t  len = 0;
-                   char_u  *fbuf = NULL;
-
-                   if (STRNCMP(gettail(fname), ".vimrc", 6) == 0)
-                   {
-                       len = STRLEN(p) - 2;
-                       p[len] = '/';
-                   }
-                   else if (STRNCMP(gettail(fname), ".gvimrc", 7) == 0)
-                   {
-                       len = STRLEN(p);
-                       char_u  *buf = alloc(len);
-                       if (buf != NULL)
-                       {
-                           mch_memmove(buf, fname, len - 7);
-                           mch_memmove(buf + len - 7, (char_u *)".vim/", 5);
-                           len -= 2;  // decrement len, so that we can set 
len+1 = NUL below
-                           vim_free(p);
-                           p = buf;
-                       }
-                   }
-#ifdef MSWIN
-                   else if (STRNCMP(gettail(fname), "_vimrc", 6) == 0)
-                   {
-                       len = STRLEN(p) + 4; // remove _vimrc, add vimfiles/
-                       char_u  *buf = alloc(len);
-                       if (buf != NULL)
-                       {
-                           mch_memmove(buf, fname, len - 10);
-                           mch_memmove(buf + len - 10, (char_u *)"vimfiles\", 
9);
-                           len -= 2;  // decrement len, so that we can set 
len+1 = NUL below
-                           vim_free(p);
-                           p = buf;
-                       }
-                   }
-#endif
-                   else
-                       (void)modify_fname((char_u *)":h", FALSE, &usedlen, &p, 
&fbuf, &len);
-
-                   if (p != NULL)
-                   {
-                       // keep the directory separator
-                       p[len + 1] = NUL;
-                       vim_setenv((char_u *)"MYVIMDIR", p);
-                   }
-               }
                vim_free(p);
            }
        }
diff --git a/src/optionstr.c b/src/optionstr.c
index f912e30c5..02806b66a 100644
--- a/src/optionstr.c
+++ b/src/optionstr.c
@@ -135,6 +135,7 @@ static char *(p_sws_values[]) = {"fsync", "sync", NULL};
 
 static int check_opt_strings(char_u *val, char **values, int list);
 static int opt_strings_flags(char_u *val, char **values, unsigned *flagp, int 
list);
+static void export_myvimdir(void);
 
 /*
  * After setting various option values: recompute variables that depend on
@@ -4652,10 +4653,13 @@ did_set_string_option(
            setmouse();             // in case 'mouse' changed
     }
 
-#if defined(FEAT_LUA) || defined(PROTO)
     if (varp == &p_rtp)
+    {
+       export_myvimdir();
+#if defined(FEAT_LUA) || defined(PROTO)
        update_package_paths_in_lua();
 #endif
+    }
 
 #if defined(FEAT_LINEBREAK)
     // Changing Formatlistpattern when briopt includes the list setting:
@@ -4809,3 +4813,37 @@ restore_shm_value(void)
        vim_memset(shm_buf, 0, SHM_LEN);
     }
 }
+
+/*
+ * Export the environment variable $MYVIMDIR to the first item in runtimepath
+ */
+    static void
+export_myvimdir()
+{
+    int                dofree = FALSE;
+    char_u     *p;
+    char_u     *q = p_rtp;
+    char_u     *buf = alloc(MAXPATHL);
+
+    if (buf == NULL)
+       return;
+
+    (void)copy_option_part(&q, buf, MAXPATHL, ",");
+
+    p = vim_getenv((char_u *)"MYVIMDIR", &dofree);
+
+    if (p == NULL || STRCMP(p, buf) != 0)
+    {
+       add_pathsep(buf);
+#ifdef MSWIN
+       // normalize path separators
+       for (q = buf; *q != NUL; q++)
+           if (*q == '/')
+               *q = '\';
+#endif
+       vim_setenv((char_u *)"MYVIMDIR", buf);
+    }
+    if (dofree)
+       vim_free(p);
+    vim_free(buf);
+}
diff --git a/src/testdir/test_xdg.vim b/src/testdir/test_xdg.vim
index d4c1d224a..15f82e2f6 100644
--- a/src/testdir/test_xdg.vim
+++ b/src/testdir/test_xdg.vim
@@ -150,6 +150,19 @@ func Test_xdg_runtime_files()
   call system($'{vimcmd} -S Xscript')
   call assert_equal([], readfile('Xresult'))
 
+  " Test for $MYVIMDIR changes when updating runtimepath
+  let lines =<< trim END
+    let msg = $'HOME="{$HOME}", XDG_CONFIG_HOME="{$XDG_CONFIG_HOME}" 
rtp-prepend'
+    set rtp^=/non-existing
+    call assert_match('XfakeHOME/xdg/vim/vimrc', $MYVIMRC, msg)
+    call assert_match('/non-existing', $MYVIMDIR, msg)
+    call writefile(v:errors, 'Xresult')
+    quit
+  END
+  call writefile(lines, 'Xscript', 'D')
+  call system($'{vimcmd} -S Xscript')
+  call assert_equal([], readfile('Xresult'))
+
   call delete(rc4)
   unlet $XDG_CONFIG_HOME
 endfunc
@@ -267,13 +280,14 @@ func Test_zzz_xdg_runtime_files()
   call delete(rc2)
 
   " Test for ~/.config/vim/gvimrc
+  " MYVIMDIR is only set to ~/config/.vim if ~/.config/vim/vimrc exists!
   let lines =<< trim END
     " Ignore the "failed to create input context" error.
     call test_ignore_error('E285')
     gui -f
     let msg = $'HOME="{$HOME}", ~="{expand("~")}"'
     call assert_match('Xhome/\.config/vim/gvimrc', $MYGVIMRC, msg)
-    call assert_match('Xhome/\.config/vim/', $MYVIMDIR, msg)
+    call assert_match('Xhome/\.vim/', $MYVIMDIR, msg)
     call filter(g:, {idx, _ -> idx =~ '^rc'})
     call assert_equal(#{rc_three: 'three', rc: '.config/vim/gvimrc'}, g:)
     call writefile(v:errors, 'Xresult')
@@ -286,6 +300,7 @@ func Test_zzz_xdg_runtime_files()
   call delete(rc3)
 
   " Test for ~/xdg/vim/gvimrc
+  " MYVIMDIR is only set to ~/xdg/vim if ~/xdg/vim/vimrc exists!
   let $XDG_CONFIG_HOME=expand('~/xdg/')
   let lines =<< trim END
     " Ignore the "failed to create input context" error.
@@ -293,7 +308,7 @@ func Test_zzz_xdg_runtime_files()
     gui -f
     let msg = $'HOME="{$HOME}", XDG_CONFIG_HOME="{$XDG_CONFIG_HOME}"'
     call assert_match('Xhome/xdg/vim/gvimrc', $MYGVIMRC, msg)
-    call assert_match('Xhome/xdg/vim/', $MYVIMDIR, msg)
+    call assert_match('Xhome/\.vim/', $MYVIMDIR, msg)
     call filter(g:, {idx, _ -> idx =~ '^rc'})
     call assert_equal(#{rc_four: 'four', rc: 'xdg/vim/gvimrc'}, g:)
     call writefile(v:errors, 'Xresult')
diff --git a/src/version.c b/src/version.c
index 3b61cdd8e..f29e1f3eb 100644
--- a/src/version.c
+++ b/src/version.c
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1159,
 /**/
     1158,
 /**/

-- 
-- 
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 vim_dev+unsubscr...@googlegroups.com.
To view this discussion visit 
https://groups.google.com/d/msgid/vim_dev/E1to3UA-000oOC-DK%40256bit.org.

Raspunde prin e-mail lui