updated for version 7.0114
diff --git a/src/main.c b/src/main.c
index 0f507e7..0e274ad 100644
--- a/src/main.c
+++ b/src/main.c
@@ -29,6 +29,15 @@
 # include <limits.h>
 #endif
 
+/* Struct for various parameters passed between main() and other functions. */
+typedef struct
+{
+    int		serverArg;		/* TRUE when argument for a server */
+    char_u	*serverName_arg;	/* cmdline arg for server name */
+    int		evim_mode;		/* started as "evim" */
+    char_u	*use_vimrc;		/* vimrc from -u option */
+} mparm_T;
+
 #if defined(UNIX) || defined(VMS)
 static int file_owned __ARGS((char *fname));
 #endif
@@ -36,6 +45,9 @@
 static void main_msg __ARGS((char *s));
 static void usage __ARGS((void));
 static int get_number_arg __ARGS((char_u *p, int *idx, int def));
+static void early_arg_scan __ARGS((int argc, char **argv, mparm_T *parmp));
+static void exe_pre_commands __ARGS((char_u **cmds, int cnt));
+static void source_startup_scripts __ARGS((mparm_T *parmp));
 static void main_start_gui __ARGS((void));
 #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
 static void check_swap_exists_action __ARGS((void));
@@ -50,8 +62,6 @@
 static FILE *time_fd = NULL;
 #endif
 
-#define FEAT_PRECOMMANDS
-
 /*
  * Different types of error messages.
  */
@@ -95,7 +105,6 @@
     char_u	*term = NULL;		/* specified terminal name */
     char_u	*fname = NULL;		/* file name from command line */
     char_u	*tagname = NULL;	/* tag from -t option */
-    char_u	*use_vimrc = NULL;	/* vimrc from -u option */
 #ifdef FEAT_QUICKFIX
     char_u	*use_ef = NULL;		/* 'errorfile' from -q option */
 #endif
@@ -105,10 +114,8 @@
     int		n_commands = 0;		/* no. of commands from + or -c */
     char_u	*commands[MAX_ARG_CMDS]; /* commands from + or -c option */
     char_u	cmds_tofree[MAX_ARG_CMDS];  /* commands that need free() */
-#ifdef FEAT_PRECOMMANDS
-    int		p_commands = 0;		/* no. of commands from --cmd */
+    int		n_pre_commands = 0;	/* no. of commands from --cmd */
     char_u	*pre_commands[MAX_ARG_CMDS]; /* commands from --cmd option */
-#endif
     int		no_swap_file = FALSE;   /* "-n" option used */
     int		c;
     int		i;
@@ -135,7 +142,6 @@
 #ifdef FEAT_DIFF
     int		diff_mode = FALSE;	/* start with 'diff' set */
 #endif
-    int		evim_mode = FALSE;	/* started as "evim" */
     int		stdout_isatty;		/* is stdout a terminal? */
     int		input_isatty;		/* is active input a terminal? */
 #ifdef MSWIN
@@ -144,13 +150,13 @@
 #ifdef FEAT_CLIENTSERVER
     char_u	*serverStr = NULL;	/* remote server command */
     char_u	*serverStrEnc = NULL;	/* encoding of serverStr */
-    char_u	*serverName_arg = NULL;	/* cmdline arg for server name */
-    int		serverArg = FALSE;	/* TRUE when argument for a server */
     char_u	*servername = NULL;	/* allocated name for our server */
 #endif
 #if (!defined(UNIX) && !defined(__EMX__)) || defined(ARCHIE)
     int		literal = FALSE;	/* don't expand file names */
 #endif
+    mparm_T	params;			/* various parameters passed between
+					 * main() and other functions. */
 
     /*
      * Do any system-specific initialisations.  These can NOT use IObuff or
@@ -158,6 +164,8 @@
      */
     mch_early_init();
 
+    vim_memset(&params, 0, sizeof(params));
+
 #ifdef FEAT_TCL
     vim_tcl_init(argv[0]);
 #endif
@@ -198,7 +206,7 @@
     init_normal_cmds();
 
 #if defined(HAVE_DATE_TIME) && defined(VMS) && defined(VAXC)
