runtime(vim): Update base-syntax, improve variable matching

- Match variables after operators, including line continuations.
- Match option variables without leading whitespace.
- Explicitly match expression subscripts.
- Match Vim9 variables in LHS of assignments and method calls.
- Match option variables (&option) with a dedicated syntax group like
  environment variables.
- Match list literals, fixes: #5830
- Match :{un}lockvar arguments.
- Match registers and environment variables in :let unpack lists.
- Match lambda expressions
- Match Vim9 scope blocks
- Match variables in :for subject
- Highlight user variables with Normal
- Improve this/super keyword matching, fixes: #15970

closes: #16476

Signed-off-by: Doug Kearns <dougkearns@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/runtime/syntax/testdir/input/setup/vim9_block.vim b/runtime/syntax/testdir/input/setup/vim9_block.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim9_block.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/setup/vim9_comment.vim b/runtime/syntax/testdir/input/setup/vim9_comment.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim9_comment.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/setup/vim9_def_variables.vim b/runtime/syntax/testdir/input/setup/vim9_def_variables.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim9_def_variables.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/setup/vim9_ex_class_fold.vim b/runtime/syntax/testdir/input/setup/vim9_ex_class_fold.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim9_ex_class_fold.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/setup/vim9_ex_commands.vim b/runtime/syntax/testdir/input/setup/vim9_ex_commands.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim9_ex_commands.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/setup/vim9_ex_for.vim b/runtime/syntax/testdir/input/setup/vim9_ex_for.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim9_ex_for.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/setup/vim9_ex_function_def_tail_comment_errors.vim b/runtime/syntax/testdir/input/setup/vim9_ex_function_def_tail_comment_errors.vim
new file mode 100644
index 0000000..c039651
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim9_ex_function_def_tail_comment_errors.vim
@@ -0,0 +1,2 @@
+highlight link vimVar Identifier
+highlight link vimFuncScope Special
diff --git a/runtime/syntax/testdir/input/setup/vim9_ex_function_def_tail_comments.vim b/runtime/syntax/testdir/input/setup/vim9_ex_function_def_tail_comments.vim
new file mode 100644
index 0000000..c039651
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim9_ex_function_def_tail_comments.vim
@@ -0,0 +1,2 @@
+highlight link vimVar Identifier
+highlight link vimFuncScope Special
diff --git a/runtime/syntax/testdir/input/setup/vim9_ex_interface_fold.vim b/runtime/syntax/testdir/input/setup/vim9_ex_interface_fold.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim9_ex_interface_fold.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/setup/vim9_ex_loadkeymap.vim b/runtime/syntax/testdir/input/setup/vim9_ex_loadkeymap.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim9_ex_loadkeymap.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/setup/vim9_expr.vim b/runtime/syntax/testdir/input/setup/vim9_expr.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim9_expr.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/setup/vim9_lambda.vim b/runtime/syntax/testdir/input/setup/vim9_lambda.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim9_lambda.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/setup/vim9_legacy_header.vim b/runtime/syntax/testdir/input/setup/vim9_legacy_header.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim9_legacy_header.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/setup/vim9_super_this_keywords.vim b/runtime/syntax/testdir/input/setup/vim9_super_this_keywords.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim9_super_this_keywords.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/setup/vim9_super_this_keywords2.vim b/runtime/syntax/testdir/input/setup/vim9_super_this_keywords2.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim9_super_this_keywords2.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/setup/vim9_super_this_keywords3.vim b/runtime/syntax/testdir/input/setup/vim9_super_this_keywords3.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim9_super_this_keywords3.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/setup/vim9_variables.vim b/runtime/syntax/testdir/input/setup/vim9_variables.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim9_variables.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/setup/vim_comment.vim b/runtime/syntax/testdir/input/setup/vim_comment.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim_comment.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/setup/vim_ex_call.vim b/runtime/syntax/testdir/input/setup/vim_ex_call.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim_ex_call.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/setup/vim_ex_command.vim b/runtime/syntax/testdir/input/setup/vim_ex_command.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim_ex_command.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/setup/vim_ex_commands.vim b/runtime/syntax/testdir/input/setup/vim_ex_commands.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim_ex_commands.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/setup/vim_ex_def.vim b/runtime/syntax/testdir/input/setup/vim_ex_def.vim
new file mode 100644
index 0000000..c039651
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim_ex_def.vim
@@ -0,0 +1,2 @@
+highlight link vimVar Identifier
+highlight link vimFuncScope Special
diff --git a/runtime/syntax/testdir/input/setup/vim_ex_def_fold.vim b/runtime/syntax/testdir/input/setup/vim_ex_def_fold.vim
new file mode 100644
index 0000000..c039651
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim_ex_def_fold.vim
@@ -0,0 +1,2 @@
+highlight link vimVar Identifier
+highlight link vimFuncScope Special
diff --git a/runtime/syntax/testdir/input/setup/vim_ex_def_nested.vim b/runtime/syntax/testdir/input/setup/vim_ex_def_nested.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim_ex_def_nested.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/setup/vim_ex_def_nested_fold.vim b/runtime/syntax/testdir/input/setup/vim_ex_def_nested_fold.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim_ex_def_nested_fold.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/setup/vim_ex_echo.vim b/runtime/syntax/testdir/input/setup/vim_ex_echo.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim_ex_echo.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/setup/vim_ex_execute.vim b/runtime/syntax/testdir/input/setup/vim_ex_execute.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim_ex_execute.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/setup/vim_ex_for.vim b/runtime/syntax/testdir/input/setup/vim_ex_for.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim_ex_for.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/setup/vim_ex_function.vim b/runtime/syntax/testdir/input/setup/vim_ex_function.vim
new file mode 100644
index 0000000..c039651
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim_ex_function.vim
@@ -0,0 +1,2 @@
+highlight link vimVar Identifier
+highlight link vimFuncScope Special
diff --git a/runtime/syntax/testdir/input/setup/vim_ex_function_def_tail_comment_errors.vim b/runtime/syntax/testdir/input/setup/vim_ex_function_def_tail_comment_errors.vim
new file mode 100644
index 0000000..c039651
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim_ex_function_def_tail_comment_errors.vim
@@ -0,0 +1,2 @@
+highlight link vimVar Identifier
+highlight link vimFuncScope Special
diff --git a/runtime/syntax/testdir/input/setup/vim_ex_function_def_tail_comments.vim b/runtime/syntax/testdir/input/setup/vim_ex_function_def_tail_comments.vim
new file mode 100644
index 0000000..c039651
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim_ex_function_def_tail_comments.vim
@@ -0,0 +1,2 @@
+highlight link vimVar Identifier
+highlight link vimFuncScope Special
diff --git a/runtime/syntax/testdir/input/setup/vim_ex_function_fold.vim b/runtime/syntax/testdir/input/setup/vim_ex_function_fold.vim
new file mode 100644
index 0000000..c039651
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim_ex_function_fold.vim
@@ -0,0 +1,2 @@
+highlight link vimVar Identifier
+highlight link vimFuncScope Special
diff --git a/runtime/syntax/testdir/input/setup/vim_ex_let_heredoc.vim b/runtime/syntax/testdir/input/setup/vim_ex_let_heredoc.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim_ex_let_heredoc.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/setup/vim_ex_loadkeymap.vim b/runtime/syntax/testdir/input/setup/vim_ex_loadkeymap.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim_ex_loadkeymap.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/setup/vim_ex_loadkeymap_after_bar.vim b/runtime/syntax/testdir/input/setup/vim_ex_loadkeymap_after_bar.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim_ex_loadkeymap_after_bar.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/setup/vim_ex_loadkeymap_after_colon.vim b/runtime/syntax/testdir/input/setup/vim_ex_loadkeymap_after_colon.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim_ex_loadkeymap_after_colon.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/setup/vim_ex_map.vim b/runtime/syntax/testdir/input/setup/vim_ex_map.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim_ex_map.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/setup/vim_ex_match.vim b/runtime/syntax/testdir/input/setup/vim_ex_match.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim_ex_match.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/setup/vim_ex_menu.vim b/runtime/syntax/testdir/input/setup/vim_ex_menu.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim_ex_menu.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/setup/vim_ex_substitute.vim b/runtime/syntax/testdir/input/setup/vim_ex_substitute.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim_ex_substitute.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/setup/vim_ex_syntax.vim b/runtime/syntax/testdir/input/setup/vim_ex_syntax.vim
new file mode 100644
index 0000000..c039651
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim_ex_syntax.vim
@@ -0,0 +1,2 @@
+highlight link vimVar Identifier
+highlight link vimFuncScope Special
diff --git a/runtime/syntax/testdir/input/setup/vim_expr.vim b/runtime/syntax/testdir/input/setup/vim_expr.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim_expr.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/setup/vim_function_variables.vim b/runtime/syntax/testdir/input/setup/vim_function_variables.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim_function_variables.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/setup/vim_lambda.vim b/runtime/syntax/testdir/input/setup/vim_lambda.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim_lambda.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/setup/vim_line_continuation.vim b/runtime/syntax/testdir/input/setup/vim_line_continuation.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim_line_continuation.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/setup/vim_object_methods.vim b/runtime/syntax/testdir/input/setup/vim_object_methods.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim_object_methods.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/setup/vim_variables.vim b/runtime/syntax/testdir/input/setup/vim_variables.vim
new file mode 100644
index 0000000..9223fa8
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/vim_variables.vim
@@ -0,0 +1 @@
+highlight link vimVar Identifier
diff --git a/runtime/syntax/testdir/input/vim9_block.vim b/runtime/syntax/testdir/input/vim9_block.vim
new file mode 100644
index 0000000..3880f97
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim9_block.vim
@@ -0,0 +1,33 @@
+vim9script
+
+# Vim9 blocks
+
+
+{
+  var foo = 42
+}
+
+{
+  {
+    {
+      {
+	var foo = 42
+      }
+      var foo = 42
+    }
+    var foo = 42
+  }
+  var foo = 42
+}
+
+def Foo()
+  {
+    var foo = 42
+    echo foo
+  }
+enddef
+
+echo "foo" | {
+  var foo = 42
+}
+
diff --git a/runtime/syntax/testdir/input/vim9_def_variables.vim b/runtime/syntax/testdir/input/vim9_def_variables.vim
new file mode 100644
index 0000000..94ef810
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim9_def_variables.vim
@@ -0,0 +1,200 @@
+vim9script
+
+# Vim9 function variable highlighting
+
+def Foo()
+  # Declarations
+
+  var foo = expr
+
+  b:foo = expr
+  g:foo = expr
+  t:foo = expr
+  w:foo = expr
+
+  v:foo = expr
+
+  $FOO = expr
+
+  var [foo, bar] = expr
+  var [foo,
+	\ bar] = expr
+  var [$foo, $bar] = expr
+  var [$foo,
+	\ $bar] = expr
+
+  var [foo, bar; baz] = expr
+  var [foo,
+	\ bar;
+	\ baz] = expr
+  var [$foo, $bar; $baz] = expr
+  var [$foo,
+	\ $bar;
+	\ $baz] = expr
+
+  var foo =<< END
+...
+END
+  var foo =<< trim END
+  ...
+  END
+  var foo =<< eval END
+...
+END
+  var foo =<< trim eval END
+  ...
+  END
+  var foo =<< eval trim END
+    ...
+  END
+
+  # Assignments
+
+  foo = expr
+
+  foo[0] = expr
+
+  foo[1:2] = expr
+  foo[:2] = expr
+  foo[1:] = expr
+  foo[:] = expr
+
+  foo += expr
+  foo -= expr
+  foo *= expr
+  foo /= expr
+  foo %= expr
+  foo ..= expr
+
+  b:foo = expr
+  g:foo = expr
+  t:foo = expr
+  w:foo = expr
+
+  b:foo += expr
+  g:foo += expr
+  t:foo += expr
+  w:foo += expr
+
+  b:foo -= expr
+  g:foo -= expr
+  t:foo -= expr
+  w:foo -= expr
+
+  b:foo *= expr
+  g:foo *= expr
+  t:foo *= expr
+  w:foo *= expr
+
+  b:foo /= expr
+  g:foo /= expr
+  t:foo /= expr
+  w:foo /= expr
+
+  b:foo %= expr
+  g:foo %= expr
+  t:foo %= expr
+  w:foo %= expr
+
+  b:foo ..= expr
+  g:foo ..= expr
+  t:foo ..= expr
+  w:foo ..= expr
+
+  $FOO = expr
+  $FOO ..= expr
+
+  @f = expr
+  @f ..= expr
+
+  &foo = expr
+
+  &t_k1 = "\<Esc>[234;"
+
+  &foo ..= expr
+
+  &foo += expr
+  &foo -= expr
+
+  &l:foo = expr
+
+  &l:foo ..= expr
+  &l:foo += expr
+  &l:foo -= expr
+
+  &g:foo = expr
+
+  &g:foo ..= expr
+  &g:foo += expr
+  &g:foo -= expr
+
+  [foo, bar] = expr
+  [foo,
+	\ bar] = expr
+  [v:foo, v:bar] = expr
+  [v:foo,
+	\ v:bar] = expr
+  [&foo, &bar] = expr
+  [&foo,
+	\ &bar] = expr
+  [$foo, $bar] = expr
+  [$foo,
+	\  $bar] = expr
+  [@a, @b] = expr
+  [@a,
+	\  @a] = expr
+
+  [foo, bar] ..= expr
+  [foo, bar] += expr
+  [foo, bar] -= expr
+  [foo, bar] *= expr
+  [foo, bar] /= expr
+  [foo, bar] %= expr
+
+  [foo, bar; baz] = expr
+  [foo,
+	\ bar;
+	\ baz] = expr
+  [v:foo, v:bar; v:baz] = expr
+  [v:foo,
+	\ v:bar;
+	\ v:baz] = expr
+  [$foo, $bar; $baz] = expr
+  [$foo,
+	\ $bar;
+	\ $baz] = expr
+  [&foo, &bar; &baz] = expr
+  [&foo,
+	\ &bar;
+	\ &baz] = expr
+  [@a, @b; @c] = expr
+  [@a,
+	\ @b;
+	\ @c] = expr
+
+  foo =<< END
+...
+END
+  foo =<< trim END
+  ...
+  END
+  foo =<< eval END
+...
+END
+  foo =<< trim eval END
+  ...
+  END
+  foo =<< eval trim END
+    ...
+  END
+
+  # :for
+
+  for foo in expr
+  endfor
+
+  for [foo, bar] in expr
+  endfor
+enddef
+
+
diff --git a/runtime/syntax/testdir/input/vim9_ex_commands.vim b/runtime/syntax/testdir/input/vim9_ex_commands.vim
index e08cec3..1773e21 100644
--- a/runtime/syntax/testdir/input/vim9_ex_commands.vim
+++ b/runtime/syntax/testdir/input/vim9_ex_commands.vim
@@ -203,7 +203,7 @@
 :folddoclosed
 :folddoopen
 :foldopen
