aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/nvim/quickfix.c109
-rw-r--r--src/nvim/testdir/test_quickfix.vim35
-rw-r--r--src/nvim/version.c2
3 files changed, 127 insertions, 19 deletions
diff --git a/src/nvim/quickfix.c b/src/nvim/quickfix.c
index efa1401498..c4b8d266cf 100644
--- a/src/nvim/quickfix.c
+++ b/src/nvim/quickfix.c
@@ -4278,14 +4278,46 @@ int set_errorlist(win_T *wp, list_T *list, int action, char_u *title,
*/
void ex_cbuffer(exarg_T *eap)
{
- buf_T *buf = NULL;
- qf_info_T *qi = &ql_info;
+ buf_T *buf = NULL;
+ qf_info_T *qi = &ql_info;
+ const char *au_name = NULL;
if (eap->cmdidx == CMD_lbuffer || eap->cmdidx == CMD_lgetbuffer
|| eap->cmdidx == CMD_laddbuffer) {
qi = ll_get_or_alloc_list(curwin);
}
+ switch (eap->cmdidx) {
+ case CMD_cbuffer:
+ au_name = "cbuffer";
+ break;
+ case CMD_cgetbuffer:
+ au_name = "cgetbuffer";
+ break;
+ case CMD_caddbuffer:
+ au_name = "caddbuffer";
+ break;
+ case CMD_lbuffer:
+ au_name = "lbuffer";
+ break;
+ case CMD_lgetbuffer:
+ au_name = "lgetbuffer";
+ break;
+ case CMD_laddbuffer:
+ au_name = "laddbuffer";
+ break;
+ default:
+ break;
+ }
+
+ if (au_name != NULL) {
+ apply_autocmds(EVENT_QUICKFIXCMDPRE, (char_u *)au_name,
+ curbuf->b_fname, true, curbuf);
+ if (did_throw || force_abort) {
+ return;
+ }
+ }
+
if (*eap->arg == NUL)
buf = curbuf;
else if (*skipwhite(skipdigits(eap->arg)) == NUL)
@@ -4312,13 +4344,17 @@ void ex_cbuffer(exarg_T *eap)
}
if (qf_init_ext(qi, NULL, buf, NULL, p_efm,
- (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 */
+ (eap->cmdidx != CMD_caddbuffer
+ && eap->cmdidx != CMD_laddbuffer),
+ eap->line1, eap->line2, qf_title) > 0) {
+ if (au_name != NULL) {
+ apply_autocmds(EVENT_QUICKFIXCMDPOST, (char_u *)au_name,
+ curbuf->b_fname, true, curbuf);
+ }
+ if (eap->cmdidx == CMD_cbuffer || eap->cmdidx == CMD_lbuffer) {
+ qf_jump(qi, 0, 0, eap->forceit); // display first error
+ }
+ }
}
}
}
@@ -4329,14 +4365,45 @@ void ex_cbuffer(exarg_T *eap)
*/
void ex_cexpr(exarg_T *eap)
{
- typval_T *tv;
- qf_info_T *qi = &ql_info;
+ typval_T *tv;
+ qf_info_T *qi = &ql_info;
+ const char *au_name = NULL;
if (eap->cmdidx == CMD_lexpr || eap->cmdidx == CMD_lgetexpr
|| eap->cmdidx == CMD_laddexpr) {
qi = ll_get_or_alloc_list(curwin);
}
+ switch (eap->cmdidx) {
+ case CMD_cexpr:
+ au_name = "cexpr";
+ break;
+ case CMD_cgetexpr:
+ au_name = "cgetexpr";
+ break;
+ case CMD_caddexpr:
+ au_name = "caddexpr";
+ break;
+ case CMD_lexpr:
+ au_name = "lexpr";
+ break;
+ case CMD_lgetexpr:
+ au_name = "lgetexpr";
+ break;
+ case CMD_laddexpr:
+ au_name = "laddexpr";
+ break;
+ default:
+ break;
+ }
+ if (au_name != NULL) {
+ apply_autocmds(EVENT_QUICKFIXCMDPRE, (char_u *)au_name,
+ curbuf->b_fname, true, curbuf);
+ if (did_throw || force_abort) {
+ return;
+ }
+ }
+
/* 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);
@@ -4344,14 +4411,20 @@ void ex_cexpr(exarg_T *eap)
if ((tv->v_type == VAR_STRING && tv->vval.v_string != NULL)
|| (tv->v_type == VAR_LIST && tv->vval.v_list != NULL)) {
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 */
- } else
+ (eap->cmdidx != CMD_caddexpr
+ && eap->cmdidx != CMD_laddexpr),
+ (linenr_T)0, (linenr_T)0, *eap->cmdlinep) > 0) {
+ if (au_name != NULL) {
+ apply_autocmds(EVENT_QUICKFIXCMDPOST, (char_u *)au_name,
+ curbuf->b_fname, true, curbuf);
+ }
+ 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"));
+ }
free_tv(tv);
}
}
diff --git a/src/nvim/testdir/test_quickfix.vim b/src/nvim/testdir/test_quickfix.vim
index 02f8da8b23..50fe6ce977 100644
--- a/src/nvim/testdir/test_quickfix.vim
+++ b/src/nvim/testdir/test_quickfix.vim
@@ -1525,3 +1525,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
diff --git a/src/nvim/version.c b/src/nvim/version.c
index eae0da98f4..ef865a3c71 100644
--- a/src/nvim/version.c
+++ b/src/nvim/version.c
@@ -141,7 +141,7 @@ static int included_patches[] = {
// 2302 NA
// 2301 NA
2300,
- // 2299,
+ 2299,
// 2298 NA
// 2297 NA
// 2296,