diff --git a/src/ex_getln.c b/src/ex_getln.c index 1be5a0c1f6..24ff7a9089 100644 --- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -1620,6 +1620,7 @@ getcmdline_int( int did_save_ccline = FALSE; int cmdline_type; int wild_type = 0; + int event_cmdlineleavepre_triggered = FALSE; // one recursion level deeper ++depth; @@ -1917,8 +1918,15 @@ getcmdline_int( } // Trigger CmdlineLeavePre autocommand - if (c == '\n' || c == '\r' || c == K_KENTER || c == ESC || c == Ctrl_C) + if (KeyTyped && (c == '\n' || c == '\r' || c == K_KENTER || c == ESC +#ifdef UNIX + || c == intr_char +#endif + || c == Ctrl_C)) + { trigger_cmd_autocmd(cmdline_type, EVENT_CMDLINELEAVEPRE); + event_cmdlineleavepre_triggered = TRUE; + } // The wildmenu is cleared if the pressed key is not used for // navigating the wild menu (i.e. the key is not 'wildchar' or @@ -2608,6 +2616,10 @@ returncmd: if (some_key_typed) need_wait_return = FALSE; + // Trigger CmdlineLeavePre autocommands if not already triggered. + if (!event_cmdlineleavepre_triggered) + trigger_cmd_autocmd(cmdline_type, EVENT_CMDLINELEAVEPRE); + // Trigger CmdlineLeave autocommands. trigger_cmd_autocmd(cmdline_type, EVENT_CMDLINELEAVE); diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim index 6f83b9caea..599153b082 100644 --- a/src/testdir/test_autocmd.vim +++ b/src/testdir/test_autocmd.vim @@ -2002,51 +2002,101 @@ endfunc func Test_Cmdline_Trigger() autocmd CmdlineLeavePre : let g:log = "CmdlineLeavePre" + autocmd CmdlineLeavePre : let g:log2 = "CmdlineLeave" new let g:log = '' + let g:log2 = '' nnoremap echo "hello" call feedkeys("\", 'x') call assert_equal('', g:log) + call assert_equal('', g:log2) nunmap + let g:log = '' + let g:log2 = '' nnoremap :echo "hello" call feedkeys("\", 'x') call assert_equal('CmdlineLeavePre', g:log) + call assert_equal('CmdlineLeave', g:log2) nunmap + let g:log = '' + let g:log2 = '' + call feedkeys(":\", "tx") + call assert_equal('CmdlineLeavePre', g:log) + call assert_equal('CmdlineLeave', g:log2) + + let g:log = '' + let g:log2 = '' split call assert_equal('', g:log) call feedkeys(":echo hello", "tx") call assert_equal('CmdlineLeavePre', g:log) + call assert_equal('CmdlineLeave', g:log2) + let g:log = '' + let g:log2 = '' close call assert_equal('', g:log) call feedkeys(":echo hello", "tx") call assert_equal('CmdlineLeavePre', g:log) + call assert_equal('CmdlineLeave', g:log2) + let g:log = '' + let g:log2 = '' tabnew call assert_equal('', g:log) call feedkeys(":echo hello", "tx") call assert_equal('CmdlineLeavePre', g:log) + call assert_equal('CmdlineLeave', g:log2) + let g:log = '' + let g:log2 = '' split call assert_equal('', g:log) call feedkeys(":echo hello", "tx") call assert_equal('CmdlineLeavePre', g:log) + call assert_equal('CmdlineLeave', g:log2) + let g:log = '' + let g:log2 = '' tabclose call assert_equal('', g:log) call feedkeys(":echo hello", "tx") call assert_equal('CmdlineLeavePre', g:log) + call assert_equal('CmdlineLeave', g:log2) + let g:count = 0 autocmd CmdlineLeavePre * let g:count += 1 call feedkeys(":let c = input('? ')\B\", "tx") call assert_equal(2, g:count) unlet! g:count unlet! g:log + unlet! g:log2 bw! endfunc +" Ensure :cabbr does not cause a spurious CmdlineLeavePre. +func Test_CmdlineLeavePre_cabbr() + CheckFeature terminal + let buf = term_start([GetVimProg(), '--clean', '-c', 'set noswapfile'], {'term_rows': 3}) + call assert_equal('running', term_getstatus(buf)) + call term_sendkeys(buf, ":let g:a=0\") + call term_wait(buf, 50) + call term_sendkeys(buf, ":cabbr v v\") + call term_wait(buf, 50) + call term_sendkeys(buf, ":command! -nargs=* Foo echo\") + call term_wait(buf, 50) + call term_sendkeys(buf, ":au! CmdlineLeavePre * :let g:a+=1\") + call term_wait(buf, 50) + call term_sendkeys(buf, ":Foo v\") + call term_wait(buf, 50) + call term_sendkeys(buf, ":echo g:a\") + call term_wait(buf, 50) + call WaitForAssert({-> assert_match('^2.*$', term_getline(buf, 3))}) + bwipe! +endfunc + func Test_Cmdline() au! CmdlineChanged : let g:text = getcmdline() let g:text = 0 diff --git a/src/version.c b/src/version.c index 91f2164304..5e40ee5b59 100644 --- a/src/version.c +++ b/src/version.c @@ -704,6 +704,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1349, /**/ 1348, /**/