diff options
author | Munif Tanjim <hello@muniftanjim.dev> | 2022-12-19 22:33:47 +0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-12-19 09:33:47 -0700 |
commit | 23d8f5b870ab2a12882ba20e32d24b31c137f6a9 (patch) | |
tree | 1b750709ab3b152f23044ad967893ba6e8d7081d | |
parent | f4d8e992bfcd6e9d0097b9d7a022060bd32f2069 (diff) | |
download | rneovim-23d8f5b870ab2a12882ba20e32d24b31c137f6a9.tar.gz rneovim-23d8f5b870ab2a12882ba20e32d24b31c137f6a9.tar.bz2 rneovim-23d8f5b870ab2a12882ba20e32d24b31c137f6a9.zip |
feat(exrc): support .nvim.lua (#21436)
-rw-r--r-- | runtime/doc/news.txt | 1 | ||||
-rw-r--r-- | runtime/doc/options.txt | 2 | ||||
-rw-r--r-- | runtime/doc/quickref.txt | 2 | ||||
-rw-r--r-- | runtime/doc/starting.txt | 9 | ||||
-rw-r--r-- | runtime/doc/vim_diff.txt | 4 | ||||
-rw-r--r-- | src/nvim/globals.h | 4 | ||||
-rw-r--r-- | src/nvim/main.c | 51 |
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)"); |