]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.2.2289: Vim9: 'cpo' can become empty v8.2.2289
authorBram Moolenaar <Bram@vim.org>
Sun, 3 Jan 2021 18:52:05 +0000 (19:52 +0100)
committerBram Moolenaar <Bram@vim.org>
Sun, 3 Jan 2021 18:52:05 +0000 (19:52 +0100)
Problem:    Vim9: 'cpo' can become empty.
Solution:   Use empty_option instead of an empty string.  Update quickfix
            buffer after restoring 'cpo'.  (closes #7608)

src/eval.c
src/evalbuffer.c
src/evalfunc.c
src/ex_eval.c
src/gui_motif.c
src/map.c
src/quickfix.c
src/syntax.c
src/testdir/test_quickfix.vim
src/version.c

index ca1c55b4db82f261218a3c48a1f9574e6a34ff3d..87da4f325d4d974937016518084bbb92297625ad 100644 (file)
@@ -1940,7 +1940,7 @@ pattern_match(char_u *pat, char_u *text, int ic)
 
     // avoid 'l' flag in 'cpoptions'
     save_cpo = p_cpo;
-    p_cpo = (char_u *)"";
+    p_cpo = empty_option;
     regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING);
     if (regmatch.regprog != NULL)
     {
@@ -6200,8 +6200,14 @@ do_string_sub(
     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;
 }
index 376c1fe302f8a36b14df4581337c69133477ba4c..3fed3893e986121aec616121fcb970942d48353b 100644 (file)
@@ -68,7 +68,7 @@ buflist_find_by_name(char_u *name, int curtab_only)
     save_magic = p_magic;
     p_magic = TRUE;
     save_cpo = p_cpo;
-    p_cpo = (char_u *)"";
+    p_cpo = empty_option;
 
     buf = buflist_findnr(buflist_findpat(name, name + STRLEN(name),
                                                    TRUE, FALSE, curtab_only));
index 9b3b5beb664fb9018db36563ed67abb2885c99d8..07f1da9bb6a9b9348685c4fabe2e7019ca85fa2a 100644 (file)
@@ -6316,7 +6316,7 @@ find_some_match(typval_T *argvars, typval_T *rettv, matchtype_T type)
 
     // Make 'cpoptions' empty, the 'l' flag should not be used here.
     save_cpo = p_cpo;
-    p_cpo = (char_u *)"";
+    p_cpo = empty_option;
 
     rettv->vval.v_number = -1;
     if (type == MATCH_LIST || type == MATCH_POS)
@@ -8024,8 +8024,14 @@ theend:
     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,7 +8729,7 @@ f_split(typval_T *argvars, typval_T *rettv)
 
     // Make 'cpoptions' empty, the 'l' flag should not be used here.
     save_cpo = p_cpo;
-    p_cpo = (char_u *)"";
+    p_cpo = empty_option;
 
     str = tv_get_string(&argvars[0]);
     if (argvars[1].v_type != VAR_UNKNOWN)
index 2064cfa242b14ffc4e938beb00799dca1cae7a21..94338fcdb2c60aad68dd791fc39e30796d793eff 100644 (file)
@@ -1695,7 +1695,7 @@ ex_catch(exarg_T *eap)
                    *end = NUL;
                }
                save_cpo  = p_cpo;
-               p_cpo = (char_u *)"";
+               p_cpo = empty_option;
                // Disable error messages, it will make current_exception
                // invalid.
                ++emsg_off;
index ed2cfec67c4ec6570ccdcafc184281d41a647806..1863fa69abf475f6df8f56bfab4eb78963aeeb3a 100644 (file)
@@ -3525,7 +3525,7 @@ find_replace_callback(
        char_u  *save_cpo = p_cpo;
 
        // No need to be Vi compatible here.
-       p_cpo = (char_u *)"";
+       p_cpo = empty_options;
        u_undo(1);
        p_cpo = save_cpo;
        gui_update_screen();
index f3dd5693ae177b6196c0d6e0cbb90bbed62fd45f..917f1a244ff86ab938a4513b16c08d8b49b9082c 100644 (file)
--- a/src/map.c
+++ b/src/map.c
@@ -2475,7 +2475,7 @@ add_map(char_u *map, int mode)
     char_u     *s;
     char_u     *cpo_save = p_cpo;
 
-    p_cpo = (char_u *)"";      // Allow <> notation
+    p_cpo = empty_option;      // Allow <> notation
     s = vim_strsave(map);
     if (s != NULL)
     {
index 697a3d422d7a25c7c3beb8000fce0b854a9d277e..f22d2bf3cdb2b623c0557b253e6fb6c8df858f41 100644 (file)
@@ -8099,6 +8099,7 @@ ex_helpgrep(exarg_T *eap)
     int                new_qi = FALSE;
     char_u     *au_name =  NULL;
     char_u     *lang = NULL;
+    int                updated = FALSE;
 
     switch (eap->cmdidx)
     {
@@ -8150,14 +8151,24 @@ ex_helpgrep(exarg_T *eap)
        qfl->qf_ptr = qfl->qf_start;
        qfl->qf_index = 1;
        qf_list_changed(qfl);
-       qf_update_buffer(qi, NULL);
+       updated = TRUE;
     }
 
     if (p_cpo == empty_option)
        p_cpo = save_cpo;
     else
-       // Darn, some plugin changed the value.
+    {
+       // 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)
     {
index 890158c60eb02d8d3a8620b84bea8c7e6eb4943d..d4ec0d339fb4211ee1892ff3fe2aa92f8d74857e 100644 (file)
@@ -5670,7 +5670,7 @@ get_syn_pattern(char_u *arg, synpat_T *ci)
 
     // Make 'cpoptions' empty, to avoid the 'l' flag
     cpo_save = p_cpo;
-    p_cpo = (char_u *)"";
+    p_cpo = empty_option;
     ci->sp_prog = vim_regcomp(ci->sp_pattern, RE_MAGIC);
     p_cpo = cpo_save;
 
@@ -5858,7 +5858,7 @@ syn_cmd_sync(exarg_T *eap, int syncing UNUSED)
 
                // Make 'cpoptions' empty, to avoid the 'l' flag
                cpo_save = p_cpo;
-               p_cpo = (char_u *)"";
+               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;
index 888c2f4bf9990c5873c3b012b22682e25c8737ba..8667631d3b6339e3005bf66f5ac5adf173b072ff 100644 (file)
@@ -702,6 +702,26 @@ func Test_helpgrep()
   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!
index 557d1653da035a8850d2d74c6f0e4a80b238d7ba..c5017a461e770946531df1b09e3c835290c56d2d 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2289,
 /**/
     2288,
 /**/