-:for
+:for foo in bar | endfor
 :function
 :global/.../
 :goto
@@ -785,7 +785,7 @@
 Foo() | folddoclosed
 Foo() | folddoopen
 Foo() | foldopen
-Foo() | for
+Foo() | for foo in bar | endfor
 Foo() | function
 Foo() | global/.../
 Foo() | goto
diff --git a/runtime/syntax/testdir/input/vim9_ex_for.vim b/runtime/syntax/testdir/input/vim9_ex_for.vim
new file mode 100644
index 0000000..e3c3033
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim9_ex_for.vim
@@ -0,0 +1,68 @@
+vim9script
+
+# Vim9 :for command
+
+
+# :for {var} in {object}
+
+var expr = [42]
+
+for foo in expr
+  echo foo
+endfor
+
+for foo in expr # comment
+  echo foo
+endfor
+
+for foo in
+      # comment
+      expr
+  echo foo
+endfor
+
+for foo in expr | echo foo | endfor
+
+for foo in [42]
+  echo foo
+endfor
+
+for foo in [42] | echo foo | endfor
+
+for foo: number in [42] | echo foo | endfor
+
+echo "foo" | for foo in expr
+  echo foo
+endfor
+
+
+# :for [{var1}, {var2}, ...] in {listlist}
+
+var expr2 = [[42, 83]]
+
+for [foo, bar] in expr2
+  echo foo bar
+endfor
+
+for [foo, bar] in expr2 # comment
+  echo foo bar
+endfor
+
+for [foo, bar] in
+      # comment
+      expr2
+  echo foo bar
+endfor
+
+for [foo, bar] in expr2 | echo foo bar | endfor
+
+for [foo, bar] in [[42, 83]]
+  echo foo bar
+endfor
+
+for [foo, bar] in [[42, 83]] | echo foo bar | endfor
+
+for [foo: number, bar: number] in expr2
+  echo foo bar
+endfor
+
diff --git a/runtime/syntax/testdir/input/vim9_lambda.vim b/runtime/syntax/testdir/input/vim9_lambda.vim
new file mode 100644
index 0000000..4340eb0
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim9_lambda.vim
@@ -0,0 +1,116 @@
+vim9script
+
+# Vim 9 lambda expressions
+
+var Foo: func
+var expr = 0
+
+# without return type
+Foo = () => expr
+Foo = (_) => expr
+Foo = (x) => expr
+
+Foo = (...y) => expr
+Foo = (_, ...y) => expr
+Foo = (x, ...y) => expr
+
+Foo = (x, y) => expr
+
+Foo = (_: number) => expr
+Foo = (x: number) => expr
+
+Foo = (...y: list<number>) => expr
+Foo = (_: number, ...y: list<number>) => expr
+Foo = (x: number, ...y: list<number>) => expr
+
+Foo = (x: number, y: number) => expr
+
+# with return type
+Foo = (): number => expr
+Foo = (_): number => expr
+Foo = (x): number => expr
+
+Foo = (...y): number => expr
+Foo = (_, ...y): number => expr
+Foo = (x, ...y): number => expr
+
+Foo = (x, y): number => expr
+
+Foo = (_: number): number => expr
+Foo = (x: number): number => expr
+
+Foo = (...y: list<number>): number => expr
+Foo = (_: number, ...y: list<number>): number => expr
+Foo = (x: number, ...y: list<number>): number => expr
+
+Foo = (x: number, y: number): number => expr
+
+
+# post operator comments
+
+Foo = () => # comment
+  expr
+Foo = () =>
+  # comment
+  expr
+Foo = () =>
+
+  # comment
+
+  expr
+
+
+# line continuations
+
+Foo = (x: string,
+      \ y: number,
+      \ z: bool): number => expr
+# FIXME
+Foo = (x: string,
+      \ y: number,
+      \ z: bool): number
+      \ => expr
+
+
+# funcref call
+
+echo (() => 42)()
+echo ((x: string): number => 42)("foo")
+
+
+# :help vim9-lambda
+
+var list = [1, 2, 3]
+echo filter(list, (k, v) =>
+		v > 0)
+echo filter(list, (k,
+      \	v)
+      \	=> v > 0)
+
+var Callback = (..._) => 'anything'
+echo Callback(1, 2, 3)  # displays "anything"
+
+var Lambda = (arg) => {
+	g:was_called = 'yes'
+	return expr
+    }
+
+var count = 0
+var timer = timer_start(500, (_) => {
+	 count += 1
+	 echom 'Handler called ' .. count
+     }, {repeat: 3})
+
+var dict = {}
+var d = mapnew(dict, (k, v): string => {
+     return 'value'
+   })
+
+
+# Issue #15970 (vim9: Restore and extend the recognition of Enum body items)
+
+def Op(): func(func(number, number): number): func(number, Digit): number
+    return (F: func(number, number): number) =>
+	(x: number, y: Digit): number => F(x, y.value)
+enddef ####################### ^ vimCommand?
+
diff --git a/runtime/syntax/testdir/input/vim9_super_this_keywords.vim b/runtime/syntax/testdir/input/vim9_super_this_keywords.vim
new file mode 100644
index 0000000..0370dd7
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim9_super_this_keywords.vim
@@ -0,0 +1,87 @@
+vim9script
+
+# Vim9 this and super keywords
+# VIM_TEST_SETUP hi link vim9This Todo
+# VIM_TEST_SETUP hi link vim9Super Todo
+
+def Echo(...args: list<any>)
+  echo args
+enddef
+
+class Foo
+  var x: number = 42
+  var y: number = this.x + 41
+  var z: number = this.x + this.y
+
+  def new()
+    echo this.x this.y this.z
+  enddef
+
+  def newXY(this.x, this.y, this.z)
+  enddef
+
+  def Def1(arg = this.x)
+    this.y = arg
+    this.z += arg
+  enddef
+
+  def Def2(arg = (this.x + this.y + this.z))
+    Echo(this, this.x, this.y, this.z)
+    this->Echo(this.x, this.y, this.z)
+  enddef
+
+  def Def3(): Foo
+    return this
+  enddef
+
+  def Def4(arg: Foo = this): Foo
+    return arg
+  enddef
+endclass
+
+class Bar extends Foo
+  def Def1()
+    super.Def1()
+  enddef
+
+  def Def2()
+    var a = super.x * super.y * super.z
+    var b = [super.x, super.y, super.z]
+    var c = {super: super.x, this: super.y, true: super.z}
+    var d = {super: c, this: c}
+    echo c.super
+    echo c.this
+    echo d.super.this
+    echo d.this.super
+    echo a b c
+  enddef
+
+  def Def5()
+    var a = this.x * this.y
+    var b = (this.x * this.y)
+    var c = [this.x, this.y]
+    var d = {super: this.x, this: this.y}
+    echo a b c d
+  enddef
+
+  def Def6()
+    var x = this#super#x
+    var y = super#this#y
+    this#super#Func()
+    super#this#Func()
+  enddef
+
+  def Def7(arg = super.Def3())
+    echo arg
+  enddef
+
+  def Def8(): number
+    var F = () => this.x
+    var G = () => super.x
+    return F() + G()
+  enddef
+endclass
+
+defcompile Foo
+defcompile Bar
+
diff --git a/runtime/syntax/testdir/input/vim9_super_this_keywords2.vim b/runtime/syntax/testdir/input/vim9_super_this_keywords2.vim
new file mode 100644
index 0000000..326eaf0
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim9_super_this_keywords2.vim
@@ -0,0 +1,63 @@
+vim9script
+
+# VIM_TEST_SETUP hi link vim9Super Todo
+# VIM_TEST_SETUP hi link vim9This Todo
+# See: https://github.com/vim/vim/pull/16476#issuecomment-2638191110
+
+
+class A
+  var _value: any
+
+  def new(value: any)
+    this._BaseInit(value)
+  enddef
+
+  def _BaseInit(value: any)
+    this._value = value
+  enddef
+
+  def Value(): any
+    return this._value
+  enddef
+endclass
+
+class B extends A
+  def new(value: number)
+    super._BaseInit(value)
+  enddef
+
+  def Value(): number
+    echo this
+    return super._value
+  enddef
+endclass
+
+class C extends A
+  #### E117
+  #   def new(value: string)
+  #       super(value)
+  #   enddef
+
+  #### E1034
+  #   def new(super._value)
+  #   enddef
+
+  #### E1034
+  #   def new(value: string)
+  #       super._value = value
+  #   enddef
+
+  #### E1356
+  #   def Super(): A
+  #       return super
+  #   enddef
+
+  def This(): C
+    return this
+  enddef
+endclass
+
+echo 1 == A.new(1).Value()
+echo 2 == B.new(2).Value()
+defcompile C
+
diff --git a/runtime/syntax/testdir/input/vim9_super_this_keywords3.vim b/runtime/syntax/testdir/input/vim9_super_this_keywords3.vim
new file mode 100644
index 0000000..fb1f610
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim9_super_this_keywords3.vim
@@ -0,0 +1,27 @@
+vim9script
+
+# VIM_TEST_SETUP hi link vim9Super Todo
+# VIM_TEST_SETUP hi link vim9This Todo
+# See: https://github.com/vim/vim/pull/16476#issuecomment-2635119478
+
+
+class A
+    const _value: number
+
+    def new(this._value)
+    enddef
+
+    def K(): func(any): number
+        return ((_: any) => this._value)
+    enddef
+endclass
+
+class B extends A
+    def K(): func(any): number
+        return ((_: any) => super._value)
+    enddef
+endclass
+
+echo 1 == A.new(1).K()(null)
+echo 2 == B.new(2).K()(null)
+
diff --git a/runtime/syntax/testdir/input/vim9_variables.vim b/runtime/syntax/testdir/input/vim9_variables.vim
new file mode 100644
index 0000000..88dfb58
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim9_variables.vim
@@ -0,0 +1,197 @@
+vim9script
+
+# Vim9 variable highlighting
+
+# Declarations
+
+var foo = expr
+ 
+b:foo = expr
+g:foo = expr
+t:foo = expr
+w:foo = expr
+
+v:foo = expr
+
+$FOO = expr
+ 
+var [foo, bar] = expr
+var [foo,
+      \ bar] = expr
+var [$foo, $bar] = expr
+var [$foo,
+      \ $bar] = expr
+
+var [foo, bar; baz] = expr
+var [foo,
+      \ bar;
+      \ baz] = expr
+var [$foo, $bar; $baz] = expr
+var [$foo,
+      \ $bar;
+      \ $baz] = expr
+
+var foo =<< END
+...
+END
+var foo =<< trim END
+...
+END
+var foo =<< eval END
+...
+END
+var foo =<< trim eval END
+...
+END
+var foo =<< eval trim END
+...
+END
+
+# Assignments
+
+foo = expr
+
+foo[0] = expr
+
+foo[1:2] = expr
+foo[:2] = expr
+foo[1:] = expr
+foo[:] = expr
+
+foo += expr
+foo -= expr
+foo *= expr
+foo /= expr
+foo %= expr
+foo ..= expr
+
+b:foo = expr
+g:foo = expr
+t:foo = expr
+w:foo = expr
+
+b:foo += expr
+g:foo += expr
+t:foo += expr
+w:foo += expr
+
+b:foo -= expr
+g:foo -= expr
+t:foo -= expr
+w:foo -= expr
+
+b:foo *= expr
+g:foo *= expr
+t:foo *= expr
+w:foo *= expr
+
+b:foo /= expr
+g:foo /= expr
+t:foo /= expr
+w:foo /= expr
+
+b:foo %= expr
+g:foo %= expr
+t:foo %= expr
+w:foo %= expr
+
+b:foo ..= expr
+g:foo ..= expr
+t:foo ..= expr
+w:foo ..= expr
+
+$FOO = expr
+$FOO ..= expr
+ 
+@f = expr
+@f ..= expr
+ 
+&foo = expr
+ 
+&t_k1 = "\<Esc>[234;"
+
+&foo ..= expr
+
+&foo += expr
+&foo -= expr
+
+&l:foo = expr
+
+&l:foo ..= expr
+&l:foo += expr
+&l:foo -= expr
+
+&g:foo = expr
+
+&g:foo ..= expr
+&g:foo += expr
+&g:foo -= expr
+ 
+[foo, bar] = expr
+[foo,
+      \ bar] = expr
+[v:foo, v:bar] = expr
+[v:foo,
+      \ v:bar] = expr
+[&foo, &bar] = expr
+[&foo,
+      \ &bar] = expr
+[$foo, $bar] = expr
+[$foo,
+      \  $bar] = expr
+[@a, @b] = expr
+[@a,
+      \  @a] = expr
+
+[foo, bar] ..= expr
+[foo, bar] += expr
+[foo, bar] -= expr
+[foo, bar] *= expr
+[foo, bar] /= expr
+[foo, bar] %= expr
+
+[foo, bar; baz] = expr
+[foo,
+      \ bar;
+      \ baz] = expr
+[v:foo, v:bar; v:baz] = expr
+[v:foo,
+      \ v:bar;
+      \ v:baz] = expr
+[$foo, $bar; $baz] = expr
+[$foo,
+      \ $bar;
+      \ $baz] = expr
+[&foo, &bar; &baz] = expr
+[&foo,
+      \ &bar;
+      \ &baz] = expr
+[@a, @b; @c] = expr
+[@a,
+      \ @b;
+      \ @c] = expr
+
+foo =<< END
+...
+END
+foo =<< trim END
+...
+END
+foo =<< eval END
+...
+END
+foo =<< trim eval END
+...
+END
+foo =<< eval trim END
+...
+END
+
+# :for
+
+for foo in expr
+endfor
+
+for [foo, bar] in expr
+endfor
+
diff --git a/runtime/syntax/testdir/input/vim_ex_commands.vim b/runtime/syntax/testdir/input/vim_ex_commands.vim
index 7a58365..9fa1458 100644
--- a/runtime/syntax/testdir/input/vim_ex_commands.vim
+++ b/runtime/syntax/testdir/input/vim_ex_commands.vim
@@ -198,7 +198,7 @@
 :folddoopen
 :folddoclosed
 :foldopen
