runtime(vim): Update base-syntax and generator, only match valid predefined variables
- Only match valid predefined and option variables.
- Match scope dictionaries.
- Highlight scope prefixed variables as a scope dictionary accessor. The
vimVarScope syntax group can be linked to vimVar to disable this.
- Include support for Neovim-only predefined and option variables.
Temporary collateral damage - scope dictionaries match instead of keys
in dictionary literals.
closes: #16727
Signed-off-by: Doug Kearns <dougkearns@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/runtime/syntax/testdir/input/vim9_def_variables.vim b/runtime/syntax/testdir/input/vim9_def_variables.vim
index 94ef810..4580c0e 100644
--- a/runtime/syntax/testdir/input/vim9_def_variables.vim
+++ b/runtime/syntax/testdir/input/vim9_def_variables.vim
@@ -12,7 +12,7 @@
t:foo = expr
w:foo = expr
- v:foo = expr
+ v:true = expr
$FOO = expr
@@ -59,6 +59,9 @@
foo[1:] = expr
foo[:] = expr
+ foo["key"] = expr
+ foo['key'] = expr
+
foo += expr
foo -= expr
foo *= expr
@@ -107,36 +110,36 @@
@f = expr
@f ..= expr
- &foo = expr
+ &ari = expr
&t_k1 = "\<Esc>[234;"
- &foo ..= expr
+ &ari ..= expr
- &foo += expr
- &foo -= expr
+ &ari += expr
+ &ari -= expr
- &l:foo = expr
+ &l:aleph = expr
- &l:foo ..= expr
- &l:foo += expr
- &l:foo -= expr
+ &l:aleph ..= expr
+ &l:aleph += expr
+ &l:aleph -= expr
- &g:foo = expr
+ &g:aleph = expr
- &g:foo ..= expr
- &g:foo += expr
- &g:foo -= expr
+ &g:aleph ..= expr
+ &g:aleph += expr
+ &g:aleph -= expr
[foo, bar] = expr
[foo,
\ bar] = expr
- [v:foo, v:bar] = expr
- [v:foo,
- \ v:bar] = expr
- [&foo, &bar] = expr
- [&foo,
- \ &bar] = expr
+ [v:true, v:false] = expr
+ [v:true,
+ \ v:false] = expr
+ [&ari, &bkc] = expr
+ [&ari,
+ \ &bkc] = expr
[$foo, $bar] = expr
[$foo,
\ $bar] = expr
@@ -155,18 +158,18 @@
[foo,
\ bar;
\ baz] = expr
- [v:foo, v:bar; v:baz] = expr
- [v:foo,
- \ v:bar;
- \ v:baz] = expr
+ [v:true, v:false; v:none] = expr
+ [v:true,
+ \ v:false;
+ \ v:none] = expr
[$foo, $bar; $baz] = expr
[$foo,
\ $bar;
\ $baz] = expr
- [&foo, &bar; &baz] = expr
- [&foo,
- \ &bar;
- \ &baz] = expr
+ [&ari, &bkc; &cmp] = expr
+ [&ari,
+ \ &bkc;
+ \ &cmp] = expr
[@a, @b; @c] = expr
[@a,
\ @b;
@@ -195,6 +198,28 @@
for [foo, bar] in expr
endfor
-enddef
+# Scope dictionaries
+
+echo get(b:, 'foo', 42)
+echo get(w:, 'foo', 42)
+echo get(t:, 'foo', 42)
+echo get(g:, 'foo', 42)
+echo get(v:, 'foo', 42)
+
+for k in keys(b:) | echo b:[k] | endfor
+for k in keys(w:) | echo w:[k] | endfor
+for k in keys(t:) | echo t:[k] | endfor
+for k in keys(g:) | echo g:[k] | endfor
+for k in keys(v:) | echo v:[k] | endfor
+
+# Neovim-specific variables (not highlighted by default)
+
+echo v:lua v:msgpack_types v:relnum v:stderr v:termrequest v:virtnum
+
+echo &channel &inccommand &mousescroll &pumblend &redrawdebug &scrollback
+echo &shada &shadafile &statuscolumn &termpastefilter &termsync &winbar
+echo &winblend &winhighlight
+
+enddef
diff --git a/runtime/syntax/testdir/input/vim9_expr.vim b/runtime/syntax/testdir/input/vim9_expr.vim
index fd9cbb0..fc94abd 100644
--- a/runtime/syntax/testdir/input/vim9_expr.vim
+++ b/runtime/syntax/testdir/input/vim9_expr.vim
@@ -2,6 +2,55 @@
# Vim9-script expressions
+# Dictionary
+
+echo {}
+echo { foo: 21 * 2 }
+echo { -foo-: 21 * 2 }
+echo { 42: 21 * 2 }
+echo { 'foo': 21 * 2 }
+echo { "foo": 21 * 2 }
+
+echo { foo: { bar: 21 * 2 } }
+echo { foo: { -bar-: 21 * 2 } }
+echo { foo: { 42: 21 * 2 } }
+echo { foo: { 'bar': 21 * 2 } }
+echo { foo: { "bar": 21 * 2 } }
+
+echo { -foo-: { bar: 21 * 2 } }
+echo { -foo-: { -bar-: 21 * 2 } }
+echo { -foo-: { 42: 21 * 2 } }
+echo { -foo-: { 'bar': 21 * 2 } }
+echo { -foo-: { "bar": 21 * 2 } }
+
+echo { 42: { bar: 21 * 2 } }
+echo { 42: { -bar-: 21 * 2 } }
+echo { 42: { 42: 21 * 2 } }
+echo { 42: { 'bar': 21 * 2 } }
+echo { 42: { "bar": 21 * 2 } }
+
+echo { 'foo': { bar: 21 * 2 } }
+echo { 'foo': { -bar-: 21 * 2 } }
+echo { 'foo': { 42: 21 * 2 } }
+echo { 'foo': { "bar": 21 * 2 } }
+echo { 'foo': { 'bar': 21 * 2 } }
+
+echo { "foo": { bar: 21 * 2 } }
+echo { "foo": { -bar-: 21 * 2 } }
+echo { "foo": { 42: 21 * 2 } }
+echo { "foo": { 'bar': 21 * 2 } }
+echo { "foo": { "bar": 21 * 2 } }
+
+echo {
+ # comment
+ foo: {
+ bar: 21 * 2
+ }
+}
+
+# match as keys not scope dictionaries
+echo { b: 42, w: 42, t: 42, g: 42, l: 42, s: 42, a: 42, v: 42 }
+
# Operators
# Ternary
diff --git a/runtime/syntax/testdir/input/vim9_variables.vim b/runtime/syntax/testdir/input/vim9_variables.vim
index 88dfb58..14b1d1d 100644
--- a/runtime/syntax/testdir/input/vim9_variables.vim
+++ b/runtime/syntax/testdir/input/vim9_variables.vim
@@ -11,7 +11,7 @@
t:foo = expr
w:foo = expr
-v:foo = expr
+v:true = expr
$FOO = expr
@@ -58,6 +58,9 @@
foo[1:] = expr
foo[:] = expr
+foo["key"] = expr
+foo['key'] = expr
+
foo += expr
foo -= expr
foo *= expr
@@ -106,36 +109,36 @@
@f = expr
@f ..= expr
-&foo = expr
+&ari = expr
&t_k1 = "\<Esc>[234;"
-&foo ..= expr
+&ari ..= expr
-&foo += expr
-&foo -= expr
+&ari += expr
+&ari -= expr
-&l:foo = expr
+&l:aleph = expr
-&l:foo ..= expr
-&l:foo += expr
-&l:foo -= expr
+&l:aleph ..= expr
+&l:aleph += expr
+&l:aleph -= expr
-&g:foo = expr
+&g:aleph = expr
-&g:foo ..= expr
-&g:foo += expr
-&g:foo -= expr
+&g:aleph ..= expr
+&g:aleph += expr
+&g:aleph -= expr
[foo, bar] = expr
[foo,
\ bar] = expr
-[v:foo, v:bar] = expr
-[v:foo,
- \ v:bar] = expr
-[&foo, &bar] = expr
-[&foo,
- \ &bar] = expr
+[v:true, v:false] = expr
+[v:true,
+ \ v:false] = expr
+[&ari, &bkc] = expr
+[&ari,
+ \ &bkc] = expr
[$foo, $bar] = expr
[$foo,
\ $bar] = expr
@@ -154,18 +157,18 @@
[foo,
\ bar;
\ baz] = expr
-[v:foo, v:bar; v:baz] = expr
-[v:foo,
- \ v:bar;
- \ v:baz] = expr
+[v:true, v:false; v:none] = expr
+[v:true,
+ \ v:false;
+ \ v:none] = expr
[$foo, $bar; $baz] = expr
[$foo,
\ $bar;
\ $baz] = expr
-[&foo, &bar; &baz] = expr
-[&foo,
- \ &bar;
- \ &baz] = expr
+[&ari, &bkc; &cmp] = expr
+[&ari,
+ \ &bkc;
+ \ &cmp] = expr
[@a, @b; @c] = expr
[@a,
\ @b;
@@ -195,3 +198,25 @@
for [foo, bar] in expr
endfor
+# Scope dictionaries
+
+echo get(b:, 'foo', 42)
+echo get(w:, 'foo', 42)
+echo get(t:, 'foo', 42)
+echo get(g:, 'foo', 42)
+echo get(v:, 'foo', 42)
+
+for k in keys(b:) | echo b:[k] | endfor
+for k in keys(w:) | echo w:[k] | endfor
+for k in keys(t:) | echo t:[k] | endfor
+for k in keys(g:) | echo g:[k] | endfor
+for k in keys(v:) | echo v:[k] | endfor
+
+# Neovim-specific variables (not highlighted by default)
+
+echo v:lua v:msgpack_types v:relnum v:stderr v:termrequest v:virtnum
+
+echo &channel &inccommand &mousescroll &pumblend &redrawdebug &scrollback
+echo &shada &shadafile &statuscolumn &termpastefilter &termsync &winbar
+echo &winblend &winhighlight
+
diff --git a/runtime/syntax/testdir/input/vim_ex_function.vim b/runtime/syntax/testdir/input/vim_ex_function.vim
index 1b78191..c09019e 100644
--- a/runtime/syntax/testdir/input/vim_ex_function.vim
+++ b/runtime/syntax/testdir/input/vim_ex_function.vim
@@ -163,6 +163,20 @@
return 42
endfunction
+
+" arguments
+
+function Foo(a, b, c)
+ echo a:a a:b a:c
+endfunction
+
+function Foo(...)
+ echo a:000
+ echo a:0
+ echo a:1 a:2 a:3 a:4 a:5 a:6 a:7 a:8 a:9 a:10 a:11 a:12 a:13 a:14 a:15 a:16 a:17 a:18 a:19 a:20
+endfunction
+
+
" Issue #16243 (vimscript def parameters syntax highlight is wrong)
function Test(lines = [line('.'), line('.')])
diff --git a/runtime/syntax/testdir/input/vim_ex_function_fold.vim b/runtime/syntax/testdir/input/vim_ex_function_fold.vim
index bd0cf61..1be9c25 100644
--- a/runtime/syntax/testdir/input/vim_ex_function_fold.vim
+++ b/runtime/syntax/testdir/input/vim_ex_function_fold.vim
@@ -166,6 +166,19 @@
endfunction
+" arguments
+
+function Foo(a, b, c)
+ echo a:a a:b a:c
+endfunction
+
+function Foo(...)
+ echo a:000
+ echo a:0
+ echo a:1 a:2 a:3 a:4 a:5 a:6 a:7 a:8 a:9 a:10 a:11 a:12 a:13 a:14 a:15 a:16 a:17 a:18 a:19 a:20
+endfunction
+
+
" comments
function Foo()
diff --git a/runtime/syntax/testdir/input/vim_expr.vim b/runtime/syntax/testdir/input/vim_expr.vim
index d71166d..9786ff8 100644
--- a/runtime/syntax/testdir/input/vim_expr.vim
+++ b/runtime/syntax/testdir/input/vim_expr.vim
@@ -100,6 +100,79 @@
" Issue #5830 (Incorrect syntax highlighting in Vim script when omitting space in list of string)
let l = ['a','b','c']
+" Dictionary
+
+echo {}
+echo { 'foo': 21 * 2 }
+echo { "foo": 21 * 2 }
+echo { 42: 21 * 2 }
+
+echo { "foo": { 'bar': 21 * 2 } }
+echo { "foo": { "bar": 21 * 2 } }
+echo { "foo": { 42: 21 * 2 } }
+echo { "foo": #{ bar: 21 * 2 } }
+echo { "foo": #{ -bar-: 21 * 2 } }
+echo { "foo": #{ 42: 21 * 2 } }
+
+echo { 'foo': { 'bar': 21 * 2 } }
+echo { 'foo': { "bar": 21 * 2 } }
+echo { 'foo': { 42: 21 * 2 } }
+echo { 'foo': #{ bar: 21 * 2 } }
+echo { 'foo': #{ -bar-: 21 * 2 } }
+echo { 'foo': #{ 42: 21 * 2 } }
+
+echo { 42: { 'bar': 21 * 2 } }
+echo { 42: { "bar": 21 * 2 } }
+echo { 42: { 42: 21 * 2 } }
+echo { 42: #{ bar: 21 * 2 } }
+echo { 42: #{ -bar-: 21 * 2 } }
+echo { 42: #{ 42: 21 * 2 } }
+
+echo {
+ "\ comment
+ \ "foo": { "bar": 21 * 2 }
+ \}
+
+" TODO: arbitrary expression keys
+
+" Literal Dictionary
+
+echo #{}
+echo #{ foo: 21 * 2 }
+echo #{ -foo-: 21 * 2 }
+echo #{ 42: 21 * 2 }
+
+echo #{ foo: #{ bar: 21 * 2 } }
+echo #{ foo: #{ -bar-: 21 * 2 } }
+echo #{ foo: #{ 42: 21 * 2 } }
+echo #{ foo: { "bar": 21 * 2 } }
+echo #{ foo: { 'bar': 21 * 2 } }
+echo #{ foo: { 42: 21 * 2 } }
+
+echo #{ -foo-: #{ bar: 21 * 2 } }
+echo #{ -foo-: #{ -bar-: 21 * 2 } }
+echo #{ -foo-: #{ 42: 21 * 2 } }
+echo #{ -foo-: { "bar": 21 * 2 } }
+echo #{ -foo-: { 'bar': 21 * 2 } }
+echo #{ -foo-: { 42: 21 * 2 } }
+
+echo #{ 42: #{ bar: 21 * 2 } }
+echo #{ 42: #{ -bar-: 21 * 2 } }
+echo #{ 42: #{ 42: 21 * 2 } }
+echo #{ 42: { "bar": 21 * 2 } }
+echo #{ 42: { 'bar': 21 * 2 } }
+echo #{ 42: { 42: 21 * 2 } }
+
+echo #{
+ "\ comment
+ \ foo: #{
+ \ bar: 21 * 2
+ \ }
+ \}
+
+" match as keys not scope dictionaries
+echo #{ b: 42, w: 42, t: 42, g: 42, l: 42, s: 42, a: 42, v: 42 }
+
" Register
echo @"
diff --git a/runtime/syntax/testdir/input/vim_function_variables.vim b/runtime/syntax/testdir/input/vim_function_variables.vim
index 9a9d4f9..490896d 100644
--- a/runtime/syntax/testdir/input/vim_function_variables.vim
+++ b/runtime/syntax/testdir/input/vim_function_variables.vim
@@ -32,8 +32,8 @@
let b:foo[1:] = expr
let b:foo[:] = expr
- let bfoo["key"] = expr
- let bfoo['key'] = expr
+ let b:foo["key"] = expr
+ let b:foo['key'] = expr
let b:foo += expr
let b:foo -= expr
@@ -103,25 +103,25 @@
let t:foo .= expr
let t:foo ..= expr
- let v:foo = expr
+ let v:true = expr
- let v:foo[0] = expr
+ let v:true[0] = expr
- let v:foo[1:2] = expr
- let v:foo[:2] = expr
- let v:foo[1:] = expr
- let v:foo[:] = expr
+ let v:true[1:2] = expr
+ let v:true[:2] = expr
+ let v:true[1:] = expr
+ let v:true[:] = expr
- let v:foo["key"] = expr
- let v:foo['key'] = expr
+ let v:true["key"] = expr
+ let v:true['key'] = expr
- let v:foo += expr
- let v:foo -= expr
- let v:foo *= expr
- let v:foo /= expr
- let v:foo %= expr
- let v:foo .= expr
- let v:foo ..= expr
+ let v:true += expr
+ let v:true -= expr
+ let v:true *= expr
+ let v:true /= expr
+ let v:true %= expr
+ let v:true .= expr
+ let v:true ..= expr
let w:foo = expr
@@ -151,38 +151,38 @@
let @f .= expr
let @f ..= expr
- let &foo = expr
+ let &ari = expr
let &t_k1 = "\<Esc>[234;"
- let &foo .= expr
- let &foo ..= expr
- let &foo += expr
- let &foo -= expr
+ let &ari .= expr
+ let &ari ..= expr
+ let &ari += expr
+ let &ari -= expr
- let &l:foo = expr
+ let &l:aleph = expr
- let &l:foo .= expr
- let &l:foo ..= expr
- let &l:foo += expr
- let &l:foo -= expr
+ let &l:aleph .= expr
+ let &l:aleph ..= expr
+ let &l:aleph += expr
+ let &l:aleph -= expr
- let &g:foo = expr
+ let &g:aleph = expr
- let &g:foo .= expr
- let &g:foo ..= expr
- let &g:foo += expr
- let &g:foo -= expr
+ let &g:aleph .= expr
+ let &g:aleph ..= expr
+ let &g:aleph += expr
+ let &g:aleph -= expr
let [foo, bar] = expr
let [foo,
\ bar] = expr
- let [v:foo, v:bar] = expr
- let [v:foo,
- \ v:bar] = expr
- let [&foo, &bar] = expr
- let [&foo,
- \ &bar] = expr
+ let [v:true, v:false] = expr
+ let [v:true,
+ \ v:false] = expr
+ let [&ari, &bkc] = expr
+ let [&ari,
+ \ &bkc] = expr
let [$foo, $bar] = expr
let [$foo,
\ $bar] = expr
@@ -199,18 +199,18 @@
let [foo,
\ bar;
\ baz] = expr
- let [v:foo, v:bar; v:baz] = expr
- let [v:foo,
- \ v:bar;
- \ v:baz] = expr
+ let [v:true, v:false; v:none] = expr
+ let [v:true,
+ \ v:false;
+ \ v:none] = expr
let [$foo, $bar; $baz] = expr
let [$foo,
\ $bar;
\ $baz] = expr
- let [&foo, &bar; &baz] = expr
- let [&foo,
- \ &bar;
- \ &baz] = expr
+ let [&ari, &bkc; &cmp] = expr
+ let [&ari,
+ \ &bkc;
+ \ &cmp] = expr
let [@a, @b; @c] = expr
let [@a,
\ @b;
@@ -380,5 +380,34 @@
unlockvar 2 foo | echo "Foo"
unlockvar 2 foo bar " comment
unlockvar 2 foo bar | echo "Foo"
+
+" Scope dictionaries
+
+echo get(b:, 'foo', 42)
+echo get(w:, 'foo', 42)
+echo get(t:, 'foo', 42)
+echo get(g:, 'foo', 42)
+echo get(l:, 'foo', 42)
+echo get(s:, 'foo', 42)
+echo get(a:, 'foo', 42)
+echo get(v:, 'foo', 42)
+
+for k in keys(b:) | echo b:[k] | endfor
+for k in keys(w:) | echo w:[k] | endfor
+for k in keys(t:) | echo t:[k] | endfor
+for k in keys(g:) | echo g:[k] | endfor
+for k in keys(l:) | echo l:[k] | endfor
+for k in keys(s:) | echo s:[k] | endfor
+for k in keys(a:) | echo a:[k] | endfor
+for k in keys(v:) | echo v:[k] | endfor
+
+" Neovim-specific variables (not highlighted by default)
+
+echo v:lua v:msgpack_types v:relnum v:stderr v:termrequest v:virtnum
+
+echo &channel &inccommand &mousescroll &pumblend &redrawdebug &scrollback
+echo &shada &shadafile &statuscolumn &termpastefilter &termsync &winbar
+echo &winblend &winhighlight
+
endfunction
diff --git a/runtime/syntax/testdir/input/vim_nvim_variables.vim b/runtime/syntax/testdir/input/vim_nvim_variables.vim
new file mode 100644
index 0000000..661d047
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim_nvim_variables.vim
@@ -0,0 +1,9 @@
+" Neovim variable highlighting
+" VIM_TEST_SETUP let g:vimsyn_vim_features = ["nvim"]
+
+echo v:lua v:msgpack_types v:relnum v:stderr v:termrequest v:virtnum
+
+echo &channel &inccommand &mousescroll &pumblend &redrawdebug &scrollback
+echo &shada &shadafile &statuscolumn &termpastefilter &termsync &winbar
+echo &winblend &winhighlight
+
diff --git a/runtime/syntax/testdir/input/vim_variables.vim b/runtime/syntax/testdir/input/vim_variables.vim
index af02fa8..da9e409 100644
--- a/runtime/syntax/testdir/input/vim_variables.vim
+++ b/runtime/syntax/testdir/input/vim_variables.vim
@@ -31,8 +31,8 @@
let b:foo[1:] = expr
let b:foo[:] = expr
-let bfoo["key"] = expr
-let bfoo['key'] = expr
+let b:foo["key"] = expr
+let b:foo['key'] = expr
let b:foo += expr
let b:foo -= expr
@@ -102,25 +102,25 @@
let t:foo .= expr
let t:foo ..= expr
-let v:foo = expr
+let v:true = expr
-let v:foo[0] = expr
+let v:true[0] = expr
-let v:foo[1:2] = expr
-let v:foo[:2] = expr
-let v:foo[1:] = expr
-let v:foo[:] = expr
+let v:true[1:2] = expr
+let v:true[:2] = expr
+let v:true[1:] = expr
+let v:true[:] = expr
-let v:foo["key"] = expr
-let v:foo['key'] = expr
+let v:true["key"] = expr
+let v:true['key'] = expr
-let v:foo += expr
-let v:foo -= expr
-let v:foo *= expr
-let v:foo /= expr
-let v:foo %= expr
-let v:foo .= expr
-let v:foo ..= expr
+let v:true += expr
+let v:true -= expr
+let v:true *= expr
+let v:true /= expr
+let v:true %= expr
+let v:true .= expr
+let v:true ..= expr
let w:foo = expr
@@ -150,38 +150,38 @@
let @f .= expr
let @f ..= expr
-let &foo = expr
+let &ari = expr
let &t_k1 = "\<Esc>[234;"
-let &foo .= expr
-let &foo ..= expr
-let &foo += expr
-let &foo -= expr
+let &ari .= expr
+let &ari ..= expr
+let &ari += expr
+let &ari -= expr
-let &l:foo = expr
+let &l:aleph = expr
-let &l:foo .= expr
-let &l:foo ..= expr
-let &l:foo += expr
-let &l:foo -= expr
+let &l:aleph .= expr
+let &l:aleph ..= expr
+let &l:aleph += expr
+let &l:aleph -= expr
-let &g:foo = expr
+let &g:aleph = expr
-let &g:foo .= expr
-let &g:foo ..= expr
-let &g:foo += expr
-let &g:foo -= expr
+let &g:aleph .= expr
+let &g:aleph ..= expr
+let &g:aleph += expr
+let &g:aleph -= expr
let [foo, bar] = expr
let [foo,
\ bar] = expr
-let [v:foo, v:bar] = expr
-let [v:foo,
- \ v:bar] = expr
-let [&foo, &bar] = expr
-let [&foo,
- \ &bar] = expr
+let [v:true, v:false] = expr
+let [v:true,
+ \ v:false] = expr
+let [&ari, &bkc] = expr
+let [&ari,
+ \ &bkc] = expr
let [$foo, $bar] = expr
let [$foo,
\ $bar] = expr
@@ -198,18 +198,18 @@
let [foo,
\ bar;
\ baz] = expr
-let [v:foo, v:bar; v:baz] = expr
-let [v:foo,
- \ v:bar;
- \ v:baz] = expr
+let [v:true, v:false; v:none] = expr
+let [v:true,
+ \ v:false;
+ \ v:none] = expr
let [$foo, $bar; $baz] = expr
let [$foo,
\ $bar;
\ $baz] = expr
-let [&foo, &bar; &baz] = expr
-let [&foo,
- \ &bar;
- \ &baz] = expr
+let [&ari, &bkc; &cmp] = expr
+let [&ari,
+ \ &bkc;
+ \ &cmp] = expr
let [@a, @b; @c] = expr
let [@a,
\ @b;
@@ -380,3 +380,31 @@
unlockvar 2 foo bar " comment
unlockvar 2 foo bar | echo "Foo"
+" Scope dictionaries
+
+echo get(b:, 'foo', 42)
+echo get(w:, 'foo', 42)
+echo get(t:, 'foo', 42)
+echo get(g:, 'foo', 42)
+echo get(l:, 'foo', 42)
+echo get(s:, 'foo', 42)
+echo get(a:, 'foo', 42)
+echo get(v:, 'foo', 42)
+
+for k in keys(b:) | echo b:[k] | endfor
+for k in keys(w:) | echo w:[k] | endfor
+for k in keys(t:) | echo t:[k] | endfor
+for k in keys(g:) | echo g:[k] | endfor
+for k in keys(l:) | echo l:[k] | endfor
+for k in keys(s:) | echo s:[k] | endfor
+for k in keys(a:) | echo a:[k] | endfor
+for k in keys(v:) | echo v:[k] | endfor
+
+" Neovim-specific variables (not highlighted by default)
+
+echo v:lua v:msgpack_types v:relnum v:stderr v:termrequest v:virtnum
+
+echo &channel &inccommand &mousescroll &pumblend &redrawdebug &scrollback
+echo &shada &shadafile &statuscolumn &termpastefilter &termsync &winbar
+echo &winblend &winhighlight
+