0
0
mirror of https://github.com/vim/vim.git synced 2025-09-23 03:43:49 -04:00

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>
This commit is contained in:
Doug Kearns
2025-02-10 22:00:27 +01:00
committed by Christian Brabandt
parent 54d7f18c38
commit 1aa287e048
221 changed files with 4368 additions and 470 deletions

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -0,0 +1,2 @@
highlight link vimVar Identifier
highlight link vimFuncScope Special

View File

@@ -0,0 +1,2 @@
highlight link vimVar Identifier
highlight link vimFuncScope Special

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -0,0 +1,2 @@
highlight link vimVar Identifier
highlight link vimFuncScope Special

View File

@@ -0,0 +1,2 @@
highlight link vimVar Identifier
highlight link vimFuncScope Special

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -0,0 +1,2 @@
highlight link vimVar Identifier
highlight link vimFuncScope Special

View File

@@ -0,0 +1,2 @@
highlight link vimVar Identifier
highlight link vimFuncScope Special

View File

@@ -0,0 +1,2 @@
highlight link vimVar Identifier
highlight link vimFuncScope Special

View File

@@ -0,0 +1,2 @@
highlight link vimVar Identifier
highlight link vimFuncScope Special

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -0,0 +1,2 @@
highlight link vimVar Identifier
highlight link vimFuncScope Special

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -0,0 +1 @@
highlight link vimVar Identifier

View File

@@ -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
}

View File

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

View File

@@ -203,7 +203,7 @@ vim9script
:folddoclosed
:folddoopen
:foldopen
:for
:for foo in bar | endfor
:function
:global/.../
:goto
@@ -785,7 +785,7 @@ Foo() | foldclose
Foo() | folddoclosed
Foo() | folddoopen
Foo() | foldopen
Foo() | for
Foo() | for foo in bar | endfor
Foo() | function
Foo() | global/.../
Foo() | goto

View File

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

View File

@@ -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?

View File

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

View File

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

View File

@@ -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)

View File

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

View File

@@ -198,7 +198,7 @@
:folddoopen
:folddoclosed
:foldopen
:for
:for foo in bar | endfor
:function
:global/.../
:goto
@@ -783,7 +783,7 @@ call Foo() | foldclose
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

View File

@@ -1,5 +1,6 @@
vim9script
# Vim9 :def command (nested)
# VIM_TEST_SETUP hi link vim9This Todo
class Test
const name: string

View File

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

View File

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

View File

@@ -85,6 +85,21 @@ echo 0zFF00ED015DAF
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 !~? expr
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()

View File

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

View File

@@ -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})

View File

@@ -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.

View File

@@ -11,6 +11,9 @@ 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
@@ -19,38 +22,175 @@ 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
@@ -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 [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 @@ 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
@@ -102,6 +268,13 @@ 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
@@ -136,3 +309,74 @@ 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"