updated for version 7.0003
diff --git a/src/edit.c b/src/edit.c
index 7619a55..1adcda4 100644
--- a/src/edit.c
+++ b/src/edit.c
@@ -270,6 +270,23 @@
     ins_compl_clear();	    /* clear stuff for CTRL-X mode */
 #endif
 
+#ifdef FEAT_AUTOCMD
+    /*
+     * Trigger InsertEnter autocommands.  Do not do this for "r<CR>" or "grx".
+     */
+    if (cmdchar != 'r' && cmdchar != 'v')
+    {
+	if (cmdchar == 'R')
+	    ptr = (char_u *)"r";
+	else if (cmdchar == 'V')
+	    ptr = (char_u *)"v";
+	else
+	    ptr = (char_u *)"i";
+	set_vim_var_string(VV_INSERTMODE, ptr, 1);
+	apply_autocmds(EVENT_INSERTENTER, NULL, NULL, FALSE, curbuf);
+    }
+#endif
+
 #ifdef FEAT_MOUSE
     /*
      * When doing a paste with the middle mouse button, Insstart is set to
@@ -725,6 +742,12 @@
 		break;
 	    }
 #endif
+#ifdef FEAT_AUTOCMD
+	    set_vim_var_string(VV_INSERTMODE,
+			   (char_u *)((State & REPLACE_FLAG) ? "i" :
+				    replaceState == VREPLACE ? "v" : "r"), 1);
+	    apply_autocmds(EVENT_INSERTCHANGE, NULL, NULL, FALSE, curbuf);
+#endif
 	    if (State & REPLACE_FLAG)
 		State = INSERT | (State & LANGMAP);
 	    else
@@ -859,7 +882,14 @@
 		o_lnum = curwin->w_cursor.lnum;
 
 	    if (ins_esc(&count, cmdchar))
+	    {
+#ifdef FEAT_AUTOCMD
+		if (cmdchar != 'r' && cmdchar != 'v')
+		    apply_autocmds(EVENT_INSERTLEAVE, NULL, NULL,
+							       FALSE, curbuf);
+#endif
 		return (c == Ctrl_O);
+	    }
 	    continue;
 
 	/*