Mercurial > vim
changeset 18043:5a0d5f8e1778 v8.1.2017
patch 8.1.2017: cannot execute commands after closing the cmdline window
Commit: https://github.com/vim/vim/commit/96e38a86a710fb6daec4550ac1667f019dc3a40e
Author: Bram Moolenaar <Bram@vim.org>
Date: Mon Sep 9 18:35:33 2019 +0200
patch 8.1.2017: cannot execute commands after closing the cmdline window
Problem: Cannot execute commands after closing the cmdline window.
Solution: Also trigger BufEnter and WinEnter. (closes https://github.com/vim/vim/issues/4762)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Mon, 09 Sep 2019 18:45:04 +0200 |
parents | 1616f2fc1e3c |
children | 062623edb7c8 |
files | runtime/doc/autocmd.txt runtime/doc/cmdline.txt src/ex_getln.c src/testdir/test_cmdline.vim src/version.c |
diffstat | 5 files changed, 58 insertions(+), 39 deletions(-) [+] |
line wrap: on
line diff
--- a/runtime/doc/autocmd.txt +++ b/runtime/doc/autocmd.txt @@ -554,16 +554,14 @@ CmdlineLeave Before leaving the comman *CmdwinEnter* CmdwinEnter After entering the command-line window. Useful for setting options specifically for - this special type of window. This is - triggered _instead_ of BufEnter and WinEnter. + this special type of window. <afile> is set to a single character, indicating the type of command-line. |cmdwin-char| *CmdwinLeave* CmdwinLeave Before leaving the command-line window. Useful to clean up any global setting done - with CmdwinEnter. This is triggered _instead_ - of BufLeave and WinLeave. + with CmdwinEnter. <afile> is set to a single character, indicating the type of command-line. |cmdwin-char|
--- a/runtime/doc/cmdline.txt +++ b/runtime/doc/cmdline.txt @@ -1171,11 +1171,9 @@ edited as described in |cmdwin-char|. AUTOCOMMANDS -Two autocommand events are used: |CmdwinEnter| and |CmdwinLeave|. Since this -window is of a special type, the WinEnter, WinLeave, BufEnter and BufLeave -events are not triggered. You can use the Cmdwin events to do settings -specifically for the command-line window. Be careful not to cause side -effects! +Two autocommand events are used: |CmdwinEnter| and |CmdwinLeave|. You can use +the Cmdwin events to do settings specifically for the command-line window. +Be careful not to cause side effects! Example: > :au CmdwinEnter : let b:cpt_save = &cpt | set cpt=. :au CmdwinLeave : let &cpt = b:cpt_save
--- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -4069,30 +4069,26 @@ open_cmdwin(void) } set_bufref(&old_curbuf, curbuf); - /* Save current window sizes. */ + // Save current window sizes. win_size_save(&winsizes); - /* Don't execute autocommands while creating the window. */ - block_autocmds(); - // When using completion in Insert mode with <C-R>=<C-F> one can open the // command line window, but we don't want the popup menu then. pum_undisplay(); - /* don't use a new tab page */ + // don't use a new tab page cmdmod.tab = 0; cmdmod.noswapfile = 1; - /* Create a window for the command-line buffer. */ + // Create a window for the command-line buffer. if (win_split((int)p_cwh, WSP_BOT) == FAIL) { beep_flush(); - unblock_autocmds(); return K_IGNORE; } cmdwin_type = get_cmdline_type(); - /* Create the command-line buffer empty. */ + // Create the command-line buffer empty. (void)do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE, NULL); (void)setfname(curbuf, (char_u *)"[Command Line]", NULL, TRUE); set_option_value((char_u *)"bt", 0L, (char_u *)"nofile", OPT_LOCAL); @@ -4106,12 +4102,10 @@ open_cmdwin(void) # endif RESET_BINDING(curwin); - /* Do execute autocommands for setting the filetype (load syntax). */ - unblock_autocmds(); - /* But don't allow switching to another buffer. */ + // Don't allow switching to another buffer. ++curbuf_lock; - /* Showing the prompt may have set need_wait_return, reset it. */ + // Showing the prompt may have set need_wait_return, reset it. need_wait_return = FALSE; histtype = hist_char2type(cmdwin_type); @@ -4126,11 +4120,11 @@ open_cmdwin(void) } --curbuf_lock; - /* Reset 'textwidth' after setting 'filetype' (the Vim filetype plugin - * sets 'textwidth' to 78). */ + // Reset 'textwidth' after setting 'filetype' (the Vim filetype plugin + // sets 'textwidth' to 78). curbuf->b_p_tw = 0; - /* Fill the buffer with the history. */ + // Fill the buffer with the history. init_history(); if (get_hislen() > 0) { @@ -4167,9 +4161,9 @@ open_cmdwin(void) setmouse(); # endif - /* Trigger CmdwinEnter autocommands. */ + // Trigger CmdwinEnter autocommands. trigger_cmd_autocmd(cmdwin_type, EVENT_CMDWINENTER); - if (restart_edit != 0) /* autocmd with ":startinsert" */ + if (restart_edit != 0) // autocmd with ":startinsert" stuffcharReadbuff(K_NOP); i = RedrawingDisabled; @@ -4187,11 +4181,11 @@ open_cmdwin(void) save_KeyTyped = KeyTyped; # endif - /* Trigger CmdwinLeave autocommands. */ + // Trigger CmdwinLeave autocommands. trigger_cmd_autocmd(cmdwin_type, EVENT_CMDWINLEAVE); # ifdef FEAT_FOLDING - /* Restore KeyTyped in case it is modified by autocommands */ + // Restore KeyTyped in case it is modified by autocommands KeyTyped = save_KeyTyped; # endif @@ -4268,10 +4262,8 @@ open_cmdwin(void) } } - /* Don't execute autocommands while deleting the window. */ - block_autocmds(); # ifdef FEAT_CONCEAL - /* Avoid command-line window first character being concealed. */ + // Avoid command-line window first character being concealed. curwin->w_p_cole = 0; # endif wp = curwin; @@ -4279,15 +4271,13 @@ open_cmdwin(void) win_goto(old_curwin); win_close(wp, TRUE); - /* win_close() may have already wiped the buffer when 'bh' is - * set to 'wipe' */ + // win_close() may have already wiped the buffer when 'bh' is + // set to 'wipe' if (bufref_valid(&bufref)) close_buffer(NULL, bufref.br_buf, DOBUF_WIPE, FALSE); - /* Restore window sizes. */ + // Restore window sizes. win_size_restore(&winsizes); - - unblock_autocmds(); } ga_clear(&winsizes); @@ -4303,7 +4293,7 @@ open_cmdwin(void) return cmdwin_result; } -#endif /* FEAT_CMDWIN */ +#endif // FEAT_CMDWIN /* * Used for commands that either take a simple command string argument, or:
--- a/src/testdir/test_cmdline.vim +++ b/src/testdir/test_cmdline.vim @@ -604,6 +604,8 @@ func Check_cmdline(cmdtype) return '' endfunc +set cpo& + func Test_getcmdtype() call feedkeys(":MyCmd a\<C-R>=Check_cmdline(':')\<CR>\<Esc>", "xt") @@ -644,6 +646,37 @@ func Test_getcmdwintype() call assert_equal('', getcmdwintype()) endfunc +func Test_getcmdwin_autocmd() + let s:seq = [] + augroup CmdWin + au WinEnter * call add(s:seq, 'WinEnter ' .. win_getid()) + au WinLeave * call add(s:seq, 'WinLeave ' .. win_getid()) + au BufEnter * call add(s:seq, 'BufEnter ' .. bufnr()) + au BufLeave * call add(s:seq, 'BufLeave ' .. bufnr()) + au CmdWinEnter * call add(s:seq, 'CmdWinEnter ' .. win_getid()) + au CmdWinLeave * call add(s:seq, 'CmdWinLeave ' .. win_getid()) + + let org_winid = win_getid() + let org_bufnr = bufnr() + call feedkeys("q::let a = getcmdwintype()\<CR>:let s:cmd_winid = win_getid()\<CR>:let s:cmd_bufnr = bufnr()\<CR>:q\<CR>", 'x!') + call assert_equal(':', a) + call assert_equal([ + \ 'WinLeave ' .. org_winid, + \ 'WinEnter ' .. s:cmd_winid, + \ 'BufLeave ' .. org_bufnr, + \ 'BufEnter ' .. s:cmd_bufnr, + \ 'CmdWinEnter ' .. s:cmd_winid, + \ 'CmdWinLeave ' .. s:cmd_winid, + \ 'BufLeave ' .. s:cmd_bufnr, + \ 'WinLeave ' .. s:cmd_winid, + \ 'WinEnter ' .. org_winid, + \ 'BufEnter ' .. org_bufnr, + \ ], s:seq) + + au! + augroup END +endfunc + func Test_verbosefile() set verbosefile=Xlog echomsg 'foo' @@ -701,5 +734,3 @@ func Test_cmdline_overstrike() let &encoding = encoding_save endfunc - -set cpo&