vim9script
# Vim9 variable highlighting


# Declarations

var foo = expr
 
b:foo = expr
g:foo = expr
t:foo = expr
w:foo = expr

v:true = 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

# Typed declarations

var foo: tuple<any> = expr
var foo: tuple<number> = expr
var foo: tuple<number, string, bool> = expr
var foo: tuple<...list<any>> = expr
var foo: tuple<...list<number>> = expr
var foo: tuple<number, ...list<string>> = expr

var foo: tuple<
      #\ comment
      \number, 
      #\ comment
      \string, 
      #\ comment
      \bool
      \>

# Assignments

foo = expr

foo[0] = expr

foo[1:2] = expr
foo[:2] = expr
foo[1:] = expr
foo[:] = expr

foo["key"] = expr
foo['key'] = 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
 
&ari = expr
 
&t_k1 = "\<Esc>[234;"

&ari ..= expr

&ari += expr
&ari -= expr

&l:aleph = expr

&l:aleph ..= expr
&l:aleph += expr
&l:aleph -= expr

&g:aleph = expr

&g:aleph ..= expr
&g:aleph += expr
&g:aleph -= 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
[@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:true, v:false; v:none] = expr
[v:true,
      \ v:false;
      \ v:none] = expr
[$foo, $bar; $baz] = expr
[$foo,
      \ $bar;
      \ $baz] = expr
[&ari, &bkc; &cmp] = expr
[&ari,
      \ &bkc;
      \ &cmp] = 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

# 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

