aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nvim/main.c')
-rw-r--r--src/nvim/main.c211
1 files changed, 105 insertions, 106 deletions
diff --git a/src/nvim/main.c b/src/nvim/main.c
index d865260295..60a242fae3 100644
--- a/src/nvim/main.c
+++ b/src/nvim/main.c
@@ -287,8 +287,8 @@ int main(int argc, char **argv)
* Set the default values for the options that use Rows and Columns.
*/
win_init_size();
- /* Set the 'diff' option now, so that it can be checked for in a .vimrc
- * file. There is no buffer yet though. */
+ // Set the 'diff' option now, so that it can be checked for in a vimrc
+ // file. There is no buffer yet though.
if (params.diff_mode)
diff_win_options(firstwin, FALSE);
@@ -345,7 +345,7 @@ int main(int argc, char **argv)
*/
load_plugins();
- /* Decide about window layout for diff mode after reading vimrc. */
+ // Decide about window layout for diff mode after reading vimrc.
set_window_layout(&params);
/*
@@ -358,10 +358,8 @@ int main(int argc, char **argv)
mch_exit(0);
}
- /*
- * Set a few option defaults after reading .vimrc files:
- * 'title' and 'icon', Unix: 'shellpipe' and 'shellredir'.
- */
+ // Set a few option defaults after reading vimrc files:
+ // 'title' and 'icon', Unix: 'shellpipe' and 'shellredir'.
set_init_3();
TIME_MSG("inits 3");
@@ -1551,8 +1549,8 @@ static void create_windows(mparm_T *parmp)
if (parmp->window_count == 0)
parmp->window_count = GARGCOUNT;
if (parmp->window_count > 1) {
- /* Don't change the windows if there was a command in .vimrc that
- * already split some windows */
+ // Don't change the windows if there was a command in vimrc that
+ // already split some windows
if (parmp->window_layout == 0)
parmp->window_layout = WIN_HOR;
if (parmp->window_layout == WIN_TABS) {
@@ -1574,14 +1572,11 @@ static void create_windows(mparm_T *parmp)
getout(1);
do_modelines(0); /* do modelines */
} else {
- /*
- * Open a buffer for windows that don't have one yet.
- * Commands in the .vimrc might have loaded a file or split the window.
- * Watch out for autocommands that delete a window.
- */
- /*
- * Don't execute Win/Buf Enter/Leave autocommands here
- */
+ // Open a buffer for windows that don't have one yet.
+ // Commands in the vimrc might have loaded a file or split the window.
+ // Watch out for autocommands that delete a window.
+ //
+ // Don't execute Win/Buf Enter/Leave autocommands here
++autocmd_no_enter;
++autocmd_no_leave;
dorewind = TRUE;
@@ -1691,8 +1686,8 @@ static void edit_buffers(mparm_T *parmp)
}
advance = TRUE;
- /* Only open the file if there is no file in this window yet (that can
- * happen when .vimrc contains ":sall"). */
+ // Only open the file if there is no file in this window yet (that can
+ // happen when vimrc contains ":sall").
if (curbuf == firstwin->w_buffer || curbuf->b_ffname == NULL) {
curwin->w_arg_idx = arg_idx;
/* Edit file from arg list, if there is one. When "Quit" selected
@@ -1801,117 +1796,121 @@ static void exe_commands(mparm_T *parmp)
TIME_MSG("executing command arguments");
}
-/*
- * Source startup scripts.
- */
-static void source_startup_scripts(mparm_T *parmp)
+/// Source vimrc or do other user initialization
+///
+/// Does one of the following things, stops after whichever succeeds:
+///
+/// 1. Execution of VIMINIT environment variable.
+/// 2. Sourcing user vimrc file ($XDG_CONFIG_HOME/nvim/init.vim).
+/// 3. Sourcing other vimrc files ($XDG_CONFIG_DIRS[1]/nvim/init.vim, …).
+/// 4. Execution of EXINIT environment variable.
+///
+/// @return True if it is needed to attempt to source exrc file according to
+/// 'exrc' option definition.
+static bool do_user_initialization(void)
+ FUNC_ATTR_WARN_UNUSED_RESULT
{
- int i;
+ bool do_exrc = p_exrc;
+ if (process_env("VIMINIT", true) == OK) {
+ return do_exrc;
+ }
+ char_u *user_vimrc = (char_u *)stdpaths_user_conf_subpath("init.vim");
+ if (do_source(user_vimrc, true, DOSO_VIMRC) != FAIL) {
+ if (do_exrc) {
+ do_exrc = (path_full_compare((char_u *)VIMRC_FILE, user_vimrc, false)
+ != kEqualFiles);
+ }
+ xfree(user_vimrc);
+ return do_exrc;
+ }
+ xfree(user_vimrc);
+ char *const config_dirs = stdpaths_get_xdg_var(kXDGConfigDirs);
+ if (config_dirs != NULL) {
+ const void *iter = NULL;
+ do {
+ const char *dir;
+ size_t dir_len;
+ iter = vim_colon_env_iter(config_dirs, iter, &dir, &dir_len);
+ if (dir == NULL || dir_len == 0) {
+ break;
+ }
+ const char path_tail[] = { 'n', 'v', 'i', 'm', PATHSEP,
+ 'i', 'n', 'i', 't', '.', 'v', 'i', 'm', NUL };
+ char *vimrc = xmalloc(dir_len + sizeof(path_tail) + 1);
+ memmove(vimrc, dir, dir_len);
+ vimrc[dir_len] = PATHSEP;
+ memmove(vimrc + dir_len + 1, path_tail, sizeof(path_tail));
+ if (do_source((char_u *) vimrc, true, DOSO_VIMRC) != FAIL) {
+ if (do_exrc) {
+ do_exrc = (path_full_compare((char_u *)VIMRC_FILE, (char_u *)vimrc,
+ false) != kEqualFiles);
+ }
+ xfree(vimrc);
+ xfree(config_dirs);
+ return do_exrc;
+ }
+ xfree(vimrc);
+ } while (iter != NULL);
+ xfree(config_dirs);
+ }
+ if (process_env("EXINIT", false) == OK) {
+ return do_exrc;
+ }
+ return do_exrc;
+}
- /*
- * If -u argument given, use only the initializations from that file and
- * nothing else.
- */
+/// Source startup scripts
+///
+/// @param[in]
+static void source_startup_scripts(const mparm_T *const parmp)
+ FUNC_ATTR_NONNULL_ALL
+{
+ // If -u argument given, use only the initializations from that file and
+ // nothing else.
if (parmp->use_vimrc != NULL) {
if (strcmp(parmp->use_vimrc, "NONE") == 0
|| strcmp(parmp->use_vimrc, "NORC") == 0) {
if (parmp->use_vimrc[2] == 'N')
- p_lpl = FALSE; // don't load plugins either
+ p_lpl = false; // don't load plugins either
} 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) {
-
- /*
- * Get system wide defaults, if the file name is defined.
- */
#ifdef SYS_VIMRC_FILE
- (void)do_source((char_u *)SYS_VIMRC_FILE, FALSE, DOSO_NONE);
-#endif
-
- /*
- * Try to read initialization commands from the following places:
- * - environment variable VIMINIT
- * - user vimrc file (~/.vimrc)
- * - second user vimrc file ($VIM/.vimrc for Dos)
- * - environment variable EXINIT
- * - user exrc file (~/.exrc)
- * - second user exrc file ($VIM/.exrc for Dos)
- * The first that exists is used, the rest is ignored.
- */
- if (process_env("VIMINIT", true) != OK) {
- if (do_source((char_u *)USR_VIMRC_FILE, TRUE, DOSO_VIMRC) == FAIL
-#ifdef USR_VIMRC_FILE2
- && do_source((char_u *)USR_VIMRC_FILE2, TRUE,
- DOSO_VIMRC) == FAIL
+ // Get system wide defaults, if the file name is defined.
+ (void) do_source((char_u *)SYS_VIMRC_FILE, false, DOSO_NONE);
#endif
-#ifdef USR_VIMRC_FILE3
- && do_source((char_u *)USR_VIMRC_FILE3, TRUE,
- DOSO_VIMRC) == FAIL
-#endif
- && process_env("EXINIT", FALSE) == FAIL
- && do_source((char_u *)USR_EXRC_FILE, FALSE, DOSO_NONE) == FAIL) {
-#ifdef USR_EXRC_FILE2
- (void)do_source((char_u *)USR_EXRC_FILE2, FALSE, DOSO_NONE);
-#endif
- }
- }
- /*
- * Read initialization commands from ".vimrc" or ".exrc" in current
- * directory. This is only done if the 'exrc' option is set.
- * Because of security reasons we disallow shell and write commands
- * now, except for unix if the file is owned by the user or 'secure'
- * option has been reset in environment of global ".exrc" or ".vimrc".
- * Only do this if VIMRC_FILE is not the same as USR_VIMRC_FILE or
- * SYS_VIMRC_FILE.
- */
- if (p_exrc) {
+ if (do_user_initialization()) {
+ // Read initialization commands from ".vimrc" or ".exrc" in current
+ // directory. This is only done if the 'exrc' option is set.
+ // Because of security reasons we disallow shell and write commands
+ // now, except for unix if the file is owned by the user or 'secure'
+ // option has been reset in environment of global "exrc" or "vimrc".
+ // Only do this if VIMRC_FILE is not the same as vimrc file sourced in
+ // do_user_initialization.
#if defined(UNIX)
- /* If ".vimrc" file is not owned by user, set 'secure' mode. */
+ // If vimrc file is not owned by user, set 'secure' mode.
if (!file_owned(VIMRC_FILE))
#endif
secure = p_secure;
- i = FAIL;
- if (path_full_compare((char_u *)USR_VIMRC_FILE,
- (char_u *)VIMRC_FILE, FALSE) != kEqualFiles
-#ifdef USR_VIMRC_FILE2
- && path_full_compare((char_u *)USR_VIMRC_FILE2,
- (char_u *)VIMRC_FILE, FALSE) != kEqualFiles
-#endif
-#ifdef USR_VIMRC_FILE3
- && path_full_compare((char_u *)USR_VIMRC_FILE3,
- (char_u *)VIMRC_FILE, FALSE) != kEqualFiles
-#endif
-#ifdef SYS_VIMRC_FILE
- && path_full_compare((char_u *)SYS_VIMRC_FILE,
- (char_u *)VIMRC_FILE, FALSE) != kEqualFiles
-#endif
- )
- i = do_source((char_u *)VIMRC_FILE, TRUE, DOSO_VIMRC);
-
- if (i == FAIL) {
+ if (do_source((char_u *)VIMRC_FILE, true, DOSO_VIMRC) == FAIL) {
#if defined(UNIX)
- /* if ".exrc" is not owned by user set 'secure' mode */
- if (!file_owned(EXRC_FILE))
+ // if ".exrc" is not owned by user set 'secure' mode
+ if (!file_owned(EXRC_FILE)) {
secure = p_secure;
- else
+ } else {
secure = 0;
+ }
#endif
- if ( path_full_compare((char_u *)USR_EXRC_FILE,
- (char_u *)EXRC_FILE, FALSE) != kEqualFiles
-#ifdef USR_EXRC_FILE2
- && path_full_compare((char_u *)USR_EXRC_FILE2,
- (char_u *)EXRC_FILE, FALSE) != kEqualFiles
-#endif
- )
- (void)do_source((char_u *)EXRC_FILE, FALSE, DOSO_NONE);
+ (void)do_source((char_u *)EXRC_FILE, false, DOSO_NONE);
}
}
- if (secure == 2)
- need_wait_return = TRUE;
+ if (secure == 2) {
+ need_wait_return = true;
+ }
secure = 0;
}
did_source_startup_scripts = true;
@@ -2042,7 +2041,7 @@ static void usage(void)
mch_msg(_(" -r, -L List swap files and exit\n"));
mch_msg(_(" -r <file> Recover crashed session\n"));
mch_msg(_(" -u <nvimrc> Use <nvimrc> instead of the default\n"));
- mch_msg(_(" -i <shada> Use <shada> instead of the default " SHADA_FILE "\n")); // NOLINT(whitespace/line_length)
+ mch_msg(_(" -i <shada> Use <shada> instead of the default\n"));
mch_msg(_(" --noplugin Don't load plugin scripts\n"));
mch_msg(_(" -o[N] Open N windows (default: one for each file)\n"));
mch_msg(_(" -O[N] Like -o but split vertically\n"));