To: vim_dev@googlegroups.com Subject: Patch 8.2.2289 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.2289 Problem: Vim9: 'cpo' can become empty. Solution: Use empty_option instead of an empty string. Update quickfix buffer after restoring 'cpo'. (closes #7608) Files: src/evalfunc.c, src/syntax.c, src/eval.c, src/quickfix.c, src/evalbuffer.c, src/ex_eval.c, src/gui_motif.c, src/map.c, src/testdir/test_quickfix.vim *** ../vim-8.2.2288/src/evalfunc.c 2020-12-28 12:56:54.179617297 +0100 --- src/evalfunc.c 2021-01-03 19:40:07.503140131 +0100 *************** *** 6316,6322 **** // Make 'cpoptions' empty, the 'l' flag should not be used here. save_cpo = p_cpo; ! p_cpo = (char_u *)""; rettv->vval.v_number = -1; if (type == MATCH_LIST || type == MATCH_POS) --- 6316,6322 ---- // Make 'cpoptions' empty, the 'l' flag should not be used here. save_cpo = p_cpo; ! p_cpo = empty_option; rettv->vval.v_number = -1; if (type == MATCH_LIST || type == MATCH_POS) *************** *** 8024,8031 **** --- 8024,8037 ---- if (p_cpo == empty_option) p_cpo = save_cpo; else + { // Darn, evaluating the {skip} expression changed the value. + // If it's still empty it was changed and restored, need to restore in + // the complicated way. + if (*p_cpo == NUL) + set_option_value((char_u *)"cpo", 0L, save_cpo, 0); free_string_option(save_cpo); + } return retval; } *************** *** 8723,8729 **** // Make 'cpoptions' empty, the 'l' flag should not be used here. save_cpo = p_cpo; ! p_cpo = (char_u *)""; str = tv_get_string(&argvars[0]); if (argvars[1].v_type != VAR_UNKNOWN) --- 8729,8735 ---- // Make 'cpoptions' empty, the 'l' flag should not be used here. save_cpo = p_cpo; ! p_cpo = empty_option; str = tv_get_string(&argvars[0]); if (argvars[1].v_type != VAR_UNKNOWN) *** ../vim-8.2.2288/src/syntax.c 2020-11-29 14:11:33.159022814 +0100 --- src/syntax.c 2021-01-03 19:41:50.346592075 +0100 *************** *** 5670,5676 **** // Make 'cpoptions' empty, to avoid the 'l' flag cpo_save = p_cpo; ! p_cpo = (char_u *)""; ci->sp_prog = vim_regcomp(ci->sp_pattern, RE_MAGIC); p_cpo = cpo_save; --- 5670,5676 ---- // Make 'cpoptions' empty, to avoid the 'l' flag cpo_save = p_cpo; ! p_cpo = empty_option; ci->sp_prog = vim_regcomp(ci->sp_pattern, RE_MAGIC); p_cpo = cpo_save; *************** *** 5858,5864 **** // Make 'cpoptions' empty, to avoid the 'l' flag cpo_save = p_cpo; ! p_cpo = (char_u *)""; curwin->w_s->b_syn_linecont_prog = vim_regcomp(curwin->w_s->b_syn_linecont_pat, RE_MAGIC); p_cpo = cpo_save; --- 5858,5864 ---- // Make 'cpoptions' empty, to avoid the 'l' flag cpo_save = p_cpo; ! p_cpo = empty_option; curwin->w_s->b_syn_linecont_prog = vim_regcomp(curwin->w_s->b_syn_linecont_pat, RE_MAGIC); p_cpo = cpo_save; *** ../vim-8.2.2288/src/eval.c 2021-01-01 21:05:51.222773812 +0100 --- src/eval.c 2021-01-03 19:38:29.071700147 +0100 *************** *** 1940,1946 **** // avoid 'l' flag in 'cpoptions' save_cpo = p_cpo; ! p_cpo = (char_u *)""; regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING); if (regmatch.regprog != NULL) { --- 1940,1946 ---- // avoid 'l' flag in 'cpoptions' save_cpo = p_cpo; ! p_cpo = empty_option; regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING); if (regmatch.regprog != NULL) { *************** *** 6200,6207 **** --- 6200,6213 ---- if (p_cpo == empty_option) p_cpo = save_cpo; else + { // Darn, evaluating {sub} expression or {expr} changed the value. + // If it's still empty it was changed and restored, need to restore in + // the complicated way. + if (*p_cpo == NUL) + set_option_value((char_u *)"cpo", 0L, save_cpo, 0); free_string_option(save_cpo); + } return ret; } *** ../vim-8.2.2288/src/quickfix.c 2020-12-22 11:40:40.669481249 +0100 --- src/quickfix.c 2021-01-03 19:48:59.668580325 +0100 *************** *** 8099,8104 **** --- 8099,8105 ---- int new_qi = FALSE; char_u *au_name = NULL; char_u *lang = NULL; + int updated = FALSE; switch (eap->cmdidx) { *************** *** 8150,8163 **** qfl->qf_ptr = qfl->qf_start; qfl->qf_index = 1; qf_list_changed(qfl); ! qf_update_buffer(qi, NULL); } if (p_cpo == empty_option) p_cpo = save_cpo; else ! // Darn, some plugin changed the value. free_string_option(save_cpo); if (au_name != NULL) { --- 8151,8174 ---- qfl->qf_ptr = qfl->qf_start; qfl->qf_index = 1; qf_list_changed(qfl); ! updated = TRUE; } if (p_cpo == empty_option) p_cpo = save_cpo; else ! { ! // Darn, some plugin changed the value. If it's still empty it was ! // changed and restored, need to restore in the complicated way. ! if (*p_cpo == NUL) ! set_option_value((char_u *)"cpo", 0L, save_cpo, 0); free_string_option(save_cpo); + } + + if (updated) + // This may open a window and source scripts, do this after 'cpo' was + // restored. + qf_update_buffer(qi, NULL); if (au_name != NULL) { *** ../vim-8.2.2288/src/evalbuffer.c 2021-01-02 13:53:55.345783905 +0100 --- src/evalbuffer.c 2021-01-03 19:38:54.179553553 +0100 *************** *** 68,74 **** save_magic = p_magic; p_magic = TRUE; save_cpo = p_cpo; ! p_cpo = (char_u *)""; buf = buflist_findnr(buflist_findpat(name, name + STRLEN(name), TRUE, FALSE, curtab_only)); --- 68,74 ---- save_magic = p_magic; p_magic = TRUE; save_cpo = p_cpo; ! p_cpo = empty_option; buf = buflist_findnr(buflist_findpat(name, name + STRLEN(name), TRUE, FALSE, curtab_only)); *** ../vim-8.2.2288/src/ex_eval.c 2020-12-19 17:55:50.810666202 +0100 --- src/ex_eval.c 2021-01-03 19:40:35.182989235 +0100 *************** *** 1695,1701 **** *end = NUL; } save_cpo = p_cpo; ! p_cpo = (char_u *)""; // Disable error messages, it will make current_exception // invalid. ++emsg_off; --- 1695,1701 ---- *end = NUL; } save_cpo = p_cpo; ! p_cpo = empty_option; // Disable error messages, it will make current_exception // invalid. ++emsg_off; *** ../vim-8.2.2288/src/gui_motif.c 2020-11-05 20:50:45.331984998 +0100 --- src/gui_motif.c 2021-01-03 19:41:02.386843466 +0100 *************** *** 3525,3531 **** char_u *save_cpo = p_cpo; // No need to be Vi compatible here. ! p_cpo = (char_u *)""; u_undo(1); p_cpo = save_cpo; gui_update_screen(); --- 3525,3531 ---- char_u *save_cpo = p_cpo; // No need to be Vi compatible here. ! p_cpo = empty_options; u_undo(1); p_cpo = save_cpo; gui_update_screen(); *** ../vim-8.2.2288/src/map.c 2020-12-18 19:49:52.341571870 +0100 --- src/map.c 2021-01-03 19:41:25.626720783 +0100 *************** *** 2475,2481 **** char_u *s; char_u *cpo_save = p_cpo; ! p_cpo = (char_u *)""; // Allow <> notation s = vim_strsave(map); if (s != NULL) { --- 2475,2481 ---- char_u *s; char_u *cpo_save = p_cpo; ! p_cpo = empty_option; // Allow <> notation s = vim_strsave(map); if (s != NULL) { *** ../vim-8.2.2288/src/testdir/test_quickfix.vim 2020-12-16 21:02:51.642934141 +0100 --- src/testdir/test_quickfix.vim 2021-01-03 19:47:26.604988132 +0100 *************** *** 702,707 **** --- 702,727 ---- call s:test_xhelpgrep('l') endfunc + def Test_helpgrep_vim9_restore_cpo() + assert_equal('aABceFs', &cpo) + + var rtp_save = &rtp + var dir = 'Xruntime/after' + &rtp ..= ',' .. dir + mkdir(dir .. '/ftplugin', 'p') + writefile(['vim9'], dir .. '/ftplugin/qf.vim') + filetype plugin on + silent helpgrep grail + cwindow + silent helpgrep grail + + assert_equal('aABceFs', &cpo) + delete(dir, 'rf') + &rtp = rtp_save + cclose + helpclose + enddef + func Test_errortitle() augroup QfBufWinEnter au! *** ../vim-8.2.2288/src/version.c 2021-01-03 18:33:09.992382498 +0100 --- src/version.c 2021-01-03 19:49:39.684408496 +0100 *************** *** 752,753 **** --- 752,755 ---- { /* Add new patch number below this line */ + /**/ + 2289, /**/ -- % cat /usr/include/long_life.h long life(double fun); /// 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 ///