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"
+