]> granicus.if.org Git - vim/commitdiff
patch 8.2.4180: 'balloonexpr' is evaluated in the current script context v8.2.4180
authorBram Moolenaar <Bram@vim.org>
Sat, 22 Jan 2022 15:09:36 +0000 (15:09 +0000)
committerBram Moolenaar <Bram@vim.org>
Sat, 22 Jan 2022 15:09:36 +0000 (15:09 +0000)
Problem:    'balloonexpr' is evaluated in the current script context.
Solution:   Use the script context where the option was set.

src/beval.c
src/option.c
src/proto/option.pro
src/testdir/dumps/Test_balloon_eval_term_01.dump
src/testdir/dumps/Test_balloon_eval_term_01a.dump
src/testdir/dumps/Test_balloon_eval_term_02.dump
src/testdir/test_balloon.vim
src/version.c

index 8b7570b57560e402d2df019ff8244c7e0bae1abd..a9d10a202e19a28ce3f4c46c215e5111195f7942 100644 (file)
@@ -259,6 +259,8 @@ general_beval_cb(BalloonEval *beval, int state UNUSED)
                                                    : wp->w_buffer->b_p_bexpr;
        if (*bexpr != NUL)
        {
+           sctx_T      save_sctx = current_sctx;
+
            // Convert window pointer to number.
            for (cw = firstwin; cw != wp; cw = cw->w_next)
                ++winnr;
@@ -284,6 +286,16 @@ general_beval_cb(BalloonEval *beval, int state UNUSED)
                ++sandbox;
            ++textwinlock;
 
+           if (bexpr == p_bexpr)
+           {
+               sctx_T *sp = get_option_sctx("balloonexpr");
+
+               if (sp != NULL)
+                   current_sctx = *sp;
+           }
+           else
+               current_sctx = curbuf->b_p_script_ctx[BV_BEXPR];
+
            vim_free(result);
            result = eval_to_string(bexpr, TRUE);
 
@@ -300,6 +312,7 @@ general_beval_cb(BalloonEval *beval, int state UNUSED)
            if (use_sandbox)
                --sandbox;
            --textwinlock;
+           current_sctx = save_sctx;
 
            set_vim_var_string(VV_BEVAL_TEXT, NULL, -1);
            if (result != NULL && result[0] != NUL)
index 4cc6142b62fac72a432d696452f19ba4bf2c0f74..f6b6afad56ea87a82774be875af2d73b6ab96b44 100644 (file)
@@ -2614,6 +2614,21 @@ set_option_sctx_idx(int opt_idx, int opt_flags, sctx_T script_ctx)
     }
 }
 
+/*
+ * Get the script context of global option "name".
+ *
+ */
+    sctx_T *
+get_option_sctx(char *name)
+{
+    int idx = findoption((char_u *)name);
+
+    if (idx >= 0)
+       return &options[idx].script_ctx;
+    siemsg("no such option: %s", name);
+    return NULL;
+}
+
 /*
  * Set the script_ctx for a termcap option.
  * "name" must be the two character code, e.g. "RV".
index a099624d5dc64b0d1a9391e967bf0c5e7c798ffa..11f342c3f5a9316576e1797f6460c8727e91639b 100644 (file)
@@ -22,6 +22,7 @@ int was_set_insecurely(char_u *opt, int opt_flags);
 void redraw_titles(void);
 int valid_name(char_u *val, char *allowed);
 void set_option_sctx_idx(int opt_idx, int opt_flags, sctx_T script_ctx);
+sctx_T *get_option_sctx(char *name);
 void set_term_option_sctx_idx(char *name, int opt_idx);
 void check_redraw(long_u flags);
 int findoption(char_u *arg);
index 9ae7006ceed344fabd840b388f8bf62d887264be..be98212d94124d4fe0071894b0b384ece8dbc098 100644 (file)
@@ -2,7 +2,7 @@
 |t|w|o| |t|X|o| |t|w|o| @38
 |t|h|r|e| +0#0000001#ffd7ff255@17| +0#0000000#ffffff0@27
 |~+0#4040ff13&| @2| +0#0000001#ffd7ff255|l|i|n|e| |2| |c|o|l|u|m|n| |6|:| | +0#4040ff13#ffffff0@27
-|~| @2| +0#0000001#ffd7ff255|t|X|o| @13| +0#4040ff13#ffffff0@27
+|~| @2| +0#0000001#ffd7ff255|t|X|o|<| @12| +0#4040ff13#ffffff0@27
 |~| @2| +0#0000001#ffd7ff255@17| +0#4040ff13#ffffff0@27
 |~| @48
 |~| @48
index 9ae7006ceed344fabd840b388f8bf62d887264be..be98212d94124d4fe0071894b0b384ece8dbc098 100644 (file)
@@ -2,7 +2,7 @@
 |t|w|o| |t|X|o| |t|w|o| @38
 |t|h|r|e| +0#0000001#ffd7ff255@17| +0#0000000#ffffff0@27
 |~+0#4040ff13&| @2| +0#0000001#ffd7ff255|l|i|n|e| |2| |c|o|l|u|m|n| |6|:| | +0#4040ff13#ffffff0@27
-|~| @2| +0#0000001#ffd7ff255|t|X|o| @13| +0#4040ff13#ffffff0@27
+|~| @2| +0#0000001#ffd7ff255|t|X|o|<| @12| +0#4040ff13#ffffff0@27
 |~| @2| +0#0000001#ffd7ff255@17| +0#4040ff13#ffffff0@27
 |~| @48
 |~| @48
index 76a91ae0359bcbe55ebfe7f6d566554fbac1ecc5..51c5e328d37944653ea52cbda02cba7ef0f170f1 100644 (file)
@@ -3,7 +3,7 @@
 |t|h|r|e|e+0&#e0e0e08| |t|h>r+0&#ffffff0|e@1| |t|h|r|e@1| @32
 |~+0#4040ff13&| @2| +0#0000001#ffd7ff255@17| +0#4040ff13#ffffff0@27
 |~| @2| +0#0000001#ffd7ff255|l|i|n|e| |3| |c|o|l|u|m|n| |5|:| | +0#4040ff13#ffffff0@27
-|~| @2| +0#0000001#ffd7ff255|e| |t|h|r| @11| +0#4040ff13#ffffff0@27
+|~| @2| +0#0000001#ffd7ff255|e| |t|h|r|<| @10| +0#4040ff13#ffffff0@27
 |~| @2| +0#0000001#ffd7ff255@17| +0#4040ff13#ffffff0@27
 |~| @48
 |~| @48
index 319e54601ea05adedb19dbe4e768eca95ba1d3b5..ed0c6c19365f3e7512497848c8da2d836d795b12 100644 (file)
@@ -10,7 +10,8 @@ CheckScreendump
 
 let s:common_script =<< trim [CODE]
   call setline(1, ["one one one", "two tXo two", "three three three"])
-  set balloonevalterm balloonexpr=MyBalloonExpr() balloondelay=100
+  set balloonevalterm balloonexpr=MyBalloonExpr()..s:trailing balloondelay=100
+  let s:trailing = '<'  " check that script context is set
   func MyBalloonExpr()
     return "line " .. v:beval_lnum .. " column " .. v:beval_col .. ":\n" .. v:beval_text
   endfun
index 86eb140126bed583caddf99f08aaa3b304835eb1..88d32ffa8bcab85827ef15a385a4ab8fe271e6b6 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4180,
 /**/
     4179,
 /**/