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
+