-:for
+:for foo in bar | endfor
 :function
 :global/.../
 :goto
@@ -783,7 +783,7 @@
 call Foo() | folddoopen
 call Foo() | folddoclosed
 call Foo() | foldopen
-call Foo() | for
+call Foo() | for foo in bar | endfor
 call Foo() | function
 call Foo() | global/.../
 call Foo() | goto
diff --git a/runtime/syntax/testdir/input/vim_ex_def_nested.vim b/runtime/syntax/testdir/input/vim_ex_def_nested.vim
index 008c415..3b9302d 100644
--- a/runtime/syntax/testdir/input/vim_ex_def_nested.vim
+++ b/runtime/syntax/testdir/input/vim_ex_def_nested.vim
@@ -1,5 +1,6 @@
 vim9script
 # Vim9 :def command (nested)
+# VIM_TEST_SETUP hi link vim9This Todo
 
 class Test
     const name: string
diff --git a/runtime/syntax/testdir/input/vim_ex_def_nested_fold.vim b/runtime/syntax/testdir/input/vim_ex_def_nested_fold.vim
index 601f553..f213107 100644
--- a/runtime/syntax/testdir/input/vim_ex_def_nested_fold.vim
+++ b/runtime/syntax/testdir/input/vim_ex_def_nested_fold.vim
@@ -1,7 +1,9 @@
 vim9script
