# HG changeset patch # User Christian Brabandt # Date 1517432407 -3600 # Node ID 53cc7ea77c541913db0a528f82dfbf885e87b8c2 # Parent c30f721849cb6bb327d25cbccafed6b7d27a21d4 patch 8.0.1451: difficult to set the python home directories properly commit https://github.com/vim/vim/commit/94073167e3aa8cbe18380e93a2fc8e8165438cc8 Author: Bram Moolenaar Date: Wed Jan 31 21:49:05 2018 +0100 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) diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -5967,6 +5967,20 @@ A jump table for the options with a shor 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. + *'pythonthreedll'* 'pythonthreedll' string (default depends on the build) global @@ -5979,6 +5993,20 @@ A jump table for the options with a shor 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. + *'pyxversion'* *'pyx'* 'pyxversion' 'pyx' number (default depends on the build) global diff --git a/runtime/doc/quickref.txt b/runtime/doc/quickref.txt --- a/runtime/doc/quickref.txt +++ b/runtime/doc/quickref.txt @@ -839,7 +839,9 @@ Short explanation of each option: *opti 'prompt' 'prompt' enable prompt in Ex mode 'pumheight' 'ph' maximum height of the popup menu 'pythondll' name of the Python 2 dynamic library +'pythonhome' name of the Python 2 home directory 'pythonthreedll' name of the Python 3 dynamic library +'pythonthreehome' name of the Python 3 home directory 'pyxversion' 'pyx' Python version used for pyx* commands 'quoteescape' 'qe' escape characters used in a string 'readonly' 'ro' disallow writing the buffer diff --git a/runtime/optwin.vim b/runtime/optwin.vim --- a/runtime/optwin.vim +++ b/runtime/optwin.vim @@ -1354,10 +1354,18 @@ if exists("&pythondll") call append("$", "pythondll\tname of the Python 2 dynamic library") call OptionG("pythondll", &pythondll) endif +if exists("&pythonhome") + call append("$", "pythonhome\tname of the Python 2 home directory") + call OptionG("pythonhome", &pythonhome) +endif if exists("&pythonthreedll") call append("$", "pythonthreedll\tname of the Python 3 dynamic library") call OptionG("pythonthreedll", &pythonthreedll) endif +if exists("&pythonthreehome") + call append("$", "pythonthreehome\tname of the Python 3 home directory") + call OptionG("pythonthreehome", &pythonthreehome) +endif if exists("&rubydll") call append("$", "rubydll\tname of the Ruby dynamic library") call OptionG("rubydll", &rubydll) diff --git a/src/if_python.c b/src/if_python.c --- a/src/if_python.c +++ b/src/if_python.c @@ -912,6 +912,8 @@ python_loaded(void) } #endif +static char *py_home_buf = NULL; + static int Python_Init(void) { @@ -929,10 +931,15 @@ Python_Init(void) } #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 DYNAMIC_PYTHON - if (mch_getenv((char_u *)"PYTHONHOME") == NULL) -# endif + else if (mch_getenv((char_u *)"PYTHONHOME") == NULL) Py_SetPythonHome(PYTHON_HOME); #endif diff --git a/src/if_python3.c b/src/if_python3.c --- a/src/if_python3.c +++ b/src/if_python3.c @@ -842,6 +842,8 @@ python3_loaded(void) } #endif +static wchar_t *py_home_buf = NULL; + static int Python3_Init(void) { @@ -857,11 +859,18 @@ Python3_Init(void) 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 DYNAMIC_PYTHON3 - if (mch_getenv((char_u *)"PYTHONHOME") == NULL) -# endif + else if (mch_getenv((char_u *)"PYTHONHOME") == NULL) Py_SetPythonHome(PYTHON3_HOME); #endif diff --git a/src/option.c b/src/option.c --- a/src/option.c +++ b/src/option.c @@ -2248,6 +2248,15 @@ static struct vimoption options[] = {(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 + SCRIPTID_INIT}, {"pythondll", NULL, P_STRING|P_EXPAND|P_VI_DEF|P_SECURE, #if defined(DYNAMIC_PYTHON) (char_u *)&p_pydll, PV_NONE, @@ -2257,6 +2266,15 @@ static struct vimoption options[] = {(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 + SCRIPTID_INIT}, {"pyxversion", "pyx", P_NUM|P_VI_DEF|P_SECURE, #if defined(FEAT_PYTHON) || defined(FEAT_PYTHON3) (char_u *)&p_pyx, PV_NONE, diff --git a/src/option.h b/src/option.h --- a/src/option.h +++ b/src/option.h @@ -696,9 +696,15 @@ EXTERN char_u *p_perldll; /* 'perldll' * #if defined(DYNAMIC_PYTHON3) EXTERN char_u *p_py3dll; /* 'pythonthreedll' */ #endif +#ifdef FEAT_PYTHON3 +EXTERN char_u *p_py3home; /* 'pythonthreehome' */ +#endif #if defined(DYNAMIC_PYTHON) EXTERN char_u *p_pydll; /* 'pythondll' */ #endif +#ifdef FEAT_PYTHON +EXTERN char_u *p_pyhome; /* 'pythonhome' */ +#endif #if defined(FEAT_PYTHON) || defined(FEAT_PYTHON3) EXTERN long p_pyx; /* 'pyxversion' */ #endif diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -772,6 +772,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1451, +/**/ 1450, /**/ 1449,