changeset 8738:e770986c855a v7.4.1658

commit https://github.com/vim/vim/commit/1473551a4457d4920b235eeeb9f279e196ee7225 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Mar 26 21:00:08 2016 +0100 patch 7.4.1658 Problem: A plugin does not know when VimEnter autocommands were already triggered. Solution: Add the v:vim_did_enter variable.
author Christian Brabandt <cb@256bit.org>
date Sat, 26 Mar 2016 21:15:05 +0100
parents b3a380af91fb
children 1e0c9b48919c
files runtime/doc/autocmd.txt runtime/doc/eval.txt src/eval.c src/main.c src/testdir/test_alot.vim src/testdir/test_autocmd.vim src/version.c src/vim.h
diffstat 8 files changed, 30 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/autocmd.txt
+++ b/runtime/doc/autocmd.txt
@@ -918,7 +918,15 @@ VimEnter			After doing all the startup s
 				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.
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -1762,6 +1762,10 @@ v:version	Version number of Vim: Major v
 		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.
 
--- a/src/eval.c
+++ b/src/eval.c
@@ -372,6 +372,7 @@ static struct vimvar
     {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 */
--- a/src/main.c
+++ b/src/main.c
@@ -969,6 +969,9 @@ vim_main2(int argc UNUSED, char **argv U
     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");
--- 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
new file mode 100644
--- /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
--- a/src/version.c
+++ b/src/version.c
@@ -749,6 +749,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1658,
+/**/
     1657,
 /**/
     1656,
--- a/src/vim.h
+++ b/src/vim.h
@@ -1869,7 +1869,8 @@ typedef int sock_T;
 #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