mirror of
https://github.com/neovim/neovim.git
synced 2025-10-04 00:46:30 +00:00
Merge pull request #12235 from dm1try/add_init_lua
add init.lua as an alternative user config
This commit is contained in:
@@ -927,7 +927,7 @@ void nlua_typval_eval(const String str, typval_T *const arg,
|
||||
memcpy(lcmd + sizeof(EVALHEADER) - 1, str.data, str.size);
|
||||
lcmd[lcmd_len - 1] = ')';
|
||||
#undef EVALHEADER
|
||||
typval_exec_lua(lcmd, lcmd_len, "luaeval()", arg, 1, true, ret_tv);
|
||||
nlua_typval_exec(lcmd, lcmd_len, "luaeval()", arg, 1, true, ret_tv);
|
||||
|
||||
if (lcmd != (char *)IObuff) {
|
||||
xfree(lcmd);
|
||||
@@ -954,16 +954,16 @@ void nlua_typval_call(const char *str, size_t len, typval_T *const args,
|
||||
#undef CALLHEADER
|
||||
#undef CALLSUFFIX
|
||||
|
||||
typval_exec_lua(lcmd, lcmd_len, "v:lua", args, argcount, false, ret_tv);
|
||||
nlua_typval_exec(lcmd, lcmd_len, "v:lua", args, argcount, false, ret_tv);
|
||||
|
||||
if (lcmd != (char *)IObuff) {
|
||||
xfree(lcmd);
|
||||
}
|
||||
}
|
||||
|
||||
static void typval_exec_lua(const char *lcmd, size_t lcmd_len, const char *name,
|
||||
typval_T *const args, int argcount, bool special,
|
||||
typval_T *ret_tv)
|
||||
static void nlua_typval_exec(const char *lcmd, size_t lcmd_len,
|
||||
const char *name, typval_T *const args,
|
||||
int argcount, bool special, typval_T *ret_tv)
|
||||
{
|
||||
if (check_secure()) {
|
||||
if (ret_tv) {
|
||||
@@ -1140,7 +1140,7 @@ void ex_lua(exarg_T *const eap)
|
||||
xfree(code);
|
||||
return;
|
||||
}
|
||||
typval_exec_lua(code, len, ":lua", NULL, 0, false, NULL);
|
||||
nlua_typval_exec(code, len, ":lua", NULL, 0, false, NULL);
|
||||
|
||||
xfree(code);
|
||||
}
|
||||
@@ -1230,18 +1230,31 @@ void ex_luado(exarg_T *const eap)
|
||||
/// @param eap VimL command being run.
|
||||
void ex_luafile(exarg_T *const eap)
|
||||
FUNC_ATTR_NONNULL_ALL
|
||||
{
|
||||
nlua_exec_file((const char *)eap->arg);
|
||||
}
|
||||
|
||||
/// execute lua code from a file.
|
||||
///
|
||||
/// @param path path of the file
|
||||
///
|
||||
/// @return true if everything ok, false if there was an error (echoed)
|
||||
bool nlua_exec_file(const char *path)
|
||||
FUNC_ATTR_NONNULL_ALL
|
||||
{
|
||||
lua_State *const lstate = nlua_enter();
|
||||
|
||||
if (luaL_loadfile(lstate, (const char *)eap->arg)) {
|
||||
if (luaL_loadfile(lstate, path)) {
|
||||
nlua_error(lstate, _("E5112: Error while creating lua chunk: %.*s"));
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (lua_pcall(lstate, 0, 0, 0)) {
|
||||
nlua_error(lstate, _("E5113: Error while calling lua chunk: %.*s"));
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void nlua_add_treesitter(lua_State *const lstate) FUNC_ATTR_NONNULL_ALL
|
||||
|
@@ -1069,9 +1069,14 @@ static void command_line_scan(mparm_T *parmp)
|
||||
} else {
|
||||
a = argv[0];
|
||||
}
|
||||
size_t s_size = STRLEN(a) + 4;
|
||||
|
||||
size_t s_size = STRLEN(a) + 9;
|
||||
char *s = xmalloc(s_size);
|
||||
snprintf(s, s_size, "so %s", a);
|
||||
if (path_with_extension(a, "lua")) {
|
||||
snprintf(s, s_size, "luafile %s", a);
|
||||
} else {
|
||||
snprintf(s, s_size, "so %s", a);
|
||||
}
|
||||
parmp->cmds_tofree[parmp->n_commands] = true;
|
||||
parmp->commands[parmp->n_commands++] = s;
|
||||
} else {
|
||||
@@ -1770,6 +1775,23 @@ static bool do_user_initialization(void)
|
||||
do_exrc = p_exrc;
|
||||
return do_exrc;
|
||||
}
|
||||
|
||||
char_u *init_lua_path = (char_u *)stdpaths_user_conf_subpath("init.lua");
|
||||
if (os_path_exists(init_lua_path)
|
||||
&& nlua_exec_file((const char *)init_lua_path)) {
|
||||
os_setenv("MYVIMRC", (const char *)init_lua_path, 1);
|
||||
char_u *vimrc_path = (char_u *)stdpaths_user_conf_subpath("init.vim");
|
||||
|
||||
if (os_path_exists(vimrc_path)) {
|
||||
EMSG3(_("Conflicting configs: \"%s\" \"%s\""), init_lua_path, vimrc_path);
|
||||
}
|
||||
|
||||
xfree(vimrc_path);
|
||||
xfree(init_lua_path);
|
||||
return false;
|
||||
}
|
||||
xfree(init_lua_path);
|
||||
|
||||
char_u *user_vimrc = (char_u *)stdpaths_user_conf_subpath("init.vim");
|
||||
if (do_source(user_vimrc, true, DOSO_VIMRC) != FAIL) {
|
||||
do_exrc = p_exrc;
|
||||
@@ -1829,8 +1851,12 @@ static void source_startup_scripts(const mparm_T *const parmp)
|
||||
|| strequal(parmp->use_vimrc, "NORC")) {
|
||||
// Do nothing.
|
||||
} else {
|
||||
if (do_source((char_u *)parmp->use_vimrc, false, DOSO_NONE) != OK) {
|
||||
EMSG2(_("E282: Cannot read from \"%s\""), parmp->use_vimrc);
|
||||
if (path_with_extension(parmp->use_vimrc, "lua")) {
|
||||
nlua_exec_file(parmp->use_vimrc);
|
||||
} else {
|
||||
if (do_source((char_u *)parmp->use_vimrc, false, DOSO_NONE) != OK) {
|
||||
EMSG2(_("E282: Cannot read from \"%s\""), parmp->use_vimrc);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (!silent_mode) {
|
||||
|
@@ -1704,6 +1704,13 @@ int path_with_url(const char *fname)
|
||||
return path_is_url(p);
|
||||
}
|
||||
|
||||
bool path_with_extension(const char *path, const char *extension)
|
||||
{
|
||||
const char *last_dot = strrchr(path, '.');
|
||||
if (!last_dot) { return false; }
|
||||
return strcmp(last_dot + 1, extension) == 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Return TRUE if "name" is a full (absolute) path name or URL.
|
||||
*/
|
||||
|
Reference in New Issue
Block a user