0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

patch 8.0.1451: difficult to set the python home directories properly

Problem:    It is difficult to set the python home directory properly for
            Python 2.7 and 3.5 since both use $PYTHONHOME.
Solution:   Add the 'pythonhome' and 'pythonthreehome' options. (Kazuki
            Sakamoto, closes #1266)
This commit is contained in:
Bram Moolenaar
2018-01-31 21:49:05 +01:00
parent 1dd45fb4f3
commit 94073167e3
8 changed files with 86 additions and 6 deletions

View File

@@ -5965,6 +5965,20 @@ A jump table for the options with a short description can be found at |Q_op|.
DYNAMIC_PYTHON_DLL, which was specified at compile time. DYNAMIC_PYTHON_DLL, which was specified at compile time.
Environment variables are expanded |:set_env|. Environment variables are expanded |:set_env|.
This option cannot be set from a |modeline| or in the |sandbox|, for This option cannot be set from a |modeline| or in the |sandbox|, for
security reasons.
*'pythonhome'*
'pythonhome' string (default "")
global
{not in Vi}
{only available when compiled with the |+python/dyn|
feature}
Specifies the name of the Python 2.x home directory. When 'pythonhome'
and the PYTHONHOME environment variable are not set, PYTHON_HOME,
which was specified at compile time, will be used for the Python 2.x
home directory.
Environment variables are expanded |:set_env|.
This option cannot be set from a |modeline| or in the |sandbox|, for
security reasons. security reasons.
*'pythonthreedll'* *'pythonthreedll'*
@@ -5977,6 +5991,20 @@ A jump table for the options with a short description can be found at |Q_op|.
DYNAMIC_PYTHON3_DLL, which was specified at compile time. DYNAMIC_PYTHON3_DLL, which was specified at compile time.
Environment variables are expanded |:set_env|. Environment variables are expanded |:set_env|.
This option cannot be set from a |modeline| or in the |sandbox|, for This option cannot be set from a |modeline| or in the |sandbox|, for
security reasons.
*'pythonthreehome'*
'pythonthreehome' string (default "")
global
{not in Vi}
{only available when compiled with the |+python3/dyn|
feature}
Specifies the name of the Python 3 home directory. When
'pythonthreehome' and the PYTHONHOME environment variable are not set,
PYTHON3_HOME, which was specified at compile time, will be used for
the Python 3 home directory.
Environment variables are expanded |:set_env|.
This option cannot be set from a |modeline| or in the |sandbox|, for
security reasons. security reasons.
*'pyxversion'* *'pyx'* *'pyxversion'* *'pyx'*

View File

@@ -839,7 +839,9 @@ Short explanation of each option: *option-list*
'prompt' 'prompt' enable prompt in Ex mode 'prompt' 'prompt' enable prompt in Ex mode
'pumheight' 'ph' maximum height of the popup menu 'pumheight' 'ph' maximum height of the popup menu
'pythondll' name of the Python 2 dynamic library 'pythondll' name of the Python 2 dynamic library
'pythonhome' name of the Python 2 home directory
'pythonthreedll' name of the Python 3 dynamic library 'pythonthreedll' name of the Python 3 dynamic library
'pythonthreehome' name of the Python 3 home directory
'pyxversion' 'pyx' Python version used for pyx* commands 'pyxversion' 'pyx' Python version used for pyx* commands
'quoteescape' 'qe' escape characters used in a string 'quoteescape' 'qe' escape characters used in a string
'readonly' 'ro' disallow writing the buffer 'readonly' 'ro' disallow writing the buffer

View File

@@ -1354,10 +1354,18 @@ if exists("&pythondll")
call append("$", "pythondll\tname of the Python 2 dynamic library") call append("$", "pythondll\tname of the Python 2 dynamic library")
call <SID>OptionG("pythondll", &pythondll) call <SID>OptionG("pythondll", &pythondll)
endif endif
if exists("&pythonhome")
call append("$", "pythonhome\tname of the Python 2 home directory")
call <SID>OptionG("pythonhome", &pythonhome)
endif
if exists("&pythonthreedll") if exists("&pythonthreedll")
call append("$", "pythonthreedll\tname of the Python 3 dynamic library") call append("$", "pythonthreedll\tname of the Python 3 dynamic library")
call <SID>OptionG("pythonthreedll", &pythonthreedll) call <SID>OptionG("pythonthreedll", &pythonthreedll)
endif endif
if exists("&pythonthreehome")
call append("$", "pythonthreehome\tname of the Python 3 home directory")
call <SID>OptionG("pythonthreehome", &pythonthreehome)
endif
if exists("&rubydll") if exists("&rubydll")
call append("$", "rubydll\tname of the Ruby dynamic library") call append("$", "rubydll\tname of the Ruby dynamic library")
call <SID>OptionG("rubydll", &rubydll) call <SID>OptionG("rubydll", &rubydll)

View File

@@ -912,6 +912,8 @@ python_loaded(void)
} }
#endif #endif
static char *py_home_buf = NULL;
static int static int
Python_Init(void) Python_Init(void)
{ {
@@ -929,10 +931,15 @@ Python_Init(void)
} }
#endif #endif
if (*p_pyhome != NUL)
{
/* The string must not change later, make a copy in static memory. */
py_home_buf = (char *)vim_strsave(p_pyhome);
if (py_home_buf != NULL)
Py_SetPythonHome(py_home_buf);
}
#ifdef PYTHON_HOME #ifdef PYTHON_HOME
# ifdef DYNAMIC_PYTHON else if (mch_getenv((char_u *)"PYTHONHOME") == NULL)
if (mch_getenv((char_u *)"PYTHONHOME") == NULL)
# endif
Py_SetPythonHome(PYTHON_HOME); Py_SetPythonHome(PYTHON_HOME);
#endif #endif