+
 # Vim9 :def command (nested)
 # VIM_TEST_SETUP let g:vimsyn_folding = 'f'
 # VIM_TEST_SETUP setl fdc=2 fdm=syntax
+# VIM_TEST_SETUP hi link vim9This Todo
 
 class Test
     const name: string
diff --git a/runtime/syntax/testdir/input/vim_ex_for.vim b/runtime/syntax/testdir/input/vim_ex_for.vim
new file mode 100644
index 0000000..d72f6d6
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim_ex_for.vim
@@ -0,0 +1,60 @@
+" Vim :for command
+
+
+" :for {var} in {object}
+
+let expr = [42]
+
+for foo in expr
+  echo foo
+endfor
+
+for foo in expr " comment
+  echo foo
+endfor
+
+for foo in
+      "\ comment
+      \ expr
+  echo foo
+endfor
+
+for foo in expr | echo foo | endfor
+
+for foo in [42]
+  echo foo
+endfor
+
+for foo in [42] | echo foo | endfor
+
+echo "foo" | for foo in expr
+  echo foo
+endfor
+
+
+" :for [{var1}, {var2}, ...] in {listlist}
+
+let expr = [[42, 83]]
+
+for [foo, bar] in expr
+  echo foo bar
+endfor
+
+for [foo, bar] in expr " comment
+  echo foo bar
+endfor
+
+for [foo, bar] in
+      "\ comment
+      \ expr
+  echo foo bar
+endfor
+
+for [foo, bar] in expr | echo foo bar | endfor
+
+for [foo, bar] in [[42, 83]]
+  echo foo bar
+endfor
+
+for [foo, bar] in [[42, 83]] | echo foo bar | endfor
+
diff --git a/runtime/syntax/testdir/input/vim_expr.vim b/runtime/syntax/testdir/input/vim_expr.vim
index 569d4ce..ddaf519 100644
--- a/runtime/syntax/testdir/input/vim_expr.vim
+++ b/runtime/syntax/testdir/input/vim_expr.vim
@@ -85,6 +85,21 @@
 echo 0zFF00.ED01.5DAF
 echo 0zFF.00.ED.01.5D.AF
 
