1
0
forked from aniani/vim

patch 7.4.2299

Problem:    QuickFixCmdPre and QuickFixCmdPost autocommands are not always
            triggered.
Solution:   Also trigger on ":expr", ":cbuffer", etc. (Yegappan Lakshmanan)
This commit is contained in:
Bram Moolenaar
2016-09-01 15:45:58 +02:00
parent 0874a83e9b
commit 04c4ce650f
3 changed files with 107 additions and 8 deletions

View File

@@ -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"));

View File

@@ -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

View File

@@ -763,6 +763,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
2299,
/**/
2298,
/**/