-    make_version();
+    make_version();	/* Construct the long version string. */
 #endif
 
     /*
@@ -255,75 +263,13 @@
     gui.dofork = TRUE;		    /* default is to use fork() */
 #endif
 
-#if defined(FEAT_XCLIPBOARD) || defined(FEAT_CLIENTSERVER)
     /*
-     * Get the name of the display, before gui_prepare() removes it from
-     * argv[].  Used for the xterm-clipboard display.
-     *
-     * Also find the --server... arguments
+     * Do a first scan of the arguments in "argv[]":
+     *   -display
+     *   --server...
+     *   --socketid
      */
-    for (i = 1; i < argc; i++)
-    {
-	if (STRCMP(argv[i], "--") == 0)
-	    break;
-# ifdef FEAT_XCLIPBOARD
-	else if (STRICMP(argv[i], "-display") == 0
-#  if defined(FEAT_GUI_GTK) || defined(FEAT_GUI_KDE)
-		|| STRICMP(argv[i], "--display") == 0
-#  endif
-		)
-	{
-	    if (i == argc - 1)
-		mainerr_arg_missing((char_u *)argv[i]);
-	    xterm_display = argv[++i];
-	}
-# endif
-# ifdef FEAT_CLIENTSERVER
-	else if (STRICMP(argv[i], "--servername") == 0)
-	{
-	    if (i == argc - 1)
-		mainerr_arg_missing((char_u *)argv[i]);
-	    serverName_arg = (char_u *)argv[++i];
-	}
-	else if (STRICMP(argv[i], "--serverlist") == 0
-		 || STRICMP(argv[i], "--remote-send") == 0
-		 || STRICMP(argv[i], "--remote-expr") == 0
-		 || STRICMP(argv[i], "--remote") == 0
-		 || STRICMP(argv[i], "--remote-silent") == 0)
-	    serverArg = TRUE;
-	else if (STRICMP(argv[i], "--remote-wait") == 0
-		|| STRICMP(argv[i], "--remote-wait-silent") == 0)
-	{
-	    serverArg = TRUE;
-#ifdef FEAT_GUI
-	    /* don't fork() when starting the GUI to edit the files ourself */
-	    gui.dofork = FALSE;
-#endif
-	}
-# endif
-# ifdef FEAT_GUI_GTK
-	else if (STRICMP(argv[i], "--socketid") == 0)
-	{
-	    unsigned int    socket_id;
-	    int		    count;
-
-	    if (i == argc - 1)
-		mainerr_arg_missing((char_u *)argv[i]);
-	    if (STRNICMP(argv[i+1], "0x", 2) == 0)
-		count = sscanf(&(argv[i + 1][2]), "%x", &socket_id);
-	    else
-		count = sscanf(argv[i+1], "%u", &socket_id);
-	    if (count != 1)
-		mainerr(ME_INVALID_ARG, (char_u *)argv[i]);
-	    else
-		gtk_socket_id = socket_id;
-	    i++;
-	}
-	else if (STRICMP(argv[i], "--echo-wid") == 0)
-	    echo_wid_arg = TRUE;
-# endif
-    }
-#endif
+    early_arg_scan(argc, argv, &params);
 
 #ifdef FEAT_SUN_WORKSHOP
     findYourself(argv[0]);
@@ -376,7 +322,7 @@
     /*
      * Do the client-server stuff, unless "--servername ''" was used.
      */
