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:
@@ -4845,6 +4845,9 @@ ex_cbuffer(exarg_T *eap)
|
|||||||
{
|
{
|
||||||
buf_T *buf = NULL;
|
buf_T *buf = NULL;
|
||||||
qf_info_T *qi = &ql_info;
|
qf_info_T *qi = &ql_info;
|
||||||
|
#ifdef FEAT_AUTOCMD
|
||||||
|
char_u *au_name = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (eap->cmdidx == CMD_lbuffer || eap->cmdidx == CMD_lgetbuffer
|
if (eap->cmdidx == CMD_lbuffer || eap->cmdidx == CMD_lgetbuffer
|
||||||
|| eap->cmdidx == CMD_laddbuffer)
|
|| eap->cmdidx == CMD_laddbuffer)
|
||||||
@@ -4854,6 +4857,28 @@ ex_cbuffer(exarg_T *eap)
|
|||||||
return;
|
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)
|
if (*eap->arg == NUL)
|
||||||
buf = curbuf;
|
buf = curbuf;
|
||||||
else if (*skipwhite(skipdigits(eap->arg)) == NUL)
|
else if (*skipwhite(skipdigits(eap->arg)) == NUL)
|
||||||
@@ -4887,10 +4912,16 @@ ex_cbuffer(exarg_T *eap)
|
|||||||
(eap->cmdidx != CMD_caddbuffer
|
(eap->cmdidx != CMD_caddbuffer
|
||||||
&& eap->cmdidx != CMD_laddbuffer),
|
&& eap->cmdidx != CMD_laddbuffer),
|
||||||
eap->line1, eap->line2,
|
eap->line1, eap->line2,
|
||||||
qf_title) > 0
|
qf_title) > 0)
|
||||||
&& (eap->cmdidx == CMD_cbuffer
|
{
|
||||||
|| eap->cmdidx == CMD_lbuffer))
|
#ifdef FEAT_AUTOCMD
|
||||||
qf_jump(qi, 0, 0, eap->forceit); /* display first error */
|
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;
|
typval_T *tv;
|
||||||
qf_info_T *qi = &ql_info;
|
qf_info_T *qi = &ql_info;
|
||||||
|
#ifdef FEAT_AUTOCMD
|
||||||
|
char_u *au_name = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (eap->cmdidx == CMD_lexpr || eap->cmdidx == CMD_lgetexpr
|
if (eap->cmdidx == CMD_lexpr || eap->cmdidx == CMD_lgetexpr
|
||||||
|| eap->cmdidx == CMD_laddexpr)
|
|| eap->cmdidx == CMD_laddexpr)
|
||||||
@@ -4914,6 +4948,28 @@ ex_cexpr(exarg_T *eap)
|
|||||||
return;
|
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
|
/* Evaluate the expression. When the result is a string or a list we can
|
||||||
* use it to fill the errorlist. */
|
* use it to fill the errorlist. */
|
||||||
tv = eval_expr(eap->arg, NULL);
|
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,
|
if (qf_init_ext(qi, NULL, NULL, tv, p_efm,
|
||||||
(eap->cmdidx != CMD_caddexpr
|
(eap->cmdidx != CMD_caddexpr
|
||||||
&& eap->cmdidx != CMD_laddexpr),
|
&& eap->cmdidx != CMD_laddexpr),
|
||||||
(linenr_T)0, (linenr_T)0, *eap->cmdlinep) > 0
|
(linenr_T)0, (linenr_T)0, *eap->cmdlinep) > 0)
|
||||||
&& (eap->cmdidx == CMD_cexpr
|
{
|
||||||
|| eap->cmdidx == CMD_lexpr))
|
#ifdef FEAT_AUTOCMD
|
||||||
qf_jump(qi, 0, 0, eap->forceit); /* display first error */
|
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
|
else
|
||||||
EMSG(_("E777: String or List expected"));
|
EMSG(_("E777: String or List expected"));
|
||||||
|
@@ -1554,3 +1554,38 @@ function Test_qf_property()
|
|||||||
call Xproperty_tests('c')
|
call Xproperty_tests('c')
|
||||||
call Xproperty_tests('l')
|
call Xproperty_tests('l')
|
||||||
endfunction
|
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
|
||||||
|
@@ -763,6 +763,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
2299,
|
||||||
/**/
|
/**/
|
||||||
2298,
|
2298,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user