View File

@@ -842,6 +842,8 @@ python3_loaded(void)
} }
#endif #endif
static wchar_t *py_home_buf = NULL;
static int static int
Python3_Init(void) Python3_Init(void)
{ {
@@ -857,11 +859,18 @@ Python3_Init(void)
init_structs(); init_structs();
if (*p_py3home != NUL)
{
size_t len = mbstowcs(NULL, (char *)p_py3home, 0) + 1;
/* The string must not change later, make a copy in static memory. */
py_home_buf = (wchar_t *)alloc(len * sizeof(wchar_t));
if (py_home_buf != NULL && mbstowcs(
py_home_buf, (char *)p_py3home, len) != (size_t)-1)
Py_SetPythonHome(py_home_buf);
}
#ifdef PYTHON3_HOME #ifdef PYTHON3_HOME
# ifdef DYNAMIC_PYTHON3 else if (mch_getenv((char_u *)"PYTHONHOME") == NULL)
if (mch_getenv((char_u *)"PYTHONHOME") == NULL)
# endif
Py_SetPythonHome(PYTHON3_HOME); Py_SetPythonHome(PYTHON3_HOME);
#endif #endif

View File

@@ -2246,6 +2246,15 @@ static struct vimoption options[] =
#else #else
(char_u *)NULL, PV_NONE, (char_u *)NULL, PV_NONE,
{(char_u *)NULL, (char_u *)0L} {(char_u *)NULL, (char_u *)0L}
#endif
SCRIPTID_INIT},
{"pythonthreehome", NULL, P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
#if defined(FEAT_PYTHON3)
(char_u *)&p_py3home, PV_NONE,
{(char_u *)"", (char_u *)0L}
#else
(char_u *)NULL, PV_NONE,
{(char_u *)NULL, (char_u *)0L}
#endif #endif
SCRIPTID_INIT}, SCRIPTID_INIT},
{"pythondll", NULL, P_STRING|P_EXPAND|P_VI_DEF|P_SECURE, {"pythondll", NULL, P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
@@ -2255,6 +2264,15 @@ static struct vimoption options[] =
#else #else
(char_u *)NULL, PV_NONE, (char_u *)NULL, PV_NONE,
{(char_u *)NULL, (char_u *)0L} {(char_u *)NULL, (char_u *)0L}
#endif
SCRIPTID_INIT},
{"pythonhome", NULL, P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
#if defined(FEAT_PYTHON)
(char_u *)&p_pyhome, PV_NONE,
{(char_u *)"", (char_u *)0L}
#else
(char_u *)NULL, PV_NONE,
{(char_u *)NULL, (char_u *)0L}
#endif #endif
SCRIPTID_INIT}, SCRIPTID_INIT},
{"pyxversion", "pyx", P_NUM|P_VI_DEF|P_SECURE, {"pyxversion", "pyx", P_NUM|P_VI_DEF|P_SECURE,

View File

@@ -696,9 +696,15 @@ EXTERN char_u *p_perldll; /* 'perldll' */
#if defined(DYNAMIC_PYTHON3) #if defined(DYNAMIC_PYTHON3)
EXTERN char_u *p_py3dll; /* 'pythonthreedll' */ EXTERN char_u *p_py3dll; /* 'pythonthreedll' */
#endif #endif
#ifdef FEAT_PYTHON3
EXTERN char_u *p_py3home; /* 'pythonthreehome' */
#endif
#if defined(DYNAMIC_PYTHON) #if defined(DYNAMIC_PYTHON)
EXTERN char_u *p_pydll; /* 'pythondll' */ EXTERN char_u *p_pydll; /* 'pythondll' */
#endif #endif
#ifdef FEAT_PYTHON
EXTERN char_u *p_pyhome; /* 'pythonhome' */
#endif
#if defined(FEAT_PYTHON) || defined(FEAT_PYTHON3) #if defined(FEAT_PYTHON) || defined(FEAT_PYTHON3)
EXTERN long p_pyx; /* 'pyxversion' */ EXTERN long p_pyx; /* 'pyxversion' */
#endif #endif

View File

@@ -771,6 +771,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1451,
/**/ /**/
1450, 1450,
/**/ /**/