-    if (serverName_arg == NULL || *serverName_arg != NUL)
+    if (params.serverName_arg == NULL || *params.serverName_arg != NUL)
     {
 # ifdef WIN32
 	/* Initialise the client/server messaging infrastructure. */
@@ -388,9 +334,9 @@
 	 * exit Vim when it was successful.  Otherwise it's executed further
 	 * on.  Remember the encoding used here in "serverStrEnc".
 	 */
-	if (serverArg)
+	if (params.serverArg)
 	{
-	    cmdsrv_main(&argc, argv, serverName_arg, &serverStr);
+	    cmdsrv_main(&argc, argv, params.serverName_arg, &serverStr);
 # ifdef FEAT_MBYTE
 	    serverStrEnc = vim_strsave(p_enc);
 # endif
@@ -399,7 +345,7 @@
 	/* If we're still running, get the name to register ourselves.
 	 * On Win32 can register right now, for X11 need to setup the
 	 * clipboard first, it's further down. */
-	servername = serverMakeName(serverName_arg, argv[0]);
+	servername = serverMakeName(params.serverName_arg, argv[0]);
 # ifdef WIN32
 	if (servername != NULL)
 	{
@@ -453,7 +399,7 @@
 #ifdef FEAT_GUI
 	gui.starting = TRUE;
 #endif
-	evim_mode = TRUE;
+	params.evim_mode = TRUE;
 	++initstr;
     }
 
@@ -588,13 +534,11 @@
 		}
 		else if (STRNICMP(argv[0] + argv_idx, "noplugin", 8) == 0)
 		    p_lpl = FALSE;
-#ifdef FEAT_PRECOMMANDS
 		else if (STRNICMP(argv[0] + argv_idx, "cmd", 3) == 0)
 		{
 		    want_argument = TRUE;
 		    argv_idx += 3;
 		}
-#endif
 #ifdef FEAT_CLIENTSERVER
 		else if (STRNICMP(argv[0] + argv_idx, "serverlist", 10) == 0)
 		    ; /* already processed -- no arg */
@@ -724,7 +668,7 @@
 #ifdef FEAT_GUI
 		gui.starting = TRUE;	/* start GUI a bit later */
 #endif
-		evim_mode = TRUE;
+		params.evim_mode = TRUE;
 		break;
 
 	    case 'N':		/* "-N"  Nocompatible */
@@ -940,13 +884,11 @@
 			commands[n_commands++] = (char_u *)argv[0];
 		    break;
 
-#ifdef FEAT_PRECOMMANDS
 		case '-':	/* "--cmd {command}" execute command */
-		    if (p_commands >= MAX_ARG_CMDS)
+		    if (n_pre_commands >= MAX_ARG_CMDS)
 			mainerr(ME_EXTRA_CMD, NULL);
-		    pre_commands[p_commands++] = (char_u *)argv[0];
+		    pre_commands[n_pre_commands++] = (char_u *)argv[0];
 		    break;
-#endif
 
 	    /*	case 'd':   -d {device} is handled in mch_check_win() for the
 	     *		    Amiga */
@@ -1002,7 +944,7 @@
 		    break;
 
 		case 'u':	/* "-u {vimrc}" vim inits file */
-		    use_vimrc = (char_u *)argv[0];
+		    params.use_vimrc = (char_u *)argv[0];
 		    break;
 
 		case 'U':	/* "-U {gvimrc}" gvim inits file */
@@ -1151,7 +1093,7 @@
 
 	/* When running "evim" or "gvim -y" we need the menus, exit if we
 	 * don't have them. */
-	if (evim_mode)
+	if (params.evim_mode)
 	    mch_exit(1);
     }
 # endif
@@ -1365,176 +1307,17 @@
 
     init_highlight(TRUE, FALSE); /* set the default highlight groups */
     TIME_MSG("init highlight");
-#ifdef CURSOR_SHAPE
-    parse_shape_opt(SHAPE_CURSOR); /* set cursor shapes from 'guicursor' */
-#endif
-#ifdef FEAT_MOUSESHAPE
-    parse_shape_opt(SHAPE_MOUSE);  /* set mouse shapes from 'mouseshape' */
-#endif
-#ifdef FEAT_PRINTER
-    parse_list_options(p_popt, printer_opts, OPT_PRINT_NUM_OPTIONS);
-#endif
 
 #ifdef FEAT_EVAL
     /* Set the break level after the terminal is initialized. */
     debug_break_level = use_debug_break_level;
 #endif
 
-#ifdef FEAT_PRECOMMANDS
-    if (p_commands > 0)
-    {
-	curwin->w_cursor.lnum = 0; /* just in case.. */
-	sourcing_name = (char_u *)_("pre-vimrc command line");
-# ifdef FEAT_EVAL
-	current_SID = SID_CMDARG;
-# endif
-	for (i = 0; i < p_commands; ++i)
-	    do_cmdline_cmd(pre_commands[i]);
-	sourcing_name = NULL;
-# ifdef FEAT_EVAL
-	current_SID = 0;
-# endif
-    }
-#endif
+    /* Execute --cmd arguments. */
+    exe_pre_commands(pre_commands, n_pre_commands);
 
