Hi,

On Tue, Aug 30, 2016 at 6:25 AM, Mathias Stearn
<[email protected]> wrote:
> They are not used for commands like cfile, cbuffer and cexpr etc.
>
> Actually, cfile is one of the commands that triggers QuickFixCmdPre/Post:
> https://github.com/vim/vim/blob/bc8801c/runtime/doc/autocmd.txt#L780-L801
>

The attached patch fixes this problem. Now the pre/post autocmds are invoked
for the cexpr/cgetexpr/caddexpr/cbuffer/cgetbuffer/caddbuffer commands also.

- Yegappan

>
> Is there a better way to achieve the goal of always opening the quickfix
> window whenever I run a command that populates it?
>

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.
diff --git a/runtime/doc/autocmd.txt b/runtime/doc/autocmd.txt
index e3ba3d7..e5dc741 100644
--- a/runtime/doc/autocmd.txt
+++ b/runtime/doc/autocmd.txt
@@ -784,7 +784,9 @@ QuickFixCmdPre                      Before a quickfix 
command is run (|:make|,
                                |:vimgrepadd|, |:lvimgrepadd|, |:cscope|,
                                |:cfile|, |:cgetfile|, |:caddfile|, |:lfile|,
                                |:lgetfile|, |:laddfile|, |:helpgrep|,
-                               |:lhelpgrep|).
+                               |:lhelpgrep|, |:cexpr|, |:cgetexpr|,
+                               |:caddexpr|, |:cbuffer|, |:cgetbuffer|,
+                               |:caddbuffer|).
                                The pattern is matched against the command
                                being run.  When |:grep| is used but 'grepprg'
                                is set to "internal" it still matches "grep".
diff --git a/src/quickfix.c b/src/quickfix.c
index d022061..2f5256b 100644
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -4845,6 +4845,9 @@ ex_cbuffer(exarg_T *eap)
 {
     buf_T      *buf = NULL;
     qf_info_T  *qi = &ql_info;
+#ifdef FEAT_AUTOCMD
+    char_u     *au_name = NULL;
+#endif
 
     if (eap->cmdidx == CMD_lbuffer || eap->cmdidx == CMD_lgetbuffer
            || eap->cmdidx == CMD_laddbuffer)
@@ -4854,6 +4857,28 @@ ex_cbuffer(exarg_T *eap)
            return;
     }
 
+#ifdef FEAT_AUTOCMD
+    switch (eap->cmdidx)
+    {
+       case CMD_cbuffer:       au_name = (char_u *)"cbuffer"; break;
+       case CMD_cgetbuffer:    au_name = (char_u *)"cgetbuffer"; break;
+       case CMD_caddbuffer:    au_name = (char_u *)"caddbuffer"; break;
+       case CMD_lbuffer:       au_name = (char_u *)"lbuffer"; break;
+       case CMD_lgetbuffer:    au_name = (char_u *)"lgetbuffer"; break;
+       case CMD_laddbuffer:    au_name = (char_u *)"laddbuffer"; break;
+       default: break;
+    }
+    if (au_name != NULL)
+    {
+       apply_autocmds(EVENT_QUICKFIXCMDPRE, au_name,
+                                              curbuf->b_fname, TRUE, curbuf);
+# ifdef FEAT_EVAL
+       if (did_throw || force_abort)
+           return;
+# endif
+    }
+#endif
+
     if (*eap->arg == NUL)
        buf = curbuf;
     else if (*skipwhite(skipdigits(eap->arg)) == NUL)
@@ -4887,10 +4912,16 @@ ex_cbuffer(exarg_T *eap)
                            (eap->cmdidx != CMD_caddbuffer
                             && eap->cmdidx != CMD_laddbuffer),
                                                   eap->line1, eap->line2,
-                                                  qf_title) > 0
-                   && (eap->cmdidx == CMD_cbuffer
-                       || eap->cmdidx == CMD_lbuffer))
-               qf_jump(qi, 0, 0, eap->forceit);  /* display first error */
+                                                  qf_title) > 0)
+           {
+#ifdef FEAT_AUTOCMD
+               if (au_name != NULL)
+                   apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name,
+                           curbuf->b_fname, TRUE, curbuf);
+#endif
+               if (eap->cmdidx == CMD_cbuffer || eap->cmdidx == CMD_lbuffer)
+                   qf_jump(qi, 0, 0, eap->forceit);  /* display first error */
+           }
        }
     }
 }
