]> granicus.if.org Git - vim/commitdiff
patch 8.1.2017: cannot execute commands after closing the cmdline window v8.1.2017
authorBram Moolenaar <Bram@vim.org>
Mon, 9 Sep 2019 16:35:33 +0000 (18:35 +0200)
committerBram Moolenaar <Bram@vim.org>
Mon, 9 Sep 2019 16:35:33 +0000 (18:35 +0200)
Problem:    Cannot execute commands after closing the cmdline window.
Solution:   Also trigger BufEnter and WinEnter. (closes #4762)

runtime/doc/autocmd.txt
runtime/doc/cmdline.txt
src/ex_getln.c
src/testdir/test_cmdline.vim
src/version.c

index 78936519f24053c40fcda245d629b38bfaef22fe..aa28362839b03f61670e784c75fb787b4a389473 100644 (file)
@@ -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|
index 22b4e6fdf33d53231ad87c83a5eceac8714c060e..a3aeb18865f08b1340a205fe0fec3f4666ff9366 100644 (file)
@@ -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
index ce32dbe330696487bab179f54384b740936627ff..5e32f2b6c95b0596bb577c7b2a14012d5918b89b 100644 (file)
@@ -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:
index 26a50e0102a0a8391e8564dee707016de2103d78..f8d612565339a5263aca7d3aa85b22e7c500c4d8 100644 (file)
@@ -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&
index 86aaec9e2a65afc1bba7a818ba76189c216825a3..c6f60af27251fe77095a3613dde34bab8212aead 100644 (file)
@@ -757,6 +757,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2017,
 /**/
     2016,
 /**/