-    /*
-     * For "evim" source evim.vim first of all, so that the user can overrule
-     * any things he doesn't like.
-     */
-    if (evim_mode)
-    {
-	(void)do_source((char_u *)EVIM_FILE, FALSE, FALSE);
-	TIME_MSG("source evim file");
-    }
-
-    /*
-     * If -u option given, use only the initializations from that file and
-     * nothing else.
-     */
-    if (use_vimrc != NULL)
-    {
-	if (STRCMP(use_vimrc, "NONE") == 0 || STRCMP(use_vimrc, "NORC") == 0)
-	{
-#ifdef FEAT_GUI
-	    if (use_gvimrc == NULL)	    /* don't load gvimrc either */
-		use_gvimrc = use_vimrc;
-#endif
-	    if (use_vimrc[2] == 'N')
-		p_lpl = FALSE;		    /* don't load plugins either */
-	}
-	else
-	{
-	    if (do_source(use_vimrc, FALSE, FALSE) != OK)
-		EMSG2(_("E282: Cannot read from \"%s\""), use_vimrc);
-	}
-    }
-    else if (!silent_mode)
-    {
-#ifdef AMIGA
-	struct Process	*proc = (struct Process *)FindTask(0L);
-	APTR		save_winptr = proc->pr_WindowPtr;
-
-	/* Avoid a requester here for a volume that doesn't exist. */
-	proc->pr_WindowPtr = (APTR)-1L;
-#endif
-
-	/*
-	 * Get system wide defaults, if the file name is defined.
-	 */
-#ifdef SYS_VIMRC_FILE
-	(void)do_source((char_u *)SYS_VIMRC_FILE, FALSE, FALSE);
-#endif
-
-	/*
-	 * Try to read initialization commands from the following places:
-	 * - environment variable VIMINIT
-	 * - user vimrc file (s:.vimrc for Amiga, ~/.vimrc otherwise)
-	 * - second user vimrc file ($VIM/.vimrc for Dos)
-	 * - environment variable EXINIT
-	 * - user exrc file (s:.exrc for Amiga, ~/.exrc otherwise)
-	 * - second user exrc file ($VIM/.exrc for Dos)
-	 * The first that exists is used, the rest is ignored.
-	 */
-	if (process_env((char_u *)"VIMINIT", TRUE) != OK)
-	{
-	    if (do_source((char_u *)USR_VIMRC_FILE, TRUE, TRUE) == FAIL
-#ifdef USR_VIMRC_FILE2
-		&& do_source((char_u *)USR_VIMRC_FILE2, TRUE, TRUE) == FAIL
-#endif
-#ifdef USR_VIMRC_FILE3
-		&& do_source((char_u *)USR_VIMRC_FILE3, TRUE, TRUE) == FAIL
-#endif
-		&& process_env((char_u *)"EXINIT", FALSE) == FAIL
-		&& do_source((char_u *)USR_EXRC_FILE, FALSE, FALSE) == FAIL)
-	    {
-#ifdef USR_EXRC_FILE2
-		(void)do_source((char_u *)USR_EXRC_FILE2, FALSE, FALSE);
-#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 defined(UNIX) || defined(VMS)
-	    /* If ".vimrc" file is not owned by user, set 'secure' mode. */
-	    if (!file_owned(VIMRC_FILE))
-#endif
-		secure = p_secure;
-
-	    i = FAIL;
-	    if (fullpathcmp((char_u *)USR_VIMRC_FILE,
-				      (char_u *)VIMRC_FILE, FALSE) != FPC_SAME
-#ifdef USR_VIMRC_FILE2
-		    && fullpathcmp((char_u *)USR_VIMRC_FILE2,
-				      (char_u *)VIMRC_FILE, FALSE) != FPC_SAME
-#endif
-#ifdef USR_VIMRC_FILE3
-		    && fullpathcmp((char_u *)USR_VIMRC_FILE3,
-				      (char_u *)VIMRC_FILE, FALSE) != FPC_SAME
-#endif
-#ifdef SYS_VIMRC_FILE
-		    && fullpathcmp((char_u *)SYS_VIMRC_FILE,
-				      (char_u *)VIMRC_FILE, FALSE) != FPC_SAME
-#endif
-				)
-		i = do_source((char_u *)VIMRC_FILE, TRUE, TRUE);
-
-	    if (i == FAIL)
-	    {
-#if defined(UNIX) || defined(VMS)
-		/* if ".exrc" is not owned by user set 'secure' mode */
-		if (!file_owned(EXRC_FILE))
-		    secure = p_secure;
-		else
-		    secure = 0;
-#endif
-		if (	   fullpathcmp((char_u *)USR_EXRC_FILE,
-				      (char_u *)EXRC_FILE, FALSE) != FPC_SAME
-#ifdef USR_EXRC_FILE2
-			&& fullpathcmp((char_u *)USR_EXRC_FILE2,
-				      (char_u *)EXRC_FILE, FALSE) != FPC_SAME
-#endif
-				)
-		    (void)do_source((char_u *)EXRC_FILE, FALSE, FALSE);
-	    }
-	}
-	if (secure == 2)
-	    need_wait_return = TRUE;
-	secure = 0;
-#ifdef AMIGA
-	proc->pr_WindowPtr = save_winptr;
-#endif
-    }
-    TIME_MSG("sourcing vimrc file(s)");
+    /* Source startup scripts. */
+    source_startup_scripts(&params);
 
 #ifdef FEAT_EVAL
     /*
@@ -1599,7 +1382,7 @@
 
 	/* When running "evim" or "gvim -y" we need the menus, exit if we
 	 * don't have them. */
-	if (!gui.in_use && evim_mode)
+	if (!gui.in_use && params.evim_mode)
 	    mch_exit(1);
     }
 #endif
