Patch 8.1.0534
Problem: MS-Windows installer uses different $HOME than Vim.
Solution: Use the Vim logic also in the MS-Windows installer. (Ken Takata,
closes #3564)
Files: src/dosinst.c, src/misc1.c
*** ../vim-8.1.0533/src/dosinst.c 2018-10-13 17:25:24.112718312 +0200
--- src/dosinst.c 2018-11-16 19:39:24.551085683 +0100
***************
*** 115,128 ****
vimfiles_dir_vim,
vimfiles_dir_home
};
! static char *(vimfiles_dir_choices[]) =
{
"\nCreate plugin directories:",
"No",
"In the VIM directory",
"In your HOME directory",
};
- static int vimfiles_dir_choice;
/* non-zero when selected to install the popup menu entry. */
static int install_popup = 0;
--- 115,127 ----
vimfiles_dir_vim,
vimfiles_dir_home
};
! static char *(vimfiles_dir_choices[]) =
{
"\nCreate plugin directories:",
"No",
"In the VIM directory",
"In your HOME directory",
};
/* non-zero when selected to install the popup menu entry. */
static int install_popup = 0;
***************
*** 741,747 ****
choices[choice_count].installfunc = NULL;
choices[choice_count].active = 0;
choices[choice_count].changefunc = NULL;
! choices[choice_count].installfunc = NULL;
++choice_count;
}
--- 740,747 ----
choices[choice_count].installfunc = NULL;
choices[choice_count].active = 0;
choices[choice_count].changefunc = NULL;
! choices[choice_count].text = NULL;
! choices[choice_count].arg = 0;
++choice_count;
}
***************
*** 2089,2094 ****
--- 2089,2096 ----
static void
set_directories_text(int idx)
{
+ int vimfiles_dir_choice = choices[idx].arg;
+
if (vimfiles_dir_choice == (int)vimfiles_dir_none)
alloc_text(idx, "Do NOT create plugin directories%s", "");
else
***************
*** 2097,2102 ****
--- 2099,2189 ----
}
/*
+ * To get the "real" home directory:
+ * - get value of $HOME
+ * - if not found, get value of $HOMEDRIVE$HOMEPATH
+ * - if not found, get value of $USERPROFILE
+ *
+ * This code is based on init_homedir() in misc1.c, keep in sync!
+ */
+ static char *homedir = NULL;
+
+ void
+ init_homedir(void)
+ {
+ char *var;
+ char buf[MAX_PATH];
+
+ if (homedir != NULL)
+ {
+ free(homedir);
+ homedir = NULL;
+ }
+
+ var = getenv("HOME");
+
+ /*
+ * Typically, $HOME is not defined on Windows, unless the user has
+ * specifically defined it for Vim's sake. However, on Windows NT
+ * platforms, $HOMEDRIVE and $HOMEPATH are automatically defined for
+ * each user. Try constructing $HOME from these.
+ */
+ if (var == NULL || *var == NUL)
+ {
+ char *homedrive, *homepath;
+
+ homedrive = getenv("HOMEDRIVE");
+ homepath = getenv("HOMEPATH");
+ if (homepath == NULL || *homepath == NUL)
+ homepath = "\\";
+ if (homedrive != NULL
+ && strlen(homedrive) + strlen(homepath) < MAX_PATH)
+ {
+ sprintf(buf, "%s%s", homedrive, homepath);
+ if (buf[0] != NUL)
+ var = buf;
+ }
+ }
+
+ if (var == NULL)
+ var = getenv("USERPROFILE");
+
+ /*
+ * Weird but true: $HOME may contain an indirect reference to another
+ * variable, esp. "%USERPROFILE%". Happens when $USERPROFILE isn't set
+ * when $HOME is being set.
+ */
+ if (var != NULL && *var == '%')
+ {
+ char *p;
+ char *exp;
+
+ p = strchr(var + 1, '%');
+ if (p != NULL)
+ {
+ strncpy(buf, var + 1, p - (var + 1));
+ buf[p - (var + 1)] = NUL;
+ exp = getenv(buf);
+ if (exp != NULL && *exp != NUL
+ && strlen(exp) + strlen(p) < MAX_PATH)
+ {
+ _snprintf(buf, MAX_PATH, "%s%s", exp, p + 1);
+ buf[MAX_PATH - 1] = NUL;
+ var = buf;
+ }
+ }
+ }
+
+ if (var != NULL && *var == NUL) // empty is same as not set
+ var = NULL;
+
+ if (var == NULL)
+ homedir = NULL;
+ else
+ homedir = _strdup(var);
+ }
+
+ /*
* Change the directory that the vim plugin directories will be created in:
* $HOME, $VIM or nowhere.
*/
***************
*** 2106,2114 ****
int choice_count = TABLE_SIZE(vimfiles_dir_choices);
/* Don't offer the $HOME choice if $HOME isn't set. */
! if (getenv("HOME") == NULL)
--choice_count;
! vimfiles_dir_choice = get_choice(vimfiles_dir_choices, choice_count);
set_directories_text(idx);
}
--- 2193,2201 ----
int choice_count = TABLE_SIZE(vimfiles_dir_choices);
/* Don't offer the $HOME choice if $HOME isn't set. */
! if (homedir == NULL)
--choice_count;
! choices[idx].arg = get_choice(vimfiles_dir_choices, choice_count);
set_directories_text(idx);
}
***************
*** 2120,2125 ****
--- 2207,2213 ----
install_vimfilesdir(int idx)
{
int i;
+ int vimfiles_dir_choice = choices[idx].arg;
char *p;
char vimdir_path[BUFSIZE];
char vimfiles_path[BUFSIZE];
***************
*** 2144,2151 ****
}
case vimfiles_dir_home:
{
! /* Find the $HOME directory. Its existence was already checked. */
! p = getenv("HOME");
if (p == NULL)
{
printf("Internal error: $HOME is NULL\n");
--- 2232,2239 ----
}
case vimfiles_dir_home:
{
! // Find the $HOME directory. Its existence was already checked.
! p = homedir;
if (p == NULL)
{
printf("Internal error: $HOME is NULL\n");
***************
*** 2156,2162 ****
}
case vimfiles_dir_none:
{
! /* Do not create vim plugin directory */
return;
}
}
--- 2244,2250 ----
}
case vimfiles_dir_none:
{
! // Do not create vim plugin directory.
return;
}
}
***************
*** 2185,2198 ****
struct stat st;
char tmp_dirname[BUFSIZE];
char *p;
choices[choice_count].text = alloc(150);
choices[choice_count].changefunc = change_directories_choice;
choices[choice_count].installfunc = install_vimfilesdir;
choices[choice_count].active = 1;
! /* Check if the "compiler" directory already exists. That's a good
! * indication that the plugin directories were already created. */
if (getenv("HOME") != NULL)
{
vimfiles_dir_choice = (int)vimfiles_dir_home;
--- 2273,2287 ----
struct stat st;
char tmp_dirname[BUFSIZE];
char *p;
+ int vimfiles_dir_choice;
choices[choice_count].text = alloc(150);
choices[choice_count].changefunc = change_directories_choice;
choices[choice_count].installfunc = install_vimfilesdir;
choices[choice_count].active = 1;
! // Check if the "compiler" directory already exists. That's a good
! // indication that the plugin directories were already created.
if (getenv("HOME") != NULL)
{
vimfiles_dir_choice = (int)vimfiles_dir_home;
***************
*** 2204,2210 ****
{
vimfiles_dir_choice = (int)vimfiles_dir_vim;
p = getenv("VIM");
! if (p == NULL) /* No $VIM in path, use the install dir */
dir_remove_last(installdir, tmp_dirname);
else
strcpy(tmp_dirname, p);
--- 2293,2299 ----
{
vimfiles_dir_choice = (int)vimfiles_dir_vim;
p = getenv("VIM");
! if (p == NULL) // No $VIM in path, use the install dir.
dir_remove_last(installdir, tmp_dirname);
else
strcpy(tmp_dirname, p);
***************
*** 2213,2218 ****
--- 2302,2308 ----
vimfiles_dir_choice = (int)vimfiles_dir_none;
}
+ choices[choice_count].arg = vimfiles_dir_choice;
set_directories_text(choice_count);
++choice_count;
}
***************
*** 2369,2374 ****
--- 2459,2466 ----
}
else if (strcmp(argv[i], "-create-directories") == 0)
{
+ int vimfiles_dir_choice;
+
init_directories_choice();
if (argv[i + 1][0] != '-')
{
***************
*** 2377,2384 ****
vimfiles_dir_choice = (int)vimfiles_dir_vim;
else if (strcmp(argv[i], "home") == 0)
{
! if (getenv("HOME") == NULL) /* No $HOME in environment */
! vimfiles_dir_choice = (int)vimfiles_dir_vim;
else
vimfiles_dir_choice = (int)vimfiles_dir_home;
}
--- 2469,2476 ----
vimfiles_dir_choice = (int)vimfiles_dir_vim;
else if (strcmp(argv[i], "home") == 0)
{
! if (homedir == NULL) // No $HOME in environment
! vimfiles_dir_choice = (int)vimfiles_dir_none;
else
vimfiles_dir_choice = (int)vimfiles_dir_home;
}
***************
*** 2391,2396 ****
--- 2483,2489 ----
}
else /* No choice specified, default to vim directory */
vimfiles_dir_choice = (int)vimfiles_dir_vim;
+ choices[choice_count - 1].arg = vimfiles_dir_choice;
}
else if (strcmp(argv[i], "-register-OLE") == 0)
{
***************
*** 2589,2594 ****
--- 2682,2688 ----
/* Initialize this program. */
do_inits(argv);
+ init_homedir();
if (argc > 1 && strcmp(argv[1], "-uninstall-check") == 0)
{
*** ../vim-8.1.0533/src/misc1.c 2018-10-07 23:16:33.138616197 +0200
--- src/misc1.c 2018-11-16 19:37:57.095655169 +0100
***************
*** 3905,3910 ****
--- 3905,3912 ----
* - do mch_dirname() to get the real name of that directory.
* This also works with mounts and links.
* Don't do this for MS-DOS, it will change the "current dir" for a drive.
+ * For Windows:
+ * This code is duplicated in init_homedir() in dosinst.c. Keep in sync!
*/
static char_u *homedir = NULL;
*** ../vim-8.1.0533/src/version.c 2018-11-16 18:50:13.346534543 +0100
--- src/version.c 2018-11-16 19:33:13.893507996 +0100
***************
*** 794,795 ****
--- 794,797 ----
{ /* Add new patch number below this line */
+ /**/
+ 534,
/**/
--
Two cows are standing together in a field. One asks the other:
"So what do you think about this Mad Cow Disease?"
The other replies: "That doesn't concern me. I'm a helicopter."
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ 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].
For more options, visit https://groups.google.com/d/optout.