runtime(vim): Update base-syntax and generator, only match valid predefined variables

- Only match valid predefined and option variables.
- Match scope dictionaries.
- Highlight scope prefixed variables as a scope dictionary accessor. The
  vimVarScope syntax group can be linked to vimVar to disable this.
- Include support for Neovim-only predefined and option variables.

Temporary collateral damage - scope dictionaries match instead of keys
in dictionary literals.

closes: #16727

Signed-off-by: Doug Kearns <dougkearns@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Doug Kearns
2025-03-09 16:30:28 +01:00
committed by Christian Brabandt
parent 42e498d9c4
commit 3dca512939
142 changed files with 1655 additions and 962 deletions

View File

@ -12,7 +12,7 @@ def Foo()
t:foo = expr
w:foo = expr
v:foo = expr
v:true = expr
$FOO = expr
@ -59,6 +59,9 @@ END
foo[1:] = expr
foo[:] = expr
foo["key"] = expr
foo['key'] = expr
foo += expr
foo -= expr
foo *= expr
@ -107,36 +110,36 @@ END
@f = expr
@f ..= expr
&foo = expr
&ari = expr
&t_k1 = "\<Esc>[234;"
&foo ..= expr
&ari ..= expr
&foo += expr
&foo -= expr
&ari += expr
&ari -= expr
&l:foo = expr
&l:aleph = expr
&l:foo ..= expr
&l:foo += expr
&l:foo -= expr
&l:aleph ..= expr
&l:aleph += expr
&l:aleph -= expr
&g:foo = expr
&g:aleph = expr
&g:foo ..= expr
&g:foo += expr
&g:foo -= expr
&g:aleph ..= expr
&g:aleph += expr
&g:aleph -= expr
[foo, bar] = expr
[foo,
\ bar] = expr
[v:foo, v:bar] = expr
[v:foo,
\ v:bar] = expr
[&foo, &bar] = expr
[&foo,
\ &bar] = expr
[v:true, v:false] = expr
[v:true,
\ v:false] = expr
[&ari, &bkc] = expr
[&ari,
\ &bkc] = expr
[$foo, $bar] = expr
[$foo,
\ $bar] = expr
@ -155,18 +158,18 @@ END
[foo,
\ bar;
\ baz] = expr
[v:foo, v:bar; v:baz] = expr
[v:foo,
\ v:bar;
\ v:baz] = expr
[v:true, v:false; v:none] = expr
[v:true,
\ v:false;
\ v:none] = expr
[$foo, $bar; $baz] = expr
[$foo,
\ $bar;
\ $baz] = expr
[&foo, &bar; &baz] = expr
[&foo,
\ &bar;
\ &baz] = expr
[&ari, &bkc; &cmp] = expr
[&ari,
\ &bkc;
\ &cmp] = expr
[@a, @b; @c] = expr
[@a,
\ @b;
@ -195,6 +198,28 @@ END
for [foo, bar] in expr
endfor
# Scope dictionaries
echo get(b:, 'foo', 42)
echo get(w:, 'foo', 42)
echo get(t:, 'foo', 42)
echo get(g:, 'foo', 42)
echo get(v:, 'foo', 42)
for k in keys(b:) | echo b:[k] | endfor
for k in keys(w:) | echo w:[k] | endfor
for k in keys(t:) | echo t:[k] | endfor
for k in keys(g:) | echo g:[k] | endfor
for k in keys(v:) | echo v:[k] | endfor
# Neovim-specific variables (not highlighted by default)
echo v:lua v:msgpack_types v:relnum v:stderr v:termrequest v:virtnum
echo &channel &inccommand &mousescroll &pumblend &redrawdebug &scrollback
echo &shada &shadafile &statuscolumn &termpastefilter &termsync &winbar
echo &winblend &winhighlight
enddef

View File

@ -2,6 +2,55 @@ vim9script
# Vim9-script expressions
# Dictionary
echo {}
echo { foo: 21 * 2 }
echo { -foo-: 21 * 2 }
echo { 42: 21 * 2 }
echo { 'foo': 21 * 2 }
echo { "foo": 21 * 2 }
echo { foo: { bar: 21 * 2 } }
echo { foo: { -bar-: 21 * 2 } }
echo { foo: { 42: 21 * 2 } }
echo { foo: { 'bar': 21 * 2 } }
echo { foo: { "bar": 21 * 2 } }
echo { -foo-: { bar: 21 * 2 } }
echo { -foo-: { -bar-: 21 * 2 } }
echo { -foo-: { 42: 21 * 2 } }
echo { -foo-: { 'bar': 21 * 2 } }
echo { -foo-: { "bar": 21 * 2 } }
echo { 42: { bar: 21 * 2 } }
echo { 42: { -bar-: 21 * 2 } }
echo { 42: { 42: 21 * 2 } }
echo { 42: { 'bar': 21 * 2 } }
echo { 42: { "bar": 21 * 2 } }
echo { 'foo': { bar: 21 * 2 } }
echo { 'foo': { -bar-: 21 * 2 } }
echo { 'foo': { 42: 21 * 2 } }
echo { 'foo': { "bar": 21 * 2 } }
echo { 'foo': { 'bar': 21 * 2 } }
echo { "foo": { bar: 21 * 2 } }
echo { "foo": { -bar-: 21 * 2 } }
echo { "foo": { 42: 21 * 2 } }
echo { "foo": { 'bar': 21 * 2 } }
echo { "foo": { "bar": 21 * 2 } }
echo {
# comment
foo: {
bar: 21 * 2
}
}
# match as keys not scope dictionaries
echo { b: 42, w: 42, t: 42, g: 42, l: 42, s: 42, a: 42, v: 42 }
# Operators
# Ternary

View File

@ -11,7 +11,7 @@ g:foo = expr
t:foo = expr
w:foo = expr
v:foo = expr
v:true = expr
$FOO = expr
@ -58,6 +58,9 @@ foo[:2] = expr
foo[1:] = expr
foo[:] = expr
foo["key"] = expr
foo['key'] = expr
foo += expr
foo -= expr
foo *= expr
@ -106,36 +109,36 @@ $FOO ..= expr
@f = expr
@f ..= expr
&foo = expr
&ari = expr
&t_k1 = "\<Esc>[234;"
&foo ..= expr
&ari ..= expr
&foo += expr
&foo -= expr
&ari += expr
&ari -= expr
&l:foo = expr
&l:aleph = expr
&l:foo ..= expr
&l:foo += expr
&l:foo -= expr
&l:aleph ..= expr
&l:aleph += expr
&l:aleph -= expr
&g:foo = expr
&g:aleph = expr
&g:foo ..= expr
&g:foo += expr
&g:foo -= expr
&g:aleph ..= expr
&g:aleph += expr
&g:aleph -= expr
[foo, bar] = expr
[foo,
\ bar] = expr
[v:foo, v:bar] = expr
[v:foo,
\ v:bar] = expr
[&foo, &bar] = expr
[&foo,
\ &bar] = expr
[v:true, v:false] = expr
[v:true,
\ v:false] = expr
[&ari, &bkc] = expr
[&ari,
\ &bkc] = expr
[$foo, $bar] = expr
[$foo,
\ $bar] = expr
@ -154,18 +157,18 @@ $FOO ..= expr
[foo,
\ bar;
\ baz] = expr
[v:foo, v:bar; v:baz] = expr
[v:foo,
\ v:bar;
\ v:baz] = expr
[v:true, v:false; v:none] = expr
[v:true,
\ v:false;
\ v:none] = expr
[$foo, $bar; $baz] = expr
[$foo,
\ $bar;
\ $baz] = expr
[&foo, &bar; &baz] = expr
[&foo,
\ &bar;
\ &baz] = expr
[&ari, &bkc; &cmp] = expr
[&ari,
\ &bkc;
\ &cmp] = expr
[@a, @b; @c] = expr
[@a,
\ @b;
@ -195,3 +198,25 @@ endfor
for [foo, bar] in expr
endfor
# Scope dictionaries
echo get(b:, 'foo', 42)
echo get(w:, 'foo', 42)
echo get(t:, 'foo', 42)
echo get(g:, 'foo', 42)
echo get(v:, 'foo', 42)
for k in keys(b:) | echo b:[k] | endfor
for k in keys(w:) | echo w:[k] | endfor
for k in keys(t:) | echo t:[k] | endfor
for k in keys(g:) | echo g:[k] | endfor
for k in keys(v:) | echo v:[k] | endfor
# Neovim-specific variables (not highlighted by default)
echo v:lua v:msgpack_types v:relnum v:stderr v:termrequest v:virtnum
echo &channel &inccommand &mousescroll &pumblend &redrawdebug &scrollback
echo &shada &shadafile &statuscolumn &termpastefilter &termsync &winbar
echo &winblend &winhighlight

View File

@ -163,6 +163,20 @@ function Foo(
return 42
endfunction
" arguments
function Foo(a, b, c)
echo a:a a:b a:c
endfunction
function Foo(...)
echo a:000
echo a:0
echo a:1 a:2 a:3 a:4 a:5 a:6 a:7 a:8 a:9 a:10 a:11 a:12 a:13 a:14 a:15 a:16 a:17 a:18 a:19 a:20
endfunction
" Issue #16243 (vimscript def parameters syntax highlight is wrong)
function Test(lines = [line('.'), line('.')])

View File

@ -166,6 +166,19 @@ function Foo(
endfunction
" arguments
function Foo(a, b, c)
echo a:a a:b a:c
endfunction
function Foo(...)
echo a:000
echo a:0
echo a:1 a:2 a:3 a:4 a:5 a:6 a:7 a:8 a:9 a:10 a:11 a:12 a:13 a:14 a:15 a:16 a:17 a:18 a:19 a:20
endfunction
" comments
function Foo()

View File

@ -100,6 +100,79 @@ 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']
" Dictionary
echo {}
echo { 'foo': 21 * 2 }
echo { "foo": 21 * 2 }
echo { 42: 21 * 2 }
echo { "foo": { 'bar': 21 * 2 } }
echo { "foo": { "bar": 21 * 2 } }
echo { "foo": { 42: 21 * 2 } }
echo { "foo": #{ bar: 21 * 2 } }
echo { "foo": #{ -bar-: 21 * 2 } }
echo { "foo": #{ 42: 21 * 2 } }
echo { 'foo': { 'bar': 21 * 2 } }
echo { 'foo': { "bar": 21 * 2 } }
echo { 'foo': { 42: 21 * 2 } }
echo { 'foo': #{ bar: 21 * 2 } }
echo { 'foo': #{ -bar-: 21 * 2 } }
echo { 'foo': #{ 42: 21 * 2 } }
echo { 42: { 'bar': 21 * 2 } }
echo { 42: { "bar": 21 * 2 } }
echo { 42: { 42: 21 * 2 } }
echo { 42: #{ bar: 21 * 2 } }
echo { 42: #{ -bar-: 21 * 2 } }
echo { 42: #{ 42: 21 * 2 } }
echo {
"\ comment
\ "foo": { "bar": 21 * 2 }
\}
" TODO: arbitrary expression keys
" Literal Dictionary
echo #{}
echo #{ foo: 21 * 2 }
echo #{ -foo-: 21 * 2 }
echo #{ 42: 21 * 2 }
echo #{ foo: #{ bar: 21 * 2 } }
echo #{ foo: #{ -bar-: 21 * 2 } }
echo #{ foo: #{ 42: 21 * 2 } }
echo #{ foo: { "bar": 21 * 2 } }
echo #{ foo: { 'bar': 21 * 2 } }
echo #{ foo: { 42: 21 * 2 } }
echo #{ -foo-: #{ bar: 21 * 2 } }
echo #{ -foo-: #{ -bar-: 21 * 2 } }
echo #{ -foo-: #{ 42: 21 * 2 } }
echo #{ -foo-: { "bar": 21 * 2 } }
echo #{ -foo-: { 'bar': 21 * 2 } }
echo #{ -foo-: { 42: 21 * 2 } }
echo #{ 42: #{ bar: 21 * 2 } }
echo #{ 42: #{ -bar-: 21 * 2 } }
echo #{ 42: #{ 42: 21 * 2 } }
echo #{ 42: { "bar": 21 * 2 } }
echo #{ 42: { 'bar': 21 * 2 } }
echo #{ 42: { 42: 21 * 2 } }
echo #{
"\ comment
\ foo: #{
\ bar: 21 * 2
\ }
\}
" match as keys not scope dictionaries
echo #{ b: 42, w: 42, t: 42, g: 42, l: 42, s: 42, a: 42, v: 42 }
" Register
echo @"

View File

@ -32,8 +32,8 @@ function Foo()
let b:foo[1:] = expr
let b:foo[:] = expr
let bfoo["key"] = expr
let bfoo['key'] = expr
let b:foo["key"] = expr
let b:foo['key'] = expr
let b:foo += expr
let b:foo -= expr
@ -103,25 +103,25 @@ function Foo()
let t:foo .= expr
let t:foo ..= expr
let v:foo = expr
let v:true = expr
let v:foo[0] = expr
let v:true[0] = expr
let v:foo[1:2] = expr
let v:foo[:2] = expr
let v:foo[1:] = expr
let v:foo[:] = expr
let v:true[1:2] = expr
let v:true[:2] = expr
let v:true[1:] = expr
let v:true[:] = expr
let v:foo["key"] = expr
let v:foo['key'] = expr
let v:true["key"] = expr
let v:true['key'] = expr
let v:foo += expr
let v:foo -= expr
let v:foo *= expr
let v:foo /= expr
let v:foo %= expr
let v:foo .= expr
let v:foo ..= expr
let v:true += expr
let v:true -= expr
let v:true *= expr
let v:true /= expr
let v:true %= expr
let v:true .= expr
let v:true ..= expr
let w:foo = expr
@ -151,38 +151,38 @@ function Foo()
let @f .= expr
let @f ..= expr
let &foo = expr
let &ari = expr
let &t_k1 = "\<Esc>[234;"
let &foo .= expr
let &foo ..= expr
let &foo += expr
let &foo -= expr
let &ari .= expr
let &ari ..= expr
let &ari += expr
let &ari -= expr
let &l:foo = expr
let &l:aleph = expr
let &l:foo .= expr
let &l:foo ..= expr
let &l:foo += expr
let &l:foo -= expr
let &l:aleph .= expr
let &l:aleph ..= expr
let &l:aleph += expr
let &l:aleph -= expr
let &g:foo = expr
let &g:aleph = expr
let &g:foo .= expr
let &g:foo ..= expr
let &g:foo += expr
let &g:foo -= expr
let &g:aleph .= expr
let &g:aleph ..= expr
let &g:aleph += expr
let &g:aleph -= expr
let [foo, bar] = expr
let [foo,
\ bar] = expr
let [v:foo, v:bar] = expr
let [v:foo,
\ v:bar] = expr
let [&foo, &bar] = expr
let [&foo,
\ &bar] = expr
let [v:true, v:false] = expr
let [v:true,
\ v:false] = expr
let [&ari, &bkc] = expr
let [&ari,
\ &bkc] = expr
let [$foo, $bar] = expr
let [$foo,
\ $bar] = expr
@ -199,18 +199,18 @@ function Foo()
let [foo,
\ bar;
\ baz] = expr
let [v:foo, v:bar; v:baz] = expr
let [v:foo,
\ v:bar;
\ v:baz] = expr
let [v:true, v:false; v:none] = expr
let [v:true,
\ v:false;
\ v:none] = expr
let [$foo, $bar; $baz] = expr
let [$foo,
\ $bar;
\ $baz] = expr
let [&foo, &bar; &baz] = expr
let [&foo,
\ &bar;
\ &baz] = expr
let [&ari, &bkc; &cmp] = expr
let [&ari,
\ &bkc;
\ &cmp] = expr
let [@a, @b; @c] = expr
let [@a,
\ @b;
@ -380,5 +380,34 @@ END
unlockvar 2 foo | echo "Foo"
unlockvar 2 foo bar " comment
unlockvar 2 foo bar | echo "Foo"
" Scope dictionaries
echo get(b:, 'foo', 42)
echo get(w:, 'foo', 42)
echo get(t:, 'foo', 42)
echo get(g:, 'foo', 42)
echo get(l:, 'foo', 42)
echo get(s:, 'foo', 42)
echo get(a:, 'foo', 42)
echo get(v:, 'foo', 42)
for k in keys(b:) | echo b:[k] | endfor
for k in keys(w:) | echo w:[k] | endfor
for k in keys(t:) | echo t:[k] | endfor
for k in keys(g:) | echo g:[k] | endfor
for k in keys(l:) | echo l:[k] | endfor
for k in keys(s:) | echo s:[k] | endfor
for k in keys(a:) | echo a:[k] | endfor
for k in keys(v:) | echo v:[k] | endfor
" Neovim-specific variables (not highlighted by default)
echo v:lua v:msgpack_types v:relnum v:stderr v:termrequest v:virtnum
echo &channel &inccommand &mousescroll &pumblend &redrawdebug &scrollback
echo &shada &shadafile &statuscolumn &termpastefilter &termsync &winbar
echo &winblend &winhighlight
endfunction

View File

@ -0,0 +1,9 @@
" Neovim variable highlighting
" VIM_TEST_SETUP let g:vimsyn_vim_features = ["nvim"]
echo v:lua v:msgpack_types v:relnum v:stderr v:termrequest v:virtnum
echo &channel &inccommand &mousescroll &pumblend &redrawdebug &scrollback
echo &shada &shadafile &statuscolumn &termpastefilter &termsync &winbar
echo &winblend &winhighlight

View File

@ -31,8 +31,8 @@ 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["key"] = expr
let b:foo['key'] = expr
let b:foo += expr
let b:foo -= expr
@ -102,25 +102,25 @@ let t:foo %= expr
let t:foo .= expr
let t:foo ..= expr
let v:foo = expr
let v:true = expr
let v:foo[0] = expr
let v:true[0] = expr
let v:foo[1:2] = expr
let v:foo[:2] = expr
let v:foo[1:] = expr
let v:foo[:] = expr
let v:true[1:2] = expr
let v:true[:2] = expr
let v:true[1:] = expr
let v:true[:] = expr
let v:foo["key"] = expr
let v:foo['key'] = expr
let v:true["key"] = expr
let v:true['key'] = expr
let v:foo += expr
let v:foo -= expr
let v:foo *= expr
let v:foo /= expr
let v:foo %= expr
let v:foo .= expr
let v:foo ..= expr
let v:true += expr
let v:true -= expr
let v:true *= expr
let v:true /= expr
let v:true %= expr
let v:true .= expr
let v:true ..= expr
let w:foo = expr
@ -150,38 +150,38 @@ let @f = expr
let @f .= expr
let @f ..= expr
let &foo = expr
let &ari = expr
let &t_k1 = "\<Esc>[234;"
let &foo .= expr
let &foo ..= expr
let &foo += expr
let &foo -= expr
let &ari .= expr
let &ari ..= expr
let &ari += expr
let &ari -= expr
let &l:foo = expr
let &l:aleph = expr
let &l:foo .= expr
let &l:foo ..= expr
let &l:foo += expr
let &l:foo -= expr
let &l:aleph .= expr
let &l:aleph ..= expr
let &l:aleph += expr
let &l:aleph -= expr
let &g:foo = expr
let &g:aleph = expr
let &g:foo .= expr
let &g:foo ..= expr
let &g:foo += expr
let &g:foo -= expr
let &g:aleph .= expr
let &g:aleph ..= expr
let &g:aleph += expr
let &g:aleph -= expr
let [foo, bar] = expr
let [foo,
\ bar] = expr
let [v:foo, v:bar] = expr
let [v:foo,
\ v:bar] = expr
let [&foo, &bar] = expr
let [&foo,
\ &bar] = expr
let [v:true, v:false] = expr
let [v:true,
\ v:false] = expr
let [&ari, &bkc] = expr
let [&ari,
\ &bkc] = expr
let [$foo, $bar] = expr
let [$foo,
\ $bar] = expr
@ -198,18 +198,18 @@ let [foo, bar; baz] = expr
let [foo,
\ bar;
\ baz] = expr
let [v:foo, v:bar; v:baz] = expr
let [v:foo,
\ v:bar;
\ v:baz] = expr
let [v:true, v:false; v:none] = expr
let [v:true,
\ v:false;
\ v:none] = expr
let [$foo, $bar; $baz] = expr
let [$foo,
\ $bar;
\ $baz] = expr
let [&foo, &bar; &baz] = expr
let [&foo,
\ &bar;
\ &baz] = expr
let [&ari, &bkc; &cmp] = expr
let [&ari,
\ &bkc;
\ &cmp] = expr
let [@a, @b; @c] = expr
let [@a,
\ @b;
@ -380,3 +380,31 @@ unlockvar 2 foo | echo "Foo"
unlockvar 2 foo bar " comment
unlockvar 2 foo bar | echo "Foo"
" Scope dictionaries
echo get(b:, 'foo', 42)
echo get(w:, 'foo', 42)
echo get(t:, 'foo', 42)
echo get(g:, 'foo', 42)
echo get(l:, 'foo', 42)
echo get(s:, 'foo', 42)
echo get(a:, 'foo', 42)
echo get(v:, 'foo', 42)
for k in keys(b:) | echo b:[k] | endfor
for k in keys(w:) | echo w:[k] | endfor
for k in keys(t:) | echo t:[k] | endfor
for k in keys(g:) | echo g:[k] | endfor
for k in keys(l:) | echo l:[k] | endfor
for k in keys(s:) | echo s:[k] | endfor
for k in keys(a:) | echo a:[k] | endfor
for k in keys(v:) | echo v:[k] | endfor
" Neovim-specific variables (not highlighted by default)
echo v:lua v:msgpack_types v:relnum v:stderr v:termrequest v:virtnum
echo &channel &inccommand &mousescroll &pumblend &redrawdebug &scrollback
echo &shada &shadafile &statuscolumn &termpastefilter &termsync &winbar
echo &winblend &winhighlight