@@ -1690,7 +1473,7 @@
 # ifdef FEAT_GUI
 		gui.in_use ||
 # endif
-		serverName_arg != NULL))
+		params.serverName_arg != NULL))
     {
 	(void)serverRegisterName(X_DISPLAY, servername);
 	vim_free(servername);
@@ -1778,8 +1561,7 @@
 #endif
     if (scroll_region)
 	scroll_region_reset();		/* In case Rows changed */
-
-    scroll_start();
+    scroll_start();	/* may scroll the screen to the right position */
 
     /*
      * Don't clear the screen when starting in Ex mode, unless using the GUI.
@@ -2439,6 +2221,262 @@
 }
 
 /*
+ * Get the name of the display, before gui_prepare() removes it from
+ * argv[].  Used for the xterm-clipboard display.
+ *
+ * Also find the --server... arguments and --socketid
+ */
+/*ARGSUSED*/
+    static void
+early_arg_scan(argc, argv, parmp)
+    int		argc;
+    char	**argv;
+    mparm_T	*parmp;
+{
+#if defined(FEAT_XCLIPBOARD) || defined(FEAT_CLIENTSERVER)
+    int		i;
+
+    for (i = 1; i < argc; i++)
+    {
+	if (STRCMP(argv[i], "--") == 0)
+	    break;
+# ifdef FEAT_XCLIPBOARD
+	else if (STRICMP(argv[i], "-display") == 0
+#  if defined(FEAT_GUI_GTK) || defined(FEAT_GUI_KDE)
+		|| STRICMP(argv[i], "--display") == 0
+#  endif
+		)
+	{
+	    if (i == argc - 1)
+		mainerr_arg_missing((char_u *)argv[i]);
+	    xterm_display = argv[++i];
+	}
+# endif
+# ifdef FEAT_CLIENTSERVER
+	else if (STRICMP(argv[i], "--servername") == 0)
+	{
+	    if (i == argc - 1)
+		mainerr_arg_missing((char_u *)argv[i]);
+	    parmp->serverName_arg = (char_u *)argv[++i];
+	}
+	else if (STRICMP(argv[i], "--serverlist") == 0
+		|| STRICMP(argv[i], "--remote-send") == 0
+		|| STRICMP(argv[i], "--remote-expr") == 0
+		|| STRICMP(argv[i], "--remote") == 0
+		|| STRICMP(argv[i], "--remote-silent") == 0)
+	    parmp->serverArg = TRUE;
+	else if (STRICMP(argv[i], "--remote-wait") == 0
+		|| STRICMP(argv[i], "--remote-wait-silent") == 0)
+	{
+	    parmp->serverArg = TRUE;
+#ifdef FEAT_GUI
+	    /* don't fork() when starting the GUI to edit the files ourself */
+	    gui.dofork = FALSE;
+#endif
+	}
+# endif
+# ifdef FEAT_GUI_GTK
+	else if (STRICMP(argv[i], "--socketid") == 0)
+	{
+	    unsigned int    socket_id;
+	    int		    count;
+
+	    if (i == argc - 1)
+		mainerr_arg_missing((char_u *)argv[i]);
+	    if (STRNICMP(argv[i+1], "0x", 2) == 0)
+		count = sscanf(&(argv[i + 1][2]), "%x", &socket_id);
+	    else
+		count = sscanf(argv[i+1], "%u", &socket_id);
+	    if (count != 1)
+		mainerr(ME_INVALID_ARG, (char_u *)argv[i]);
+	    else
+		gtk_socket_id = socket_id;
+	    i++;
+	}
+	else if (STRICMP(argv[i], "--echo-wid") == 0)
+	    echo_wid_arg = TRUE;
+# endif
+    }
+#endif
+}
+
+/*
+ * Execute the commands from --cmd arguments "cmds[cnt]".
+ */
+    static void
+exe_pre_commands(cmds, cnt)
+    char_u	**cmds;
+    int		cnt;
+{
+    int		i;
+
+    if (cnt > 0)
+    {
+	curwin->w_cursor.lnum = 0; /* just in case.. */
+	sourcing_name = (char_u *)_("pre-vimrc command line");
+# ifdef FEAT_EVAL
+	current_SID = SID_CMDARG;
+# endif
+	for (i = 0; i < cnt; ++i)
+	    do_cmdline_cmd(cmds[i]);
+	sourcing_name = NULL;
+# ifdef FEAT_EVAL
+	current_SID = 0;
+# endif
+	TIME_MSG("--cmd commands");
+    }
+}
+
+/*
+ * Source startup scripts.
+ */
+    static void
+source_startup_scripts(parmp)
+    mparm_T	*parmp;
+{
+    int		i;
+
+    /*
+     * For "evim" source evim.vim first of all, so that the user can overrule
+     * any things he doesn't like.
+     */
+    if (parmp->evim_mode)
+    {
+	(void)do_source((char_u *)EVIM_FILE, FALSE, FALSE);
+	TIME_MSG("source evim file");
+    }
+
+    /*
+     * If -u option 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)
+	{
+#ifdef FEAT_GUI
+	    if (use_gvimrc == NULL)	    /* don't load gvimrc either */
+		use_gvimrc = parmp->use_vimrc;
+#endif
+	    if (parmp->use_vimrc[2] == 'N')
+		p_lpl = FALSE;		    /* don't load plugins either */
+	}
+	else
+	{
+	    if (do_source(parmp->use_vimrc, FALSE, FALSE) != OK)
+		EMSG2(_("E282: Cannot read from \"%s\""), parmp->use_vimrc);
+	}
+    }
+    else if (!silent_mode)
+    {
+#ifdef AMIGA
+	struct Process	*proc = (struct Process *)FindTask(0L);
+	APTR		save_winptr = proc->pr_WindowPtr;
+
+	/* Avoid a requester here for a volume that doesn't exist. */
+	proc->pr_WindowPtr = (APTR)-1L;
+#endif
+
+	/*
+	 * Get system wide defaults, if the file name is defined.
+	 */
+#ifdef SYS_VIMRC_FILE
+	(void)do_source((char_u *)SYS_VIMRC_FILE, FALSE, FALSE);
+#endif
+
+	/*
+	 * Try to read initialization commands from the following places:
+	 * - environment variable VIMINIT
+	 * - user vimrc file (s:.vimrc for Amiga, ~/.vimrc otherwise)
+	 * - second user vimrc file ($VIM/.vimrc for Dos)
+	 * - environment variable EXINIT
+	 * - user exrc file (s:.exrc for Amiga, ~/.exrc otherwise)
+	 * - second user exrc file ($VIM/.exrc for Dos)
+	 * The first that exists is used, the rest is ignored.
+	 */
+	if (process_env((char_u *)"VIMINIT", TRUE) != OK)
+	{
+	    if (do_source((char_u *)USR_VIMRC_FILE, TRUE, TRUE) == FAIL
+#ifdef USR_VIMRC_FILE2
+		&& do_source((char_u *)USR_VIMRC_FILE2, TRUE, TRUE) == FAIL
+#endif
+#ifdef USR_VIMRC_FILE3
+		&& do_source((char_u *)USR_VIMRC_FILE3, TRUE, TRUE) == FAIL
+#endif
+		&& process_env((char_u *)"EXINIT", FALSE) == FAIL
+		&& do_source((char_u *)USR_EXRC_FILE, FALSE, FALSE) == FAIL)
+	    {
+#ifdef USR_EXRC_FILE2
+		(void)do_source((char_u *)USR_EXRC_FILE2, FALSE, FALSE);
+#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 defined(UNIX) || defined(VMS)
+	    /* If ".vimrc" file is not owned by user, set 'secure' mode. */
+	    if (!file_owned(VIMRC_FILE))
+#endif
+		secure = p_secure;
+
+	    i = FAIL;
+	    if (fullpathcmp((char_u *)USR_VIMRC_FILE,
+				      (char_u *)VIMRC_FILE, FALSE) != FPC_SAME
+#ifdef USR_VIMRC_FILE2
+		    && fullpathcmp((char_u *)USR_VIMRC_FILE2,
+				      (char_u *)VIMRC_FILE, FALSE) != FPC_SAME
+#endif
+#ifdef USR_VIMRC_FILE3
+		    && fullpathcmp((char_u *)USR_VIMRC_FILE3,
+				      (char_u *)VIMRC_FILE, FALSE) != FPC_SAME
+#endif
+#ifdef SYS_VIMRC_FILE
+		    && fullpathcmp((char_u *)SYS_VIMRC_FILE,
+				      (char_u *)VIMRC_FILE, FALSE) != FPC_SAME
+#endif
+				)
+		i = do_source((char_u *)VIMRC_FILE, TRUE, TRUE);
+
+	    if (i == FAIL)
+	    {
+#if defined(UNIX) || defined(VMS)
+		/* if ".exrc" is not owned by user set 'secure' mode */
+		if (!file_owned(EXRC_FILE))
+		    secure = p_secure;
+		else
+		    secure = 0;
+#endif
+		if (	   fullpathcmp((char_u *)USR_EXRC_FILE,
+				      (char_u *)EXRC_FILE, FALSE) != FPC_SAME
+#ifdef USR_EXRC_FILE2
+			&& fullpathcmp((char_u *)USR_EXRC_FILE2,
+				      (char_u *)EXRC_FILE, FALSE) != FPC_SAME
+#endif
+				)
+		    (void)do_source((char_u *)EXRC_FILE, FALSE, FALSE);
+	    }
+	}
+	if (secure == 2)
+	    need_wait_return = TRUE;
+	secure = 0;
+#ifdef AMIGA
+	proc->pr_WindowPtr = save_winptr;
+#endif
+    }
+    TIME_MSG("sourcing vimrc file(s)");
+}
+
+/*
  * Setup to start using the GUI.  Exit with an error when not available.
  */
     static void
@@ -2656,9 +2694,7 @@
     main_msg(_("-O[N]\t\tLike -o but split vertically"));
     main_msg(_("+\t\t\tStart at end of file"));
     main_msg(_("+<lnum>\t\tStart at line <lnum>"));
-#ifdef FEAT_PRECOMMANDS
     main_msg(_("--cmd <command>\tExecute <command> before loading any vimrc file"));
-#endif
     main_msg(_("-c <command>\t\tExecute <command> after loading the first file"));
     main_msg(_("-S <session>\t\tSource file <session> after loading the first file"));
     main_msg(_("-s <scriptin>\tRead Normal mode commands from file <scriptin>"));