summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-01-22 15:09:36 +0000
committerBram Moolenaar <Bram@vim.org>2022-01-22 15:09:36 +0000
commit5600a709f453045c80f92087acc0f855b4af377a (patch)
tree7a5d7a0ea30f2167bf7a1fd68a93d6c9570c3e6c
parent9530b580a7b71960dbbdb2b12a3aafeb540bd135 (diff)
downloadvim-git-5600a709f453045c80f92087acc0f855b4af377a.tar.gz
patch 8.2.4180: 'balloonexpr' is evaluated in the current script contextv8.2.4180
Problem: 'balloonexpr' is evaluated in the current script context. Solution: Use the script context where the option was set.
-rw-r--r--src/beval.c13
-rw-r--r--src/option.c15
-rw-r--r--src/proto/option.pro1
-rw-r--r--src/testdir/dumps/Test_balloon_eval_term_01.dump2
-rw-r--r--src/testdir/dumps/Test_balloon_eval_term_01a.dump2
-rw-r--r--src/testdir/dumps/Test_balloon_eval_term_02.dump2
-rw-r--r--src/testdir/test_balloon.vim3
-rw-r--r--src/version.c2
8 files changed, 36 insertions, 4 deletions
diff --git a/src/beval.c b/src/beval.c
index 8b7570b57..a9d10a202 100644
--- a/src/beval.c
+++ b/src/beval.c
@@ -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)
diff --git a/src/option.c b/src/option.c
index 4cc6142b6..f6b6afad5 100644
--- a/src/option.c
+++ b/src/option.c
@@ -2615,6 +2615,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".
* When "name" is NULL use "opt_idx".
diff --git a/src/proto/option.pro b/src/proto/option.pro
index a099624d5..11f342c3f 100644
--- a/src/proto/option.pro
+++ b/src/proto/option.pro
@@ -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);
diff --git a/src/testdir/dumps/Test_balloon_eval_term_01.dump b/src/testdir/dumps/Test_balloon_eval_term_01.dump
index 9ae7006ce..be98212d9 100644
--- a/src/testdir/dumps/Test_balloon_eval_term_01.dump
+++ b/src/testdir/dumps/Test_balloon_eval_term_01.dump
@@ -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
diff --git a/src/testdir/dumps/Test_balloon_eval_term_01a.dump b/src/testdir/dumps/Test_balloon_eval_term_01a.dump
index 9ae7006ce..be98212d9 100644
--- a/src/testdir/dumps/Test_balloon_eval_term_01a.dump
+++ b/src/testdir/dumps/Test_balloon_eval_term_01a.dump
@@ -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
diff --git a/src/testdir/dumps/Test_balloon_eval_term_02.dump b/src/testdir/dumps/Test_balloon_eval_term_02.dump
index 76a91ae03..51c5e328d 100644
--- a/src/testdir/dumps/Test_balloon_eval_term_02.dump
+++ b/src/testdir/dumps/Test_balloon_eval_term_02.dump
@@ -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
diff --git a/src/testdir/test_balloon.vim b/src/testdir/test_balloon.vim
index 319e54601..ed0c6c193 100644
--- a/src/testdir/test_balloon.vim
+++ b/src/testdir/test_balloon.vim
@@ -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
diff --git a/src/version.c b/src/version.c
index 86eb14012..88d32ffa8 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 4180,
+/**/
4179,
/**/
4178,