]> granicus.if.org Git - vim/commitdiff
patch 8.0.1206: no autocmd for entering or leaving the command line v8.0.1206
authorBram Moolenaar <Bram@vim.org>
Thu, 19 Oct 2017 16:35:51 +0000 (18:35 +0200)
committerBram Moolenaar <Bram@vim.org>
Thu, 19 Oct 2017 16:35:51 +0000 (18:35 +0200)
Problem:    No autocmd for entering or leaving the command line.
Solution:   Add CmdlineEnter and CmdlineLeave.

runtime/doc/autocmd.txt
src/ex_getln.c
src/fileio.c
src/testdir/test_autocmd.vim
src/version.c
src/vim.h

index b4b064c2624c33e0784f2fef46be7f44967cf7bf..da35c279c543b8e8780560c94d85abcd1999ed64 100644 (file)
@@ -492,6 +492,18 @@ CmdUndefined                       When a user command is used but it isn't
                                command is defined.  An alternative is to
                                always define the user command and have it
                                invoke an autoloaded function.  See |autoload|.
+                                                       *CmdlineEnter*
+CmdlineEnter                   After moving the cursor to the command line,
+                               where the user can type a command or search
+                               string.
+                               <afile> is set to a single character,
+                               indicating the type of command-line.
+                               |cmdwin-char|
+                                                       *CmdlineLeave*
+CmdlineLeave                   Before leaving the command line.
+                               <afile> is set to a single character,
+                               indicating the type of command-line.
+                               |cmdwin-char|
                                                        *CmdwinEnter*
 CmdwinEnter                    After entering the command-line window.
                                Useful for setting options specifically for
index 9f7dad99aa5ea73af39b470917375b978c577304..ceeeaf89f068e40de073ed530910978327c917b2 100644 (file)
@@ -145,6 +145,19 @@ sort_func_compare(const void *s1, const void *s2);
 static void set_search_match(pos_T *t);
 #endif
 
+
+#ifdef FEAT_AUTOCMD
+    static void
+trigger_cmd_autocmd(int typechar, int evt)
+{
+    char_u     typestr[2];
+
+    typestr[0] = typechar;
+    typestr[1] = NUL;
+    apply_autocmds(evt, typestr, typestr, FALSE, curbuf);
+}
+#endif
+
 /*
  * getcmdline() - accept a command line starting with firstc.
  *
@@ -222,6 +235,9 @@ getcmdline(
      * custom status line may invoke ":normal". */
     struct cmdline_info save_ccline;
 #endif
+#ifdef FEAT_AUTOCMD
+    int                cmdline_type;
+#endif
 
 #ifdef FEAT_EVAL
     if (firstc == -1)