+" List
+
+echo []
+echo [42]
+echo [[11, 12], [21, 22], [31, 32]]
+echo [1,
+      \ 2,
+      \ 3,
+      \ 4
+      \]
+echo [1, 'two', 1 + 2, "fo" .. "ur"]
+
+" Issue #5830 (Incorrect syntax highlighting in Vim script when omitting space in list of string)
+let l = ['a','b','c']
+
 " Operators
 
 " Ternary
@@ -169,9 +184,26 @@
 echo expr is?    expr
 echo expr isnot? expr
 
-" Unreported issue (incorrectly matches as "echo vimNumber *vimCommand* vimNumber")
+" Unreported issue ("is" incorrectly matches as "echo vimNumber *vimCommand* vimNumber")
 echo 42 is 42
 
+" Line continuation
+let foo = foo +
+      \
+      "\ comment
+      \
+      "\ comment
+      \ bar +
+      \ "baz"
+
+let foo = foo +
+      "\ comment
+      \
+      "\ comment
+      \
+      \ bar +
+      \ "baz"
+
 
 " Issue #16221 (vimString becomes vimVar when preceded by !)
 let bar = !'g:bar'->exists()
diff --git a/runtime/syntax/testdir/input/vim_function_variables.vim b/runtime/syntax/testdir/input/vim_function_variables.vim
new file mode 100644
index 0000000..9a9d4f9
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim_function_variables.vim
@@ -0,0 +1,384 @@
+" Vim function variable highlighting
+
+function Foo()
+  " :let
+
+  let foo = expr
+
+  let foo[0] = expr
+
+  let foo[1:2] = expr
+  let foo[:2] = expr
+  let foo[1:] = expr
+  let foo[:] = expr
+
+  let foo["key"] = expr
+  let foo['key'] = expr
+
+  let foo += expr
+  let foo -= expr
+  let foo *= expr
+  let foo /= expr
+  let foo %= expr
+  let foo .= expr
+  let foo ..= expr
+
+  let b:foo = expr
+
+  let b:foo[0] = expr
+
+  let b:foo[1:2] = expr
+  let b:foo[:2] = expr
+  let b:foo[1:] = expr
+  let b:foo[:] = expr
+
+  let bfoo["key"] = expr
+  let bfoo['key'] = expr
+
+  let b:foo += expr
+  let b:foo -= expr
+  let b:foo *= expr
+  let b:foo /= expr
+  let b:foo %= expr
+  let b:foo .= expr
+  let b:foo ..= expr
+
+  let g:foo = expr
+
+  let g:foo[0] = expr
+
+  let g:foo[1:2] = expr
+  let g:foo[:2] = expr
+  let g:foo[1:] = expr
+  let g:foo[:] = expr
+
+  let g:foo["key"] = expr
+  let g:foo['key'] = expr
+
+  let g:foo += expr
+  let g:foo -= expr
+  let g:foo *= expr
+  let g:foo /= expr
+  let g:foo %= expr
+  let g:foo .= expr
+  let g:foo ..= expr
+
+  let s:foo = expr
+
+  let s:foo[0] = expr
+
+  let s:foo[1:2] = expr
+  let s:foo[:2] = expr
+  let s:foo[1:] = expr
+  let s:foo[:] = expr
+
+  let s:foo["key"] = expr
+  let s:foo['key'] = expr
+
+  let s:foo += expr
+  let s:foo -= expr
+  let s:foo *= expr
+  let s:foo /= expr
+  let s:foo %= expr
+  let s:foo .= expr
+  let s:foo ..= expr
+
+  let t:foo = expr
+
+  let t:foo[0] = expr
+
+  let t:foo[1:2] = expr
+  let t:foo[:2] = expr
+  let t:foo[1:] = expr
+  let t:foo[:] = expr
+
+  let t:foo["key"] = expr
+  let t:foo['key'] = expr
+
+  let t:foo += expr
+  let t:foo -= expr
+  let t:foo *= expr
+  let t:foo /= expr
+  let t:foo %= expr
+  let t:foo .= expr
+  let t:foo ..= expr
+
+  let v:foo = expr
+
+  let v:foo[0] = expr
+
+  let v:foo[1:2] = expr
+  let v:foo[:2] = expr
+  let v:foo[1:] = expr
+  let v:foo[:] = expr
+
+  let v:foo["key"] = expr
+  let v:foo['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 w:foo = expr
+
+  let w:foo[0] = expr
+
+  let w:foo[1:2] = expr
+  let w:foo[:2] = expr
+  let w:foo[1:] = expr
+  let w:foo[:] = expr
+
+  let w:foo["key"] = expr
+  let w:foo['key'] = expr
+
+  let w:foo += expr
+  let w:foo -= expr
+  let w:foo *= expr
+  let w:foo /= expr
+  let w:foo %= expr
+  let w:foo .= expr
+  let w:foo ..= expr
+
+  let $FOO = expr
+  let $FOO .= expr
+  let $FOO ..= expr
+
+  let @f = expr
+  let @f .= expr
+  let @f ..= expr
+
+  let &foo = expr
+
+  let &t_k1 = "\<Esc>[234;"
+
+  let &foo .= expr
+  let &foo ..= expr
+  let &foo += expr
+  let &foo -= expr
+
+  let &l:foo = expr
+
+  let &l:foo .= expr
+  let &l:foo ..= expr
+  let &l:foo += expr
+  let &l:foo -= expr
+
+  let &g:foo = expr
+
+  let &g:foo .= expr
+  let &g:foo ..= expr
+  let &g:foo += expr
+  let &g:foo -= 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 [$foo, $bar] = expr
+  let [$foo,
+	\  $bar] = expr
+  let [@a, @b] = expr
+  let [@a,
+	\  @b] = expr
+
+  let [foo, bar] .= expr
+  let [foo, bar] ..= expr
+  let [foo, bar] += expr
+  let [foo, bar] -= expr
+
+  let [foo, bar; baz] = expr
+  let [foo,
+	\ bar;
+	\ baz] = expr
+  let [v:foo, v:bar; v:baz] = expr
+  let [v:foo,
+	\ v:bar;
+	\ v:baz] = expr
+  let [$foo, $bar; $baz] = expr
+  let [$foo,
+	\ $bar;
+	\ $baz] = expr
+  let [&foo, &bar; &baz] = expr
+  let [&foo,
+	\ &bar;
+	\ &baz] = expr
+  let [@a, @b; @c] = expr
+  let [@a,
+	\ @b;
+	\ @c] = expr
+
+  let foo =<< END
+...
+END
+  let foo =<< trim END
+  ...
+  END
+  let foo =<< eval END
+...
+END
+  let foo =<< trim eval END
+  ...
+  END
+  let foo =<< eval trim END
+    ...
+  END
+
+  " :let list values
+
+  let foo
+  let foo bar
+  let foo
+	"\ comment
+	\ bar
+
+  let foo " comment
+  let foo "\ comment
+  let foo | echo "Foo"
+  let foo bar " comment
+  let foo bar | echo "Foo"
+  let foo bar "\ comment
+
+  " :unlet
+
+  unlet foo
+  unlet foo bar
+  unlet foo
+	"\ comment
+	\ bar
+
+  unlet! foo
+  unlet! foo bar
+  unlet! foo
+	"\ comment
+	\ bar
+
+  unlet $FOO
+  unlet! $FOO
+
+  unlet list[3]
+  unlet list[3:]
+  unlet dict['two']
+  unlet dict.two
+
+  unlet foo " comment
+  unlet foo "\ comment
+  unlet foo | echo "Foo"
+  unlet foo bar " comment
+  unlet foo bar "\ comment
+  unlet foo bar | echo "Foo"
+
+  " :const
+
+  const foo = expr
+
+  const [foo, bar] = expr
+
+  const [foo, bar; baz] = expr
+
+  const foo =<< END
+...
+END
+  const foo =<< trim END
+  ...
+  END
+  const foo =<< eval END
+...
+END
+  const foo =<< trim eval END
+  ...
+  END
+  const foo =<< eval trim END
+    ...
+  END
+
+  const foo
+  const foo bar
+
+  " :for
+
+  for foo in expr
+  endfor
+
+  for [foo, bar] in expr
+  endfor
+
+  " :lockvar
+
+  lockvar foo
+  lockvar foo bar
+  lockvar foo
+	"\ comment
+	\ bar
+
+  lockvar foo " comment
+  lockvar foo | echo "Foo"
+  lockvar foo bar " comment
+  lockvar foo bar | echo "Foo"
+
+  lockvar! foo
+  lockvar! foo bar
+  lockvar! foo
+	"\ comment
+	\ bar
+
+  lockvar! foo " comment
+  lockvar! foo | echo "Foo"
+  lockvar! foo bar " comment
+  lockvar! foo bar | echo "Foo"
+
+  lockvar 2 foo
+  lockvar 2 foo bar
+  lockvar 2 foo
+	"\ comment
+	\ bar
+
+  lockvar 2 foo " comment
+  lockvar 2 foo | echo "Foo"
+  lockvar 2 foo bar " comment
+  lockvar 2 foo bar | echo "Foo"
+
+  " :unlockvar
+
+  unlockvar foo
+  unlockvar foo bar
+  unlockvar foo
+	"\ comment
+	\ bar
+
+  unlockvar foo " comment
+  unlockvar foo | echo "Foo"
+  unlockvar foo bar " comment
+  unlockvar foo bar | echo "Foo"
+
+  unlockvar! foo
+  unlockvar! foo bar
+  unlockvar! foo
+	"\ comment
+	\ bar
+
+  unlockvar! foo " comment
+  unlockvar! foo | echo "Foo"
+  unlockvar! foo bar " comment
+  unlockvar! foo bar | echo "Foo"
+
+  unlockvar 2 foo
+  unlockvar 2 foo bar
+  unlockvar 2 foo
+	"\ comment
+	\ bar
+
+  unlockvar 2 foo " comment
+  unlockvar 2 foo | echo "Foo"
+  unlockvar 2 foo bar " comment
+  unlockvar 2 foo bar | echo "Foo"
+endfunction
+
diff --git a/runtime/syntax/testdir/input/vim_lambda.vim b/runtime/syntax/testdir/input/vim_lambda.vim
new file mode 100644
index 0000000..73a221b
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim_lambda.vim
@@ -0,0 +1,120 @@
+" Vim lambda expressions
+
+
+let expr = 42
+
+let Foo = {-> expr}
+let Foo = {_ -> expr}
+let Foo = {... -> expr}
+let Foo = {x -> expr}
+let Foo = {x, _ -> expr}
+let Foo = {x, ... -> expr}
+let Foo = {x, y -> expr}
+
+
+" line continuations
+
+let Foo = {->
+      "\ comment
+      \ expr
+      \ }
+let Foo = {_ ->
+      "\ comment
+      \ expr
+      \ }
+let Foo = {... ->
+      "\ comment
+      \ expr
+      \ }
+let Foo = {x ->
+      \ expr
+      "\ comment
+      \ }
+let Foo = {x, y ->
+      "\ comment
+      \ expr
+      \ }
+
+let Foo = {
+      \ ->
+      "\ comment
+      \ expr
+      \ }
+let Foo = {x
+      \ ->
+      "\ comment
+      \ expr
+      \ }
+let Foo = {x, y
+      \ ->
+      "\ comment
+      \ expr
+      \ }
+
+let Foo = {x,
+      \ y,
+      \ z -> expr}
+
+let Foo = {
+      \ x,
+      \ y,
+      \ z
+      \ ->
+      "\ comment
+      \ expr
+      \ }
+
+let Foo = {-> [
+      \ 42,
+      \ 83
+      \]}
+
+let Foo = {-> {
+      \ 'a': 42,
+      \ 'b': 83
+      \}}
+
+let Foo = {-> #{
+      \ a: 42,
+      \ b: 83
+      \}}
+
+let Foo = {-> {->[
+      \ 42,
+      \ 83
+      \]}}
+
+let Foo = {-> {-> {
+      \ 'a': 42,
+      \ 'b': 83
+      \}}}
+
+let Foo = {-> {-> #{
+      \ a: 42,
+      \ b: 83
+      \}}}
+
+" :help lambda
+
+:let F = {arg1, arg2 -> arg1 - arg2}
+:echo F(5, 2)
+
+:let F = {-> 'error function'}
+:echo F('ignored')
+
+:function Foo(arg)
+:  let i = 3
+:  return {x -> x + i - a:arg}
+:endfunction
+:let Bar = Foo(4)
+:echo Bar(6)
+
+:echo map([1, 2, 3], {idx, val -> val + 1})
+" [2, 3, 4]  
+
+:echo sort([3,7,2,1,4], {a, b -> a - b})
+" [1, 2, 3, 4, 7]
+:let timer = timer_start(500,
+		\ {-> execute("echo 'Handler called'", "")},
+		\ {'repeat': 3})
+
diff --git a/runtime/syntax/testdir/input/vim_object_methods.vim b/runtime/syntax/testdir/input/vim_object_methods.vim
index d22c7f2..11d01a6 100644
--- a/runtime/syntax/testdir/input/vim_object_methods.vim
+++ b/runtime/syntax/testdir/input/vim_object_methods.vim
@@ -1,5 +1,7 @@
 vim9script
