patch 7.4.1658
Problem:    A plugin does not know when VimEnter autocommands were already
            triggered.
Solution:   Add the v:vim_did_enter variable.
diff --git a/runtime/doc/autocmd.txt b/runtime/doc/autocmd.txt
index 4de5b16..5d502f1 100644
--- a/runtime/doc/autocmd.txt
+++ b/runtime/doc/autocmd.txt
@@ -918,7 +918,15 @@
 				loading .vimrc files, executing the "-c cmd"
 				arguments, creating all windows and loading
 				the buffers in them.
-							*VimLeave*
+				Just before this event is triggered the
+				|v:vim_did_enter| variable is set, so that you
+				can do: >
+				   if v:vim_did_enter
+				     call s:init()
+				   else
+ 	  			     au VimEnter * call s:init()
+				   endif
+<							*VimLeave*
 VimLeave			Before exiting Vim, just after writing the
 				.viminfo file.  Executed only once, like
 				VimLeavePre.
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt
index 642f0ad..e174481 100644
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -1762,6 +1762,10 @@
 		version 5.0 and 5.1 may have a patch 123, but these are
 		completely different.
 
+				*v:vim_did_enter* *vim_did_enter-variable*
+v:vim_did_enter	Zero until most of startup is done.  It is set to one just
+		before |VimEnter| autocommands are triggered.
+
 					*v:warningmsg* *warningmsg-variable*
 v:warningmsg	Last given warning message.  It's allowed to set this variable.
 
diff --git a/src/eval.c b/src/eval.c
index 06f3585..c104695 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -372,6 +372,7 @@
     {VV_NAME("true",		 VAR_SPECIAL), VV_RO},
     {VV_NAME("null",		 VAR_SPECIAL), VV_RO},
     {VV_NAME("none",		 VAR_SPECIAL), VV_RO},
+    {VV_NAME("vim_did_enter",	 VAR_NUMBER), VV_RO},
 };
 
 /* shorthand */
diff --git a/src/main.c b/src/main.c
index 35c940f..91ef66d 100644
--- a/src/main.c
+++ b/src/main.c
@@ -969,6 +969,9 @@
     if (p_im)
 	need_start_insertmode = TRUE;
 
+#ifdef FEAT_EVAL
+    set_vim_var_nr(VV_VIM_DID_ENTER, 1L);
+#endif
 #ifdef FEAT_AUTOCMD
     apply_autocmds(EVENT_VIMENTER, NULL, NULL, FALSE, curbuf);
     TIME_MSG("VimEnter autocommands");
diff --git a/src/testdir/test_alot.vim b/src/testdir/test_alot.vim
index fcf358b..0630998 100644
--- a/src/testdir/test_alot.vim
+++ b/src/testdir/test_alot.vim
@@ -2,6 +2,7 @@
 " This makes testing go faster, since Vim doesn't need to restart.
 
 source test_assign.vim
+source test_autocmd.vim
 source test_cursor_func.vim
 source test_delete.vim
 source test_ex_undo.vim
diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim
new file mode 100644
index 0000000..12c9848
--- /dev/null
+++ b/src/testdir/test_autocmd.vim
@@ -0,0 +1,8 @@
+" Tests for autocommands
+
+func Test_vim_did_enter()
+  call assert_false(v:vim_did_enter)
+
+  " This script will never reach the main loop, can't check if v:vim_did_enter
+  " becomes one.
+endfunc
diff --git a/src/version.c b/src/version.c
index 6459356..62e66ab 100644
--- a/src/version.c
+++ b/src/version.c
@@ -749,6 +749,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1658,
+/**/
     1657,
 /**/
     1656,
diff --git a/src/vim.h b/src/vim.h
index a7443e9..a2dc079 100644
--- a/src/vim.h
+++ b/src/vim.h
@@ -1869,7 +1869,8 @@
 #define VV_TRUE		64
 #define VV_NULL		65
 #define VV_NONE		66
-#define VV_LEN		67	/* number of v: vars */
+#define VV_VIM_DID_ENTER 67
+#define VV_LEN		68	/* number of v: vars */
 
 /* used for v_number in VAR_SPECIAL */
 #define VVAL_FALSE	0L