aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMunif Tanjim <hello@muniftanjim.dev>2022-12-19 22:33:47 +0600
committerGitHub <noreply@github.com>2022-12-19 09:33:47 -0700
commit23d8f5b870ab2a12882ba20e32d24b31c137f6a9 (patch)
tree1b750709ab3b152f23044ad967893ba6e8d7081d
parentf4d8e992bfcd6e9d0097b9d7a022060bd32f2069 (diff)
downloadrneovim-23d8f5b870ab2a12882ba20e32d24b31c137f6a9.tar.gz
rneovim-23d8f5b870ab2a12882ba20e32d24b31c137f6a9.tar.bz2
rneovim-23d8f5b870ab2a12882ba20e32d24b31c137f6a9.zip
feat(exrc): support .nvim.lua (#21436)
-rw-r--r--runtime/doc/news.txt1
-rw-r--r--runtime/doc/options.txt2
-rw-r--r--runtime/doc/quickref.txt2
-rw-r--r--runtime/doc/starting.txt9
-rw-r--r--runtime/doc/vim_diff.txt4
-rw-r--r--src/nvim/globals.h4
-rw-r--r--src/nvim/main.c51
7 files changed, 50 insertions, 23 deletions
diff --git a/runtime/doc/news.txt b/runtime/doc/news.txt
index e5336edb5a..013089acc7 100644
--- a/runtime/doc/news.txt
+++ b/runtime/doc/news.txt
@@ -98,6 +98,7 @@ CHANGED FEATURES *news-changes*
The following changes to existing APIs or features add new behavior.
+• 'exrc' now supports `.nvim.lua` file.
• 'exrc' is no longer marked deprecated.
==============================================================================
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
index b6eb7c57e8..c3bec5a0c1 100644
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -2267,7 +2267,7 @@ A jump table for the options with a short description can be found at |Q_op|.
*'exrc'* *'ex'* *'noexrc'* *'noex'*
'exrc' 'ex' boolean (default off)
global
- Enables the reading of .nvimrc and .exrc files in the current
+ Enables the reading of .nvim.lua, .nvimrc, and .exrc files in the current
directory.
The file is only sourced if the user indicates the file is trusted. If
diff --git a/runtime/doc/quickref.txt b/runtime/doc/quickref.txt
index 62e7d4c931..5f5ca2af2c 100644
--- a/runtime/doc/quickref.txt
+++ b/runtime/doc/quickref.txt
@@ -698,7 +698,7 @@ Short explanation of each option: *option-list*
'errorformat' 'efm' description of the lines in the error file
'eventignore' 'ei' autocommand events that are ignored
'expandtab' 'et' use spaces when <Tab> is inserted
-'exrc' 'ex' read .nvimrc and .exrc in the current directory
+'exrc' 'ex' read init files in the current directory
'fileencoding' 'fenc' file encoding for multibyte text
'fileencodings' 'fencs' automatically detected character encodings
'fileformat' 'ff' file format used for file I/O
diff --git a/runtime/doc/starting.txt b/runtime/doc/starting.txt
index 14543b0a27..1a7b73601e 100644
--- a/runtime/doc/starting.txt
+++ b/runtime/doc/starting.txt
@@ -453,10 +453,11 @@ accordingly, proceeding as follows:
set or when using $VIMINIT.
c. If the 'exrc' option is on (which is NOT the default), the current
- directory is searched for two files. The first that exists is used,
- the others are ignored.
- - The file ".nvimrc"
- - The file ".exrc"
+ directory is searched for the following files, in order of precedence:
+ - ".nvim.lua"
+ - ".nvimrc"
+ - ".exrc"
+ The first that exists is used, the others are ignored.
8. Enable filetype detection.
This does the same as the command: >
diff --git a/runtime/doc/vim_diff.txt b/runtime/doc/vim_diff.txt
index 229ed95826..46d620e461 100644
--- a/runtime/doc/vim_diff.txt
+++ b/runtime/doc/vim_diff.txt
@@ -434,8 +434,8 @@ Options:
'jumpoptions' "view" tries to restore the |mark-view| when moving through
the |jumplist|, |changelist|, |alternate-file| or using |mark-motions|.
'shortmess' the "F" flag does not affect output from autocommands
- 'exrc' searches for ".nvimrc" or ".exrc" files. The user is prompted whether
- to trust the file.
+ 'exrc' searches for ".nvim.lua", ".nvimrc", or ".exrc" files. The user is
+ prompted whether to trust the file.
Shell:
Shell output (|:!|, |:make|, …) is always routed through the UI, so it
diff --git a/src/nvim/globals.h b/src/nvim/globals.h
index 0169b62188..bce81b376b 100644
--- a/src/nvim/globals.h
+++ b/src/nvim/globals.h
@@ -75,6 +75,10 @@
# define VIMRC_FILE ".nvimrc"
#endif
+#ifndef VIMRC_LUA_FILE
+# define VIMRC_LUA_FILE ".nvim.lua"
+#endif
+
EXTERN struct nvim_stats_s {
int64_t fsync;
int64_t redraw;
diff --git a/src/nvim/main.c b/src/nvim/main.c
index 29d50801bb..a7f07af1a8 100644
--- a/src/nvim/main.c
+++ b/src/nvim/main.c
@@ -1987,6 +1987,41 @@ static bool do_user_initialization(void)
return do_exrc;
}
+// Read initialization commands from ".nvim.lua", ".nvimrc", or ".exrc" in
+// current directory. This is only done if the 'exrc' option is set.
+// Only do this if VIMRC_FILE is not the same as vimrc file sourced in
+// do_user_initialization.
+static void do_exrc_initialization(void)
+{
+ char *str;
+
+ if (os_path_exists(VIMRC_LUA_FILE)) {
+ str = nlua_read_secure(VIMRC_LUA_FILE);
+ if (str != NULL) {
+ Error err = ERROR_INIT;
+ nlua_exec(cstr_as_string(str), (Array)ARRAY_DICT_INIT, &err);
+ xfree(str);
+ if (ERROR_SET(&err)) {
+ semsg("Error detected while processing %s:", VIMRC_LUA_FILE);
+ semsg_multiline(err.msg);
+ api_clear_error(&err);
+ }
+ }
+ } else if (os_path_exists(VIMRC_FILE)) {
+ str = nlua_read_secure(VIMRC_FILE);
+ if (str != NULL) {
+ do_source_str(str, VIMRC_FILE);
+ xfree(str);
+ }
+ } else if (os_path_exists(EXRC_FILE)) {
+ str = nlua_read_secure(EXRC_FILE);
+ if (str != NULL) {
+ do_source_str(str, EXRC_FILE);
+ xfree(str);
+ }
+ }
+}
+
/// Source startup scripts
static void source_startup_scripts(const mparm_T *const parmp)
FUNC_ATTR_NONNULL_ALL
@@ -2005,21 +2040,7 @@ static void source_startup_scripts(const mparm_T *const parmp)
do_system_initialization();
if (do_user_initialization()) {
- // Read initialization commands from ".nvimrc" or ".exrc" in current
- // directory. This is only done if the 'exrc' option is set.
- // Only do this if VIMRC_FILE is not the same as vimrc file sourced in
- // do_user_initialization.
- char *str = nlua_read_secure(VIMRC_FILE);
- if (str != NULL) {
- do_source_str(str, VIMRC_FILE);
- xfree(str);
- } else {
- str = nlua_read_secure(EXRC_FILE);
- if (str != NULL) {
- do_source_str(str, EXRC_FILE);
- xfree(str);
- }
- }
+ do_exrc_initialization();
}
}
TIME_MSG("sourcing vimrc file(s)");