@@ -349,6 +365,12 @@ getcmdline(
      * terminal mode set to cooked.  Need to set raw mode here then. */
     settmode(TMODE_RAW);
 
+#ifdef FEAT_AUTOCMD
+    /* Trigger CmdlineEnter autocommands. */
+    cmdline_type = firstc == NUL ? '-' : firstc;
+    trigger_cmd_autocmd(cmdline_type, EVENT_CMDLINEENTER);
+#endif
+
 #ifdef FEAT_CMDHIST
     init_history();
     hiscnt = hislen;           /* set hiscnt to impossible history value */
@@ -2085,6 +2107,11 @@ returncmd:
     if (some_key_typed)
        need_wait_return = FALSE;
 
+#ifdef FEAT_AUTOCMD
+    /* Trigger CmdlineLeave autocommands. */
+    trigger_cmd_autocmd(cmdline_type, EVENT_CMDLINELEAVE);
+#endif
+
     State = save_State;
 #ifdef USE_IM_CONTROL
     if (b_im_ptr != NULL && *b_im_ptr != B_IMODE_LMAP)
@@ -6834,9 +6861,6 @@ open_cmdwin(void)
     linenr_T           lnum;
     int                        histtype;
     garray_T           winsizes;
-#ifdef FEAT_AUTOCMD
-    char_u             typestr[2];
-#endif
     int                        save_restart_edit = restart_edit;
     int                        save_State = State;
     int                        save_exmode = exmode_active;
@@ -6965,9 +6989,7 @@ open_cmdwin(void)
 
 # ifdef FEAT_AUTOCMD
     /* Trigger CmdwinEnter autocommands. */
-    typestr[0] = cmdwin_type;
-    typestr[1] = NUL;
-    apply_autocmds(EVENT_CMDWINENTER, typestr, typestr, FALSE, curbuf);
+    trigger_cmd_autocmd(cmdwin_type, EVENT_CMDWINENTER);
     if (restart_edit != 0)     /* autocmd with ":startinsert" */
        stuffcharReadbuff(K_NOP);
 # endif
@@ -6990,7 +7012,7 @@ open_cmdwin(void)
 #  endif
 
     /* Trigger CmdwinLeave autocommands. */
-    apply_autocmds(EVENT_CMDWINLEAVE, typestr, typestr, FALSE, curbuf);
+    trigger_cmd_autocmd(cmdwin_type, EVENT_CMDWINLEAVE);
 
 #  ifdef FEAT_FOLDING
     /* Restore KeyTyped in case it is modified by autocommands */
index 0d1ac2d078d302c655495a6b1a1c6d5c24edc44d..575515613b22700794db49fc807ce033e8d183b5 100644 (file)
@@ -7731,6 +7731,8 @@ static struct event_name
     {"BufWritePost",   EVENT_BUFWRITEPOST},
     {"BufWritePre",    EVENT_BUFWRITEPRE},
     {"BufWriteCmd",    EVENT_BUFWRITECMD},
+    {"CmdlineEnter",   EVENT_CMDLINEENTER},
+    {"CmdlineLeave",   EVENT_CMDLINELEAVE},
     {"CmdwinEnter",    EVENT_CMDWINENTER},
     {"CmdwinLeave",    EVENT_CMDWINLEAVE},
     {"CmdUndefined",   EVENT_CMDUNDEFINED},
index f5a228995a76b7e2676fe5fca054af0b75904788..6af0820eb19fcf685a7041a99a8108d66ecea7eb 100644 (file)
@@ -793,3 +793,25 @@ func Test_QuitPre()
   bwipe Xfoo
   bwipe Xbar
 endfunc
+
+func Test_Cmdline()
+  au! CmdlineEnter : let g:entered = expand('<afile>')
+  au! CmdlineLeave : let g:left = expand('<afile>')
+  let g:entered = 0
+  let g:left = 0
+  call feedkeys(":echo 'hello'\<CR>", 'xt')
+  call assert_equal(':', g:entered)
+  call assert_equal(':', g:left)
+  au! CmdlineEnter
+  au! CmdlineLeave
+
+  au! CmdlineEnter / let g:entered = expand('<afile>')
+  au! CmdlineLeave / let g:left = expand('<afile>')
+  let g:entered = 0
+  let g:left = 0
+  call feedkeys("/hello<CR>", 'xt')
+  call assert_equal('/', g:entered)
+  call assert_equal('/', g:left)
+  au! CmdlineEnter
+  au! CmdlineLeave
+endfunc
index 5a6c721800257908020659c770814fdd4ba605ed..b0f8c5f51e04466b43d8c14c6840c44bbcc904c2 100644 (file)
@@ -761,6 +761,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1206,
 /**/
     1205,
 /**/
index 11b7b08389348dc3ad6b65f631048f377d440254..ed12b072f01584ff9519ca9db636d712cb65aac6 100644 (file)
--- a/src/vim.h
+++ b/src/vim.h
@@ -1295,6 +1295,8 @@ enum auto_event
     EVENT_BUFWRITEPOST,                /* after writing a buffer */
     EVENT_BUFWRITEPRE,         /* before writing a buffer */
     EVENT_BUFWRITECMD,         /* write buffer using command */
+    EVENT_CMDLINEENTER,                /* after entering the command line */
+    EVENT_CMDLINELEAVE,                /* before leaving the command line */
     EVENT_CMDWINENTER,         /* after entering the cmdline window */
     EVENT_CMDWINLEAVE,         /* before leaving the cmdline window */
     EVENT_COLORSCHEME,         /* after loading a colorscheme */