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/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 @"