# HG changeset patch # User Christian Brabandt # Date 1472738409 -7200 # Node ID 21f685af3fc115c1782b8df6db4dca9372b634e5 # Parent 7990eba2d4e68d50acb64b696afdef781255bcb4 commit https://github.com/vim/vim/commit/04c4ce650f9e533cd35b2aa6803f4d354d3ec7aa Author: Bram Moolenaar Date: Thu Sep 1 15:45:58 2016 +0200 patch 7.4.2299 Problem: QuickFixCmdPre and QuickFixCmdPost autocommands are not always triggered. Solution: Also trigger on ":expr", ":cbuffer", etc. (Yegappan Lakshmanan) diff --git a/src/quickfix.c b/src/quickfix.c --- 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 --- 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('')) + autocmd QuickFixCmdPost * call QfAutoCmdHandler('post', expand('')) + + 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 diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -764,6 +764,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2299, +/**/ 2298, /**/ 2297,