To: vim_dev@googlegroups.com Subject: Patch 7.4.2299 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.4.2299 Problem: QuickFixCmdPre and QuickFixCmdPost autocommands are not always triggered. Solution: Also trigger on ":expr", ":cbuffer", etc. (Yegappan Lakshmanan) Files: src/quickfix.c, src/testdir/test_quickfix.vim *** ../vim-7.4.2298/src/quickfix.c 2016-08-29 22:48:12.165106045 +0200 --- src/quickfix.c 2016-09-01 15:40:55.232951961 +0200 *************** *** 4845,4850 **** --- 4845,4853 ---- { 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,4859 **** --- 4857,4884 ---- 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,4896 **** (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 */ } } } --- 4912,4927 ---- (eap->cmdidx != CMD_caddbuffer && eap->cmdidx != CMD_laddbuffer), eap->line1, eap->line2, ! 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,4910 **** --- 4936,4944 ---- { 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,4919 **** --- 4948,4975 ---- 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,4934 **** 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 EMSG(_("E777: String or List expected")); --- 4981,4996 ---- 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) ! { ! #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")); *** ../vim-7.4.2298/src/testdir/test_quickfix.vim 2016-08-27 13:35:31.064015024 +0200 --- src/testdir/test_quickfix.vim 2016-09-01 15:39:30.389685556 +0200 *************** *** 1554,1556 **** --- 1554,1591 ---- 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 *** ../vim-7.4.2298/src/version.c 2016-09-01 15:11:13.548265402 +0200 --- src/version.c 2016-09-01 15:42:01.796376517 +0200 *************** *** 765,766 **** --- 765,768 ---- { /* Add new patch number below this line */ + /**/ + 2299, /**/ -- I have a watch cat! Just break in and she'll watch. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///