env: try find library dir (like /usr[/local]/lib/nvim) and add it to &rtp
This commit is contained in:
parent
7ce9a5c7da
commit
c5b812c9ea
|
@ -3,5 +3,6 @@
|
||||||
#include "${PROJECT_SOURCE_DIR}/src/nvim/vim.h"
|
#include "${PROJECT_SOURCE_DIR}/src/nvim/vim.h"
|
||||||
char *default_vim_dir = "${CMAKE_INSTALL_FULL_DATAROOTDIR}/nvim";
|
char *default_vim_dir = "${CMAKE_INSTALL_FULL_DATAROOTDIR}/nvim";
|
||||||
char *default_vimruntime_dir = "";
|
char *default_vimruntime_dir = "";
|
||||||
|
char *default_lib_dir = "${CMAKE_INSTALL_FULL_LIBDIR}/nvim";
|
||||||
char_u *compiled_user = (char_u *)"${USERNAME}";
|
char_u *compiled_user = (char_u *)"${USERNAME}";
|
||||||
char_u *compiled_sys = (char_u *)"${HOSTNAME}";
|
char_u *compiled_sys = (char_u *)"${HOSTNAME}";
|
||||||
|
|
|
@ -833,6 +833,7 @@ enum {
|
||||||
#ifdef HAVE_PATHDEF
|
#ifdef HAVE_PATHDEF
|
||||||
extern char *default_vim_dir;
|
extern char *default_vim_dir;
|
||||||
extern char *default_vimruntime_dir;
|
extern char *default_vimruntime_dir;
|
||||||
|
extern char *default_lib_dir;
|
||||||
extern char_u *compiled_user;
|
extern char_u *compiled_user;
|
||||||
extern char_u *compiled_sys;
|
extern char_u *compiled_sys;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -498,6 +498,24 @@ static inline char *add_dir(char *dest, const char *const dir,
|
||||||
return dest;
|
return dest;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *get_lib_dir(void)
|
||||||
|
{
|
||||||
|
// TODO(bfredl): too fragile? Ideally default_lib_dir would be made empty
|
||||||
|
// in an appimage build
|
||||||
|
if (strlen(default_lib_dir) != 0
|
||||||
|
&& os_isdir((const char_u *)default_lib_dir)) {
|
||||||
|
return xstrdup(default_lib_dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find library path relative to the nvim binary: ../lib/nvim/
|
||||||
|
char exe_name[MAXPATHL];
|
||||||
|
vim_get_prefix_from_exepath(exe_name);
|
||||||
|
if (append_path(exe_name, "lib" _PATHSEPSTR "nvim", MAXPATHL) == OK) {
|
||||||
|
return xstrdup(exe_name);
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/// Sets &runtimepath to default value.
|
/// Sets &runtimepath to default value.
|
||||||
///
|
///
|
||||||
/// Windows: Uses "…/nvim-data" for kXDGDataHome to avoid storing
|
/// Windows: Uses "…/nvim-data" for kXDGDataHome to avoid storing
|
||||||
|
@ -508,6 +526,7 @@ static void set_runtimepath_default(void)
|
||||||
char *const data_home = stdpaths_get_xdg_var(kXDGDataHome);
|
char *const data_home = stdpaths_get_xdg_var(kXDGDataHome);
|
||||||
char *const config_home = stdpaths_get_xdg_var(kXDGConfigHome);
|
char *const config_home = stdpaths_get_xdg_var(kXDGConfigHome);
|
||||||
char *const vimruntime = vim_getenv("VIMRUNTIME");
|
char *const vimruntime = vim_getenv("VIMRUNTIME");
|
||||||
|
char *const libdir = get_lib_dir();
|
||||||
char *const data_dirs = stdpaths_get_xdg_var(kXDGDataDirs);
|
char *const data_dirs = stdpaths_get_xdg_var(kXDGDataDirs);
|
||||||
char *const config_dirs = stdpaths_get_xdg_var(kXDGConfigDirs);
|
char *const config_dirs = stdpaths_get_xdg_var(kXDGConfigDirs);
|
||||||
#define SITE_SIZE (sizeof("site") - 1)
|
#define SITE_SIZE (sizeof("site") - 1)
|
||||||
|
@ -515,6 +534,7 @@ static void set_runtimepath_default(void)
|
||||||
size_t data_len = 0;
|
size_t data_len = 0;
|
||||||
size_t config_len = 0;
|
size_t config_len = 0;
|
||||||
size_t vimruntime_len = 0;
|
size_t vimruntime_len = 0;
|
||||||
|
size_t libdir_len = 0;
|
||||||
if (data_home != NULL) {
|
if (data_home != NULL) {
|
||||||
data_len = strlen(data_home);
|
data_len = strlen(data_home);
|
||||||
if (data_len != 0) {
|
if (data_len != 0) {
|
||||||
|
@ -544,6 +564,12 @@ static void set_runtimepath_default(void)
|
||||||
rtp_size += vimruntime_len + memcnt(vimruntime, ',', vimruntime_len) + 1;
|
rtp_size += vimruntime_len + memcnt(vimruntime, ',', vimruntime_len) + 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (libdir != NULL) {
|
||||||
|
libdir_len = strlen(libdir);
|
||||||
|
if (libdir_len != 0) {
|
||||||
|
rtp_size += libdir_len + memcnt(libdir, ',', libdir_len) + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
rtp_size += compute_double_colon_len(data_dirs, NVIM_SIZE + 1 + SITE_SIZE + 1,
|
rtp_size += compute_double_colon_len(data_dirs, NVIM_SIZE + 1 + SITE_SIZE + 1,
|
||||||
AFTER_SIZE + 1);
|
AFTER_SIZE + 1);
|
||||||
rtp_size += compute_double_colon_len(config_dirs, NVIM_SIZE + 1,
|
rtp_size += compute_double_colon_len(config_dirs, NVIM_SIZE + 1,
|
||||||
|
@ -562,6 +588,7 @@ static void set_runtimepath_default(void)
|
||||||
true);
|
true);
|
||||||
rtp_cur = add_dir(rtp_cur, vimruntime, vimruntime_len, kXDGNone,
|
rtp_cur = add_dir(rtp_cur, vimruntime, vimruntime_len, kXDGNone,
|
||||||
NULL, 0, NULL, 0);
|
NULL, 0, NULL, 0);
|
||||||
|
rtp_cur = add_dir(rtp_cur, libdir, libdir_len, kXDGNone, NULL, 0, NULL, 0);
|
||||||
rtp_cur = add_colon_dirs(rtp_cur, data_dirs, "site", SITE_SIZE,
|
rtp_cur = add_colon_dirs(rtp_cur, data_dirs, "site", SITE_SIZE,
|
||||||
"after", AFTER_SIZE, false);
|
"after", AFTER_SIZE, false);
|
||||||
rtp_cur = add_dir(rtp_cur, data_home, data_len, kXDGDataHome,
|
rtp_cur = add_dir(rtp_cur, data_home, data_len, kXDGDataHome,
|
||||||
|
@ -583,6 +610,7 @@ static void set_runtimepath_default(void)
|
||||||
xfree(data_home);
|
xfree(data_home);
|
||||||
xfree(config_home);
|
xfree(config_home);
|
||||||
xfree(vimruntime);
|
xfree(vimruntime);
|
||||||
|
xfree(libdir);
|
||||||
}
|
}
|
||||||
|
|
||||||
#undef NVIM_SIZE
|
#undef NVIM_SIZE
|
||||||
|
|
|
@ -847,6 +847,20 @@ const void *vim_env_iter_rev(const char delim,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// @param[out] exe_name should be at least MAXPATHL in size
|
||||||
|
void vim_get_prefix_from_exepath(char *exe_name)
|
||||||
|
{
|
||||||
|
// TODO(bfredl): param could have been written as "char exe_name[MAXPATHL]"
|
||||||
|
// but c_grammar.lua does not recognize it (yet).
|
||||||
|
xstrlcpy(exe_name, (char *)get_vim_var_str(VV_PROGPATH),
|
||||||
|
MAXPATHL * sizeof(*exe_name));
|
||||||
|
char *path_end = (char *)path_tail_with_sep((char_u *)exe_name);
|
||||||
|
*path_end = '\0'; // remove the trailing "nvim.exe"
|
||||||
|
path_end = (char *)path_tail((char_u *)exe_name);
|
||||||
|
*path_end = '\0'; // remove the trailing "bin/"
|
||||||
|
}
|
||||||
|
|
||||||
/// Vim getenv() wrapper with special handling of $HOME, $VIM, $VIMRUNTIME,
|
/// Vim getenv() wrapper with special handling of $HOME, $VIM, $VIMRUNTIME,
|
||||||
/// allowing the user to override the Nvim runtime directory at runtime.
|
/// allowing the user to override the Nvim runtime directory at runtime.
|
||||||
/// Result must be freed by the caller.
|
/// Result must be freed by the caller.
|
||||||
|
@ -902,12 +916,7 @@ char *vim_getenv(const char *name)
|
||||||
char exe_name[MAXPATHL];
|
char exe_name[MAXPATHL];
|
||||||
// Find runtime path relative to the nvim binary: ../share/nvim/runtime
|
// Find runtime path relative to the nvim binary: ../share/nvim/runtime
|
||||||
if (vim_path == NULL) {
|
if (vim_path == NULL) {
|
||||||
xstrlcpy(exe_name, (char *)get_vim_var_str(VV_PROGPATH),
|
vim_get_prefix_from_exepath(exe_name);
|
||||||
sizeof(exe_name));
|
|
||||||
char *path_end = (char *)path_tail_with_sep((char_u *)exe_name);
|
|
||||||
*path_end = '\0'; // remove the trailing "nvim.exe"
|
|
||||||
path_end = (char *)path_tail((char_u *)exe_name);
|
|
||||||
*path_end = '\0'; // remove the trailing "bin/"
|
|
||||||
if (append_path(
|
if (append_path(
|
||||||
exe_name,
|
exe_name,
|
||||||
"share" _PATHSEPSTR "nvim" _PATHSEPSTR "runtime" _PATHSEPSTR,
|
"share" _PATHSEPSTR "nvim" _PATHSEPSTR "runtime" _PATHSEPSTR,
|
||||||
|
|
|
@ -293,6 +293,12 @@ describe('XDG-based defaults', function()
|
||||||
-- TODO(jkeyes): tests below fail on win32 because of path separator.
|
-- TODO(jkeyes): tests below fail on win32 because of path separator.
|
||||||
if helpers.pending_win32(pending) then return end
|
if helpers.pending_win32(pending) then return end
|
||||||
|
|
||||||
|
local function vimruntime_and_libdir()
|
||||||
|
local vimruntime = eval('$VIMRUNTIME')
|
||||||
|
local libdir = string.gsub(vimruntime, "share/nvim/runtime$", "lib/nvim")
|
||||||
|
return vimruntime, libdir
|
||||||
|
end
|
||||||
|
|
||||||
describe('with too long XDG variables', function()
|
describe('with too long XDG variables', function()
|
||||||
before_each(function()
|
before_each(function()
|
||||||
clear({env={
|
clear({env={
|
||||||
|
@ -308,6 +314,8 @@ describe('XDG-based defaults', function()
|
||||||
end)
|
end)
|
||||||
|
|
||||||
it('are correctly set', function()
|
it('are correctly set', function()
|
||||||
|
local vimruntime, libdir = vimruntime_and_libdir()
|
||||||
|
|
||||||
eq((('/x'):rep(4096) .. '/nvim'
|
eq((('/x'):rep(4096) .. '/nvim'
|
||||||
.. ',' .. ('/a'):rep(2048) .. '/nvim'
|
.. ',' .. ('/a'):rep(2048) .. '/nvim'
|
||||||
.. ',' .. ('/b'):rep(2048) .. '/nvim'
|
.. ',' .. ('/b'):rep(2048) .. '/nvim'
|
||||||
|
@ -316,7 +324,8 @@ describe('XDG-based defaults', function()
|
||||||
.. ',' .. ('/A'):rep(2048) .. '/nvim/site'
|
.. ',' .. ('/A'):rep(2048) .. '/nvim/site'
|
||||||
.. ',' .. ('/B'):rep(2048) .. '/nvim/site'
|
.. ',' .. ('/B'):rep(2048) .. '/nvim/site'
|
||||||
.. (',' .. '/C/nvim/site'):rep(512)
|
.. (',' .. '/C/nvim/site'):rep(512)
|
||||||
.. ',' .. eval('$VIMRUNTIME')
|
.. ',' .. vimruntime
|
||||||
|
.. ',' .. libdir
|
||||||
.. (',' .. '/C/nvim/site/after'):rep(512)
|
.. (',' .. '/C/nvim/site/after'):rep(512)
|
||||||
.. ',' .. ('/B'):rep(2048) .. '/nvim/site/after'
|
.. ',' .. ('/B'):rep(2048) .. '/nvim/site/after'
|
||||||
.. ',' .. ('/A'):rep(2048) .. '/nvim/site/after'
|
.. ',' .. ('/A'):rep(2048) .. '/nvim/site/after'
|
||||||
|
@ -339,7 +348,8 @@ describe('XDG-based defaults', function()
|
||||||
.. ',' .. ('/A'):rep(2048) .. '/nvim/site'
|
.. ',' .. ('/A'):rep(2048) .. '/nvim/site'
|
||||||
.. ',' .. ('/B'):rep(2048) .. '/nvim/site'
|
.. ',' .. ('/B'):rep(2048) .. '/nvim/site'
|
||||||
.. (',' .. '/C/nvim/site'):rep(512)
|
.. (',' .. '/C/nvim/site'):rep(512)
|
||||||
.. ',' .. eval('$VIMRUNTIME')
|
.. ',' .. vimruntime
|
||||||
|
.. ',' .. libdir
|
||||||
.. (',' .. '/C/nvim/site/after'):rep(512)
|
.. (',' .. '/C/nvim/site/after'):rep(512)
|
||||||
.. ',' .. ('/B'):rep(2048) .. '/nvim/site/after'
|
.. ',' .. ('/B'):rep(2048) .. '/nvim/site/after'
|
||||||
.. ',' .. ('/A'):rep(2048) .. '/nvim/site/after'
|
.. ',' .. ('/A'):rep(2048) .. '/nvim/site/after'
|
||||||
|
@ -368,11 +378,13 @@ describe('XDG-based defaults', function()
|
||||||
end)
|
end)
|
||||||
|
|
||||||
it('are not expanded', function()
|
it('are not expanded', function()
|
||||||
|
local vimruntime, libdir = vimruntime_and_libdir()
|
||||||
eq(('$XDG_DATA_HOME/nvim'
|
eq(('$XDG_DATA_HOME/nvim'
|
||||||
.. ',$XDG_DATA_DIRS/nvim'
|
.. ',$XDG_DATA_DIRS/nvim'
|
||||||
.. ',$XDG_CONFIG_HOME/nvim/site'
|
.. ',$XDG_CONFIG_HOME/nvim/site'
|
||||||
.. ',$XDG_CONFIG_DIRS/nvim/site'
|
.. ',$XDG_CONFIG_DIRS/nvim/site'
|
||||||
.. ',' .. eval('$VIMRUNTIME')
|
.. ',' .. vimruntime
|
||||||
|
.. ',' .. libdir
|
||||||
.. ',$XDG_CONFIG_DIRS/nvim/site/after'
|
.. ',$XDG_CONFIG_DIRS/nvim/site/after'
|
||||||
.. ',$XDG_CONFIG_HOME/nvim/site/after'
|
.. ',$XDG_CONFIG_HOME/nvim/site/after'
|
||||||
.. ',$XDG_DATA_DIRS/nvim/after'
|
.. ',$XDG_DATA_DIRS/nvim/after'
|
||||||
|
@ -387,7 +399,8 @@ describe('XDG-based defaults', function()
|
||||||
.. ',$XDG_DATA_DIRS/nvim'
|
.. ',$XDG_DATA_DIRS/nvim'
|
||||||
.. ',$XDG_CONFIG_HOME/nvim/site'
|
.. ',$XDG_CONFIG_HOME/nvim/site'
|
||||||
.. ',$XDG_CONFIG_DIRS/nvim/site'
|
.. ',$XDG_CONFIG_DIRS/nvim/site'
|
||||||
.. ',' .. eval('$VIMRUNTIME')
|
.. ',' .. vimruntime
|
||||||
|
.. ',' .. libdir
|
||||||
.. ',$XDG_CONFIG_DIRS/nvim/site/after'
|
.. ',$XDG_CONFIG_DIRS/nvim/site/after'
|
||||||
.. ',$XDG_CONFIG_HOME/nvim/site/after'
|
.. ',$XDG_CONFIG_HOME/nvim/site/after'
|
||||||
.. ',$XDG_DATA_DIRS/nvim/after'
|
.. ',$XDG_DATA_DIRS/nvim/after'
|
||||||
|
@ -402,7 +415,8 @@ describe('XDG-based defaults', function()
|
||||||
.. ',$XDG_DATA_DIRS/nvim'
|
.. ',$XDG_DATA_DIRS/nvim'
|
||||||
.. ',$XDG_CONFIG_HOME/nvim/site'
|
.. ',$XDG_CONFIG_HOME/nvim/site'
|
||||||
.. ',$XDG_CONFIG_DIRS/nvim/site'
|
.. ',$XDG_CONFIG_DIRS/nvim/site'
|
||||||
.. ',' .. eval('$VIMRUNTIME')
|
.. ',' .. vimruntime
|
||||||
|
.. ',' .. libdir
|
||||||
.. ',$XDG_CONFIG_DIRS/nvim/site/after'
|
.. ',$XDG_CONFIG_DIRS/nvim/site/after'
|
||||||
.. ',$XDG_CONFIG_HOME/nvim/site/after'
|
.. ',$XDG_CONFIG_HOME/nvim/site/after'
|
||||||
.. ',$XDG_DATA_DIRS/nvim/after'
|
.. ',$XDG_DATA_DIRS/nvim/after'
|
||||||
|
@ -426,13 +440,15 @@ describe('XDG-based defaults', function()
|
||||||
end)
|
end)
|
||||||
|
|
||||||
it('are escaped properly', function()
|
it('are escaped properly', function()
|
||||||
|
local vimruntime, libdir = vimruntime_and_libdir()
|
||||||
eq(('\\, \\, \\,/nvim'
|
eq(('\\, \\, \\,/nvim'
|
||||||
.. ',\\,-\\,-\\,/nvim'
|
.. ',\\,-\\,-\\,/nvim'
|
||||||
.. ',-\\,-\\,-/nvim'
|
.. ',-\\,-\\,-/nvim'
|
||||||
.. ',\\,=\\,=\\,/nvim/site'
|
.. ',\\,=\\,=\\,/nvim/site'
|
||||||
.. ',\\,≡\\,≡\\,/nvim/site'
|
.. ',\\,≡\\,≡\\,/nvim/site'
|
||||||
.. ',≡\\,≡\\,≡/nvim/site'
|
.. ',≡\\,≡\\,≡/nvim/site'
|
||||||
.. ',' .. eval('$VIMRUNTIME')
|
.. ',' .. vimruntime
|
||||||
|
.. ',' .. libdir
|
||||||
.. ',≡\\,≡\\,≡/nvim/site/after'
|
.. ',≡\\,≡\\,≡/nvim/site/after'
|
||||||
.. ',\\,≡\\,≡\\,/nvim/site/after'
|
.. ',\\,≡\\,≡\\,/nvim/site/after'
|
||||||
.. ',\\,=\\,=\\,/nvim/site/after'
|
.. ',\\,=\\,=\\,/nvim/site/after'
|
||||||
|
@ -451,7 +467,8 @@ describe('XDG-based defaults', function()
|
||||||
.. ',\\,=\\,=\\,/nvim/site'
|
.. ',\\,=\\,=\\,/nvim/site'
|
||||||
.. ',\\,≡\\,≡\\,/nvim/site'
|
.. ',\\,≡\\,≡\\,/nvim/site'
|
||||||
.. ',≡\\,≡\\,≡/nvim/site'
|
.. ',≡\\,≡\\,≡/nvim/site'
|
||||||
.. ',' .. eval('$VIMRUNTIME')
|
.. ',' .. vimruntime
|
||||||
|
.. ',' .. libdir
|
||||||
.. ',≡\\,≡\\,≡/nvim/site/after'
|
.. ',≡\\,≡\\,≡/nvim/site/after'
|
||||||
.. ',\\,≡\\,≡\\,/nvim/site/after'
|
.. ',\\,≡\\,≡\\,/nvim/site/after'
|
||||||
.. ',\\,=\\,=\\,/nvim/site/after'
|
.. ',\\,=\\,=\\,/nvim/site/after'
|
||||||
|
|
Loading…
Reference in New Issue