]> granicus.if.org Git - vim/commitdiff
patch 8.2.3547: opening the quickfix window triggers BufWinEnter twice v8.2.3547
authorBram Moolenaar <Bram@vim.org>
Wed, 20 Oct 2021 20:58:42 +0000 (21:58 +0100)
committerBram Moolenaar <Bram@vim.org>
Wed, 20 Oct 2021 20:58:42 +0000 (21:58 +0100)
Problem:    Opening the quickfix window triggers BufWinEnter twice. (Yorick
            Peterse)
Solution:   Only trigger BufWinEnter with "quickfix". (closes #9022)

src/buffer.c
src/ex_cmds.c
src/quickfix.c
src/testdir/test_quickfix.vim
src/version.c
src/vim.h

index 808249908c1f2a9ac1a73be5437d5f367f0db397..31f902d779705009018a8fbe75f4100419da75a7 100644 (file)
@@ -360,11 +360,12 @@ open_buffer(
            do_modelines(0);
            curbuf->b_flags &= ~(BF_CHECK_RO | BF_NEVERLOADED);
 
+           if ((flags & READ_NOWINENTER) == 0)
 #ifdef FEAT_EVAL
-           apply_autocmds_retval(EVENT_BUFWINENTER, NULL, NULL, FALSE, curbuf,
-                                                                     &retval);
+               apply_autocmds_retval(EVENT_BUFWINENTER, NULL, NULL, FALSE,
+                                                             curbuf, &retval);
 #else
-           apply_autocmds(EVENT_BUFWINENTER, NULL, NULL, FALSE, curbuf);
+               apply_autocmds(EVENT_BUFWINENTER, NULL, NULL, FALSE, curbuf);
 #endif
 
            // restore curwin/curbuf and a few other things
index ff915173f77e45ed1aeb5a91d19b0a84ba679926..079dcf10e9ca654772477856ad3a0727df6aea15 100644 (file)
@@ -2473,6 +2473,7 @@ theend:
  *     ECMD_FORCEIT: ! used for Ex command
  *      ECMD_ADDBUF: don't edit, just add to buffer list
  *      ECMD_ALTBUF: like ECMD_ADDBUF and also set the alternate file
+ *   ECMD_NOWINENTER: Do not trigger BufWinEnter
  *   oldwin: Should be "curwin" when editing a new buffer in the current
  *          window, NULL when splitting the window first.  When not NULL info
  *          of the previous buffer for "oldwin" is stored.
@@ -3030,6 +3031,8 @@ do_ecmd(
            /*
             * Open the buffer and read the file.
             */
+           if (flags & ECMD_NOWINENTER)
+               readfile_flags |= READ_NOWINENTER;
 #if defined(FEAT_EVAL)
            if (should_abort(open_buffer(FALSE, eap, readfile_flags)))
                retval = FAIL;
@@ -3051,10 +3054,11 @@ do_ecmd(
            // changed by the user.
            do_modelines(OPT_WINONLY);
 
-           apply_autocmds_retval(EVENT_BUFENTER, NULL, NULL, FALSE, curbuf,
-                                                                   &retval);
-           apply_autocmds_retval(EVENT_BUFWINENTER, NULL, NULL, FALSE, curbuf,
-                                                                   &retval);
+           apply_autocmds_retval(EVENT_BUFENTER, NULL, NULL, FALSE,
+                                                             curbuf, &retval);
+           if ((flags & ECMD_NOWINENTER) == 0)
+               apply_autocmds_retval(EVENT_BUFWINENTER, NULL, NULL, FALSE,
+                                                             curbuf, &retval);
        }
        check_arg_idx(curwin);
 
index 7cc83e3ed03ec94c7c0e85a615eeb635cbea7330..3fb921ff27f71971a408e394586da8d2df36aaa5 100644 (file)
@@ -4199,13 +4199,14 @@ qf_open_new_cwindow(qf_info_T *qi, int height)
     {
        // Use the existing quickfix buffer
        if (do_ecmd(qf_buf->b_fnum, NULL, NULL, NULL, ECMD_ONE,
-                                     ECMD_HIDE + ECMD_OLDBUF, oldwin) == FAIL)
+                   ECMD_HIDE + ECMD_OLDBUF + ECMD_NOWINENTER, oldwin) == FAIL)
            return FAIL;
     }
     else
     {
        // Create a new quickfix buffer
-       if (do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE, oldwin) == FAIL)
+       if (do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE + ECMD_NOWINENTER,
+                                                              oldwin) == FAIL)
            return FAIL;
 
        // save the number of the new buffer
index e22f6b28d9f4af0d0defcc17c53703ef9e4cc813..3b7a4ecb91a72b8bbb27cd141aec1e4115bd4cee 100644 (file)
@@ -786,6 +786,23 @@ func Test_vimgreptitle()
   augroup! QfBufWinEnter
 endfunc
 
+func Test_bufwinenter_once()
+  augroup QfBufWinEnter
+    au!
+    au BufWinEnter * let g:got_afile ..= 'got ' .. expand('<afile>')
+  augroup END
+  let g:got_afile = ''
+  copen
+  call assert_equal('got quickfix', g:got_afile)
+
+  cclose
+  unlet g:got_afile
+  augroup QfBufWinEnter
+    au!
+  augroup END
+  augroup! QfBufWinEnter
+endfunc
+
 func XqfTitleTests(cchar)
   call s:setup_commands(a:cchar)
 
index d1f550e01b4a888c8a7f5daf7d0f59c138595ffb..3f80877da912146d475bbf56dbb85a4c2270749d 100644 (file)
@@ -757,6 +757,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3547,
 /**/
     3546,
 /**/
index d2e0d9be352d5f9c899b167c63736c267f0f2597..0ce0e964e2e359a356740bb74ae75a34693731e7 100644 (file)
--- a/src/vim.h
+++ b/src/vim.h
@@ -977,6 +977,7 @@ extern int (*dyn_libintl_wputenv)(const wchar_t *envstring);
 #define READ_DUMMY     0x10    // reading into a dummy buffer
 #define READ_KEEP_UNDO 0x20    // keep undo info
 #define READ_FIFO      0x40    // read from fifo or socket
+#define READ_NOWINENTER 0x80   // do not trigger BufWinEnter
 
 // Values for change_indent()
 #define INDENT_SET     1       // set indent
@@ -1043,6 +1044,7 @@ extern int (*dyn_libintl_wputenv)(const wchar_t *envstring);
 #define ECMD_FORCEIT   0x08    // ! used in Ex command
 #define ECMD_ADDBUF    0x10    // don't edit, just add to buffer list
 #define ECMD_ALTBUF    0x20    // like ECMD_ADDBUF and set the alternate file
+#define ECMD_NOWINENTER        0x40    // do not trigger BufWinEnter
 
 // for lnum argument in do_ecmd()
 #define ECMD_LASTL     (linenr_T)0     // use last position in loaded file