summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-09-09 18:35:33 +0200
committerBram Moolenaar <Bram@vim.org>2019-09-09 18:35:33 +0200
commit96e38a86a710fb6daec4550ac1667f019dc3a40e (patch)
treec49b193fdb61c2643ffade36920b9308093be1cc
parentadbde3fbedd4a5379ddf0cfc9a6854b52955fd4a (diff)
downloadvim-git-8.1.2017.tar.gz
patch 8.1.2017: cannot execute commands after closing the cmdline windowv8.1.2017
Problem: Cannot execute commands after closing the cmdline window. Solution: Also trigger BufEnter and WinEnter. (closes #4762)
-rw-r--r--runtime/doc/autocmd.txt6
-rw-r--r--runtime/doc/cmdline.txt8
-rw-r--r--src/ex_getln.c46
-rw-r--r--src/testdir/test_cmdline.vim35
-rw-r--r--src/version.c2
5 files changed, 58 insertions, 39 deletions
diff --git a/runtime/doc/autocmd.txt b/runtime/doc/autocmd.txt
index 78936519f..aa2836283 100644
--- a/runtime/doc/autocmd.txt
+++ b/runtime/doc/autocmd.txt
@@ -554,16 +554,14 @@ CmdlineLeave Before leaving the command line.
*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|
diff --git a/runtime/doc/cmdline.txt b/runtime/doc/cmdline.txt
index 22b4e6fdf..a3aeb1886 100644
--- 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
diff --git a/src/ex_getln.c b/src/ex_getln.c
index ce32dbe33..5e32f2b6c 100644
--- 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:
diff --git a/src/testdir/test_cmdline.vim b/src/testdir/test_cmdline.vim
index 26a50e010..f8d612565 100644
--- 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&
diff --git a/src/version.c b/src/version.c
index 86aaec9e2..c6f60af27 100644
--- a/src/version.c
+++ b/src/version.c
@@ -758,6 +758,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 2017,
+/**/
2016,
/**/
2015,