@@ -4905,6 +4936,9 @@ ex_cexpr(exarg_T *eap)
 {
     typval_T   *tv;
     qf_info_T  *qi = &ql_info;
+#ifdef FEAT_AUTOCMD
+    char_u     *au_name = NULL;
+#endif
 
     if (eap->cmdidx == CMD_lexpr || eap->cmdidx == CMD_lgetexpr
            || eap->cmdidx == CMD_laddexpr)
@@ -4914,6 +4948,28 @@ ex_cexpr(exarg_T *eap)
            return;
     }
 
+#ifdef FEAT_AUTOCMD
+    switch (eap->cmdidx)
+    {
+       case CMD_cexpr:     au_name = (char_u *)"cexpr"; break;
+       case CMD_cgetexpr:  au_name = (char_u *)"cgetexpr"; break;
+       case CMD_caddexpr:  au_name = (char_u *)"caddexpr"; break;
+       case CMD_lexpr:     au_name = (char_u *)"lexpr"; break;
+       case CMD_lgetexpr:  au_name = (char_u *)"lgetexpr"; break;
+       case CMD_laddexpr:  au_name = (char_u *)"laddexpr"; break;
+       default: break;
+    }
+    if (au_name != NULL)
+    {
+       apply_autocmds(EVENT_QUICKFIXCMDPRE, au_name,
+                                              curbuf->b_fname, TRUE, curbuf);
+# ifdef FEAT_EVAL
+       if (did_throw || force_abort)
+           return;
+# endif
+    }
+#endif
+
     /* Evaluate the expression.  When the result is a string or a list we can
      * use it to fill the errorlist. */
     tv = eval_expr(eap->arg, NULL);
@@ -4925,10 +4981,16 @@ ex_cexpr(exarg_T *eap)
            if (qf_init_ext(qi, NULL, NULL, tv, p_efm,
                            (eap->cmdidx != CMD_caddexpr
                             && eap->cmdidx != CMD_laddexpr),
-                                (linenr_T)0, (linenr_T)0, *eap->cmdlinep) > 0
-                   && (eap->cmdidx == CMD_cexpr
-                       || eap->cmdidx == CMD_lexpr))
-               qf_jump(qi, 0, 0, eap->forceit);  /* display first error */
+                                (linenr_T)0, (linenr_T)0, *eap->cmdlinep) > 0)
+           {
+#ifdef FEAT_AUTOCMD
+               if (au_name != NULL)
+                   apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name,
+                           curbuf->b_fname, TRUE, curbuf);
+#endif
+               if (eap->cmdidx == CMD_cexpr || eap->cmdidx == CMD_lexpr)
+                   qf_jump(qi, 0, 0, eap->forceit);  /* display first error */
+           }
        }
        else
            EMSG(_("E777: String or List expected"));
diff --git a/src/testdir/test_quickfix.vim b/src/testdir/test_quickfix.vim
index 5c51477..affd8e6 100644
--- a/src/testdir/test_quickfix.vim
+++ b/src/testdir/test_quickfix.vim
@@ -1554,3 +1554,38 @@ function Test_qf_property()
     call Xproperty_tests('c')
     call Xproperty_tests('l')
 endfunction
+
+" Tests for the QuickFixCmdPre/QuickFixCmdPost autocommands
+function QfAutoCmdHandler(loc, cmd)
+  call add(g:acmds, a:loc . a:cmd)
+endfunction
+
+function Test_Autocmd()
+  autocmd QuickFixCmdPre * call QfAutoCmdHandler('pre', expand('<amatch>'))
+  autocmd QuickFixCmdPost * call QfAutoCmdHandler('post', expand('<amatch>'))
+
+  let g:acmds = []
+  cexpr "F1:10:Line 10"
+  caddexpr "F1:20:Line 20"
+  cgetexpr "F1:30:Line 30"
+  enew! | call append(0, "F2:10:Line 10")
+  cbuffer!
+  enew! | call append(0, "F2:20:Line 20")
+  cgetbuffer
+  enew! | call append(0, "F2:30:Line 30")
+  caddbuffer
+
+  let l = ['precexpr',
+             \ 'postcexpr',
+             \ 'precaddexpr',
+             \ 'postcaddexpr',
+             \ 'precgetexpr',
+             \ 'postcgetexpr',
+             \ 'precbuffer',
+             \ 'postcbuffer',
+             \ 'precgetbuffer',
+             \ 'postcgetbuffer',
+             \ 'precaddbuffer',
+             \ 'postcaddbuffer']
+  call assert_equal(l, g:acmds)
+endfunction

Raspunde prin e-mail lui