-# VIM_TEST_SETUP hi link vimMethodName Todo
+
+# VIM_TEST_SETUP hi link vim9MethodName Special
+# VIM_TEST_SETUP hi link vim9This Todo
 
 
 # Vim |builtin-object-methods| and namesake builtin functions.
diff --git a/runtime/syntax/testdir/input/vim_variables.vim b/runtime/syntax/testdir/input/vim_variables.vim
index 6f77da9..af02fa8 100644
--- a/runtime/syntax/testdir/input/vim_variables.vim
+++ b/runtime/syntax/testdir/input/vim_variables.vim
@@ -11,6 +11,9 @@
 let foo[1:] = expr
 let foo[:] = expr
 
+let foo["key"] = expr
+let foo['key'] = expr
+
 let foo += expr
 let foo -= expr
 let foo *= expr
@@ -19,38 +22,175 @@
 let foo .= expr
 let foo ..= expr
 
+let b:foo = expr
+
+let b:foo[0] = expr
+
+let b:foo[1:2] = expr
+let b:foo[:2] = expr
+let b:foo[1:] = expr
+let b:foo[:] = expr
+
+let bfoo["key"] = expr
+let bfoo['key'] = expr
+
+let b:foo += expr
+let b:foo -= expr
+let b:foo *= expr
+let b:foo /= expr
+let b:foo %= expr
+let b:foo .= expr
+let b:foo ..= expr
+
+let g:foo = expr
+
+let g:foo[0] = expr
+
+let g:foo[1:2] = expr
+let g:foo[:2] = expr
+let g:foo[1:] = expr
+let g:foo[:] = expr
+
+let g:foo["key"] = expr
+let g:foo['key'] = expr
+
+let g:foo += expr
+let g:foo -= expr
+let g:foo *= expr
+let g:foo /= expr
+let g:foo %= expr
+let g:foo .= expr
+let g:foo ..= expr
+
+let s:foo = expr
+
+let s:foo[0] = expr
+
+let s:foo[1:2] = expr
+let s:foo[:2] = expr
+let s:foo[1:] = expr
+let s:foo[:] = expr
+
+let s:foo["key"] = expr
+let s:foo['key'] = expr
+
+let s:foo += expr
+let s:foo -= expr
+let s:foo *= expr
+let s:foo /= expr
+let s:foo %= expr
+let s:foo .= expr
+let s:foo ..= expr
+
+let t:foo = expr
+
+let t:foo[0] = expr
+
+let t:foo[1:2] = expr
+let t:foo[:2] = expr
+let t:foo[1:] = expr
+let t:foo[:] = expr
+
+let t:foo["key"] = expr
+let t:foo['key'] = expr
+
+let t:foo += expr
+let t:foo -= expr
+let t:foo *= expr
+let t:foo /= expr
+let t:foo %= expr
+let t:foo .= expr
+let t:foo ..= expr
+
+let v:foo = expr
+
+let v:foo[0] = expr
+
+let v:foo[1:2] = expr
+let v:foo[:2] = expr
+let v:foo[1:] = expr
+let v:foo[:] = expr
+
+let v:foo["key"] = expr
+let v:foo['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 w:foo = expr
+
+let w:foo[0] = expr
+
+let w:foo[1:2] = expr
+let w:foo[:2] = expr
+let w:foo[1:] = expr
+let w:foo[:] = expr
+
+let w:foo["key"] = expr
+let w:foo['key'] = expr
+
+let w:foo += expr
+let w:foo -= expr
+let w:foo *= expr
+let w:foo /= expr
+let w:foo %= expr
+let w:foo .= expr
+let w:foo ..= expr
+
 let $FOO = expr
 let $FOO .= expr
+let $FOO ..= expr
 
 let @f = expr
 let @f .= expr
+let @f ..= expr
 
 let &foo = expr
 
 let &t_k1 = "\<Esc>[234;"
 
 let &foo .= expr
-
+let &foo ..= expr
 let &foo += expr
 let &foo -= expr
 
 let &l:foo = expr
 
 let &l:foo .= expr
+let &l:foo ..= expr
 let &l:foo += expr
 let &l:foo -= expr
 
 let &g:foo = expr
 
 let &g:foo .= expr
+let &g:foo ..= expr
 let &g:foo += expr
 let &g:foo -= 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 [$foo, $bar] = expr
+let [$foo,
+      \  $bar] = expr
+let [@a, @b] = expr
+let [@a,
+      \  @b] = expr
 
 let [foo, bar] .= expr
+let [foo, bar] ..= expr
 let [foo, bar] += expr
 let [foo, bar] -= expr
 
@@ -58,10 +198,22 @@
 let [foo,
       \ bar;
       \ baz] = expr
-
-let [foo, bar; baz] .= expr
-let [foo, bar; baz] += expr
-let [foo, bar; baz] -= expr
+let [v:foo, v:bar; v:baz] = expr
+let [v:foo,
+      \ v:bar;
+      \ v:baz] = expr
+let [$foo, $bar; $baz] = expr
+let [$foo,
+      \ $bar;
+      \ $baz] = expr
+let [&foo, &bar; &baz] = expr
+let [&foo,
+      \ &bar;
+      \ &baz] = expr
+let [@a, @b; @c] = expr
+let [@a,
+      \ @b;
+      \ @c] = expr
 
 let foo =<< END
 ...
@@ -79,19 +231,33 @@
 ...
 END
 
+" :let list values
+
 let foo
 let foo bar
+let foo
+      "\ comment
+      \ bar
+
+let foo " comment
+let foo "\ comment
+let foo | echo "Foo"
+let foo bar " comment
+let foo bar | echo "Foo"
+let foo bar "\ comment
 
 " :unlet
 
 unlet foo
 unlet foo bar
 unlet foo
+      "\ comment
       \ bar
 
 unlet! foo
 unlet! foo bar
 unlet! foo
+      "\ comment
       \ bar
 
 unlet $FOO
@@ -102,6 +268,13 @@
 unlet dict['two']
 unlet dict.two
 
+unlet foo " comment
+unlet foo "\ comment
+unlet foo | echo "Foo"
+unlet foo bar " comment
+unlet foo bar "\ comment
+unlet foo bar | echo "Foo"
+
 " :const
 
 const foo = expr
@@ -136,3 +309,74 @@
 
 for [foo, bar] in expr
 endfor
+
+" :lockvar
+
+lockvar foo
+lockvar foo bar
+lockvar foo
+      "\ comment
+      \ bar
+
+lockvar foo " comment
+lockvar foo | echo "Foo"
+lockvar foo bar " comment
+lockvar foo bar | echo "Foo"
+
+lockvar! foo
+lockvar! foo bar
+lockvar! foo
+      "\ comment
+      \ bar
+
+lockvar! foo " comment
+lockvar! foo | echo "Foo"
+lockvar! foo bar " comment
+lockvar! foo bar | echo "Foo"
+
+lockvar 2 foo
+lockvar 2 foo bar
+lockvar 2 foo
+      "\ comment
+      \ bar
+
+lockvar 2 foo " comment
+lockvar 2 foo | echo "Foo"
+lockvar 2 foo bar " comment
+lockvar 2 foo bar | echo "Foo"
+
+" :unlockvar
+
+unlockvar foo
+unlockvar foo bar
+unlockvar foo
+      "\ comment
+      \ bar
+
+unlockvar foo " comment
+unlockvar foo | echo "Foo"
+unlockvar foo bar " comment
+unlockvar foo bar | echo "Foo"
+
+unlockvar! foo
+unlockvar! foo bar
+unlockvar! foo
+      "\ comment
+      \ bar
+
+unlockvar! foo " comment
+unlockvar! foo | echo "Foo"
+unlockvar! foo bar " comment
+unlockvar! foo bar | echo "Foo"
+
+unlockvar 2 foo
+unlockvar 2 foo bar
+unlockvar 2 foo
+      "\ comment
+      \ bar
+
+unlockvar 2 foo " comment
+unlockvar 2 foo | echo "Foo"
+unlockvar 2 foo bar " comment
+unlockvar 2 foo bar | echo "Foo"
+