0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

patch 8.0.1206: no autocmd for entering or leaving the command line

Problem:    No autocmd for entering or leaving the command line.
Solution:   Add CmdlineEnter and CmdlineLeave.
This commit is contained in:
Bram Moolenaar
2017-10-19 18:35:51 +02:00
parent ff930cad8a
commit fafcf0dd59
6 changed files with 69 additions and 7 deletions

View File

@@ -492,6 +492,18 @@ CmdUndefined When a user command is used but it isn't
command is defined. An alternative is to command is defined. An alternative is to
always define the user command and have it always define the user command and have it
invoke an autoloaded function. See |autoload|. 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*
CmdwinEnter After entering the command-line window. CmdwinEnter After entering the command-line window.
Useful for setting options specifically for Useful for setting options specifically for

View File

@@ -145,6 +145,19 @@ sort_func_compare(const void *s1, const void *s2);
static void set_search_match(pos_T *t); static void set_search_match(pos_T *t);
#endif #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. * getcmdline() - accept a command line starting with firstc.
* *
@@ -222,6 +235,9 @@ getcmdline(
* custom status line may invoke ":normal". */ * custom status line may invoke ":normal". */
struct cmdline_info save_ccline; struct cmdline_info save_ccline;
#endif #endif
#ifdef FEAT_AUTOCMD
int cmdline_type;
#endif
#ifdef FEAT_EVAL #ifdef FEAT_EVAL
if (firstc == -1) if (firstc == -1)
@@ -349,6 +365,12 @@ getcmdline(
* terminal mode set to cooked. Need to set raw mode here then. */ * terminal mode set to cooked. Need to set raw mode here then. */
settmode(TMODE_RAW); 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 #ifdef FEAT_CMDHIST
init_history(); init_history();
hiscnt = hislen; /* set hiscnt to impossible history value */ hiscnt = hislen; /* set hiscnt to impossible history value */
@@ -2085,6 +2107,11 @@ returncmd:
if (some_key_typed) if (some_key_typed)
need_wait_return = FALSE; need_wait_return = FALSE;
#ifdef FEAT_AUTOCMD
/* Trigger CmdlineLeave autocommands. */
trigger_cmd_autocmd(cmdline_type, EVENT_CMDLINELEAVE);
#endif
State = save_State; State = save_State;
#ifdef USE_IM_CONTROL #ifdef USE_IM_CONTROL
if (b_im_ptr != NULL && *b_im_ptr != B_IMODE_LMAP) if (b_im_ptr != NULL && *b_im_ptr != B_IMODE_LMAP)
@@ -6834,9 +6861,6 @@ open_cmdwin(void)
linenr_T lnum; linenr_T lnum;
int histtype; int histtype;
garray_T winsizes; garray_T winsizes;
#ifdef FEAT_AUTOCMD
char_u typestr[2];
#endif
int save_restart_edit = restart_edit; int save_restart_edit = restart_edit;
int save_State = State; int save_State = State;
int save_exmode = exmode_active; int save_exmode = exmode_active;
@@ -6965,9 +6989,7 @@ open_cmdwin(void)
# ifdef FEAT_AUTOCMD # ifdef FEAT_AUTOCMD
/* Trigger CmdwinEnter autocommands. */ /* Trigger CmdwinEnter autocommands. */
typestr[0] = cmdwin_type; trigger_cmd_autocmd(cmdwin_type, EVENT_CMDWINENTER);
typestr[1] = NUL;
apply_autocmds(EVENT_CMDWINENTER, typestr, typestr, FALSE, curbuf);
if (restart_edit != 0) /* autocmd with ":startinsert" */ if (restart_edit != 0) /* autocmd with ":startinsert" */
stuffcharReadbuff(K_NOP); stuffcharReadbuff(K_NOP);
# endif # endif
@@ -6990,7 +7012,7 @@ open_cmdwin(void)
# endif # endif
/* Trigger CmdwinLeave autocommands. */ /* Trigger CmdwinLeave autocommands. */
apply_autocmds(EVENT_CMDWINLEAVE, typestr, typestr, FALSE, curbuf); trigger_cmd_autocmd(cmdwin_type, EVENT_CMDWINLEAVE);
# ifdef FEAT_FOLDING # ifdef FEAT_FOLDING
/* Restore KeyTyped in case it is modified by autocommands */ /* Restore KeyTyped in case it is modified by autocommands */

View File

@@ -7731,6 +7731,8 @@ static struct event_name
{"BufWritePost", EVENT_BUFWRITEPOST}, {"BufWritePost", EVENT_BUFWRITEPOST},
{"BufWritePre", EVENT_BUFWRITEPRE}, {"BufWritePre", EVENT_BUFWRITEPRE},
{"BufWriteCmd", EVENT_BUFWRITECMD}, {"BufWriteCmd", EVENT_BUFWRITECMD},
{"CmdlineEnter", EVENT_CMDLINEENTER},
{"CmdlineLeave", EVENT_CMDLINELEAVE},
{"CmdwinEnter", EVENT_CMDWINENTER}, {"CmdwinEnter", EVENT_CMDWINENTER},
{"CmdwinLeave", EVENT_CMDWINLEAVE}, {"CmdwinLeave", EVENT_CMDWINLEAVE},
{"CmdUndefined", EVENT_CMDUNDEFINED}, {"CmdUndefined", EVENT_CMDUNDEFINED},

View File

@@ -793,3 +793,25 @@ func Test_QuitPre()
bwipe Xfoo bwipe Xfoo
bwipe Xbar bwipe Xbar
endfunc 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

View File

@@ -761,6 +761,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1206,
/**/ /**/
1205, 1205,
/**/ /**/

View File

@@ -1295,6 +1295,8 @@ enum auto_event
EVENT_BUFWRITEPOST, /* after writing a buffer */ EVENT_BUFWRITEPOST, /* after writing a buffer */
EVENT_BUFWRITEPRE, /* before writing a buffer */ EVENT_BUFWRITEPRE, /* before writing a buffer */
EVENT_BUFWRITECMD, /* write buffer using command */ 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_CMDWINENTER, /* after entering the cmdline window */
EVENT_CMDWINLEAVE, /* before leaving the cmdline window */ EVENT_CMDWINLEAVE, /* before leaving the cmdline window */
EVENT_COLORSCHEME, /* after loading a colorscheme */ EVENT_COLORSCHEME, /* after loading a colorscheme */