summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-04-20 14:39:52 +0200
committerBram Moolenaar <Bram@vim.org>2019-04-20 14:39:52 +0200
commitd2e716e6dfd50b605867c7c684373384c8edf707 (patch)
tree84b0d9607af4963fe9a6a61ddb8a0c414f57f5f8
parent3a4c53ba51c01b8fea68972453a71c55cf32edbe (diff)
patch 8.1.1188: not all Vim variables require the v: prefixv8.1.1188
Problem: Not all Vim variables require the v: prefix. Solution: When scriptversion is 3 all Vim variables can only be used with the v: prefix. (Ken Takata, closes #4274)
-rw-r--r--runtime/doc/eval.txt14
-rw-r--r--src/eval.c12
-rw-r--r--src/ex_cmds2.c2
-rw-r--r--src/testdir/test_eval_stuff.vim16
-rw-r--r--src/version.c2
5 files changed, 36 insertions, 10 deletions
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt
index c454f96dcb..dba7486e94 100644
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -1688,7 +1688,8 @@ v:count The count given for the last Normal mode command. Can be used
When there are two counts, as in "3d2w", they are multiplied,
just like what happens in the command, "d6w" for the example.
Also used for evaluating the 'formatexpr' option.
- "count" also works, for backwards compatibility.
+ "count" also works, for backwards compatibility, unless
+ |scriptversion| is 3 or higher.
*v:count1* *count1-variable*
v:count1 Just like "v:count", but defaults to one when no count is
@@ -1720,7 +1721,8 @@ v:errmsg Last given error message. It's allowed to set this variable.
:silent! next
:if v:errmsg != ""
: ... handle error
-< "errmsg" also works, for backwards compatibility.
+< "errmsg" also works, for backwards compatibility, unless
+ |scriptversion| is 3 or higher.
*v:errors* *errors-variable* *assert-return*
v:errors Errors found by assert functions, such as |assert_true()|.
@@ -2023,7 +2025,8 @@ v:shell_error Result of the last shell command. When non-zero, the last
:if v:shell_error
: echo 'could not rename "foo" to "bar"!'
:endif
-< "shell_error" also works, for backwards compatibility.
+< "shell_error" also works, for backwards compatibility, unless
+ |scriptversion| is 3 or higher.
*v:statusmsg* *statusmsg-variable*
v:statusmsg Last given status message. It's allowed to set this variable.
@@ -2123,7 +2126,8 @@ v:testing Must be set before using `test_garbagecollect_now()`.
v:this_session Full filename of the last loaded or saved session file. See
|:mksession|. It is allowed to set this variable. When no
session file has been saved, this variable is empty.
- "this_session" also works, for backwards compatibility.
+ "this_session" also works, for backwards compatibility, unless
+ |scriptversion| is 3 or higher
*v:throwpoint* *throwpoint-variable*
v:throwpoint The point where the exception most recently caught and not
@@ -2154,7 +2158,7 @@ v:val Value of the current item of a |List| or |Dictionary|. Only
v:version Version number of Vim: Major version number times 100 plus
minor version number. Version 5.0 is 500. Version 5.1 (5.01)
is 501. Read-only. "version" also works, for backwards
- compatibility.
+ compatibility, unless |scriptversion| is 3 or higher.
Use |has()| to check if a certain patch was included, e.g.: >
if has("patch-7.4.123")
< Note that patch numbers are specific to the version, thus both
diff --git a/src/eval.c b/src/eval.c
index 5f45d6900e..dd66287513 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -7672,10 +7672,14 @@ find_var_ht(char_u *name, char_u **varname)
return NULL;
*varname = name;
- /* "version" is "v:version" in all scopes */
- hi = hash_find(&compat_hashtab, name);
- if (!HASHITEM_EMPTY(hi))
- return &compat_hashtab;
+ // "version" is "v:version" in all scopes if scriptversion < 3.
+ // Same for a few other variables marked with VV_COMPAT.
+ if (current_sctx.sc_version < 3)
+ {
+ hi = hash_find(&compat_hashtab, name);
+ if (!HASHITEM_EMPTY(hi))
+ return &compat_hashtab;
+ }
ht = get_funccal_local_ht();
if (ht == NULL)
diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c
index 31caa93583..46d6dcb236 100644
--- a/src/ex_cmds2.c
+++ b/src/ex_cmds2.c
@@ -5127,7 +5127,7 @@ ex_scriptversion(exarg_T *eap UNUSED)
nr = getdigits(&eap->arg);
if (nr == 0 || *eap->arg != NUL)
emsg(_(e_invarg));
- else if (nr > 2)
+ else if (nr > 3)
semsg(_("E999: scriptversion not supported: %d"), nr);
else
current_sctx.sc_version = nr;
diff --git a/src/testdir/test_eval_stuff.vim b/src/testdir/test_eval_stuff.vim
index d6aeb6f939..cba66b70f7 100644
--- a/src/testdir/test_eval_stuff.vim
+++ b/src/testdir/test_eval_stuff.vim
@@ -154,6 +154,22 @@ func Test_string_concat_scriptversion1()
endif
endfunc
+scriptversion 3
+func Test_vvar_scriptversion3()
+ call assert_fails('echo version', 'E121:')
+ call assert_false(exists('version'))
+ let version = 1
+ call assert_equal(1, version)
+endfunc
+
+scriptversion 2
+func Test_vvar_scriptversion2()
+ call assert_true(exists('version'))
+ echo version
+ call assert_fails('let version = 1', 'E46:')
+ call assert_equal(v:version, version)
+endfunc
+
func Test_scriptversion()
call writefile(['scriptversion 9'], 'Xversionscript')
call assert_fails('source Xversionscript', 'E999:')
diff --git a/src/version.c b/src/version.c
index f9b53b0c74..27614587ff 100644
--- a/src/version.c
+++ b/src/version.c
@@ -772,6 +772,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1188,
+/**/
1187,
/**/
1186,