runtime(vim): Split Vim legacy and Vim9 script indent tests

The indent test file is not highlighted correctly as it's currently a
syntactically erroneous mix of legacy and Vim9 script.  This is causing
spurious indent test failures as the indent script relies on syntax ID
tests to determine the context of lines being processed.

Splitting the tests into legacy and Vim9 specific files allows for
correct syntax highlighting and indenting.

closes: #16431

Signed-off-by: Doug Kearns <dougkearns@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/runtime/indent/testdir/vim.in b/runtime/indent/testdir/vim.in
index 431528e..6b894b5 100644
--- a/runtime/indent/testdir/vim.in
+++ b/runtime/indent/testdir/vim.in
@@ -114,284 +114,12 @@
 " END_INDENT
 
 " START_INDENT
-var result = Func(
-arg1,
-arg2
-)
-" END_INDENT
-
-" START_INDENT
-var result = Func(arg1,
-arg2)
-" END_INDENT
-
-" START_INDENT
-filter(list, (k, v) =>
-v > 0)
-" END_INDENT
-
-" START_INDENT
-filter(list, (k, v) => {
-const x = get(list, k, 0)
-return x > 0
-})
-" END_INDENT
-
-" START_INDENT
-if x > 0
-filter(list, (k, v) => {
-const x = get(list, k, 1)
-return x > 0
-})
-endif
-" END_INDENT
-
-" START_INDENT
-{
-var temp = 'temp'
-}
-" END_INDENT
-
-" START_INDENT
-var text = lead
-.. middle
-.. end
-" END_INDENT
-
-" START_INDENT
-var text = lead ..
-middle ..
-end
-" END_INDENT
-
-" START_INDENT
-var total = start +
-end -
-correction
-" END_INDENT
-
-" START_INDENT
-var result = start
-:+ print
-" END_INDENT
-
-" START_INDENT
-var result = positive
-? PosFunc(arg)
-: NegFunc(arg)
-" END_INDENT
-
-" START_INDENT
-var result = GetBuilder()
-->BuilderSetWidth(333)
-->BuilderSetHeight(777)
-->BuilderBuild()
-" END_INDENT
-
-" START_INDENT
-var result = MyDict
-.member
-" END_INDENT
-
-" START_INDENT
-autocmd BufNewFile *.match if condition
-|   echo 'match'
-| endif
-" END_INDENT
-
-" START_INDENT
-set cpo+=C
-var lines =<< trim END
-| this works
-END
-set cpo-=C
-" END_INDENT
-
-" START_INDENT
-syn region Text
-\ start='foo'
-#\ comment
-\ end='bar'
-" END_INDENT
-
-" START_INDENT
-au CursorHold * echom 'BEFORE bar'
-#\ some comment
-| echom 'AFTER bar'
-" END_INDENT
-
-" START_INDENT
-def MyFunc(text: string,
-separator = '-'
-): string
-enddef
-" END_INDENT
-
-" START_INDENT
-def MyFunc(
-text: string,
-separator = '-'
-): string
-enddef
-" END_INDENT
-
-" START_INDENT
-[var1, var2] =
-Func()
-" END_INDENT
-
-" START_INDENT
-const list = ['one',
-'two']
-" END_INDENT
-
-" START_INDENT
-const list = [
-'one',
-'two',
-]
-" END_INDENT
-
-" START_INDENT
-const dict = {one: 1,
-two: 2
-}
-" END_INDENT
-
-" START_INDENT
-const dict = {
-one: 1,
-two: 2
-}
-" END_INDENT
-
-" START_INDENT
-if true
-const dict =
-{
-one: 1,
-two: 2
-}
-endif
-" END_INDENT
-
-" START_INDENT
-def Func()
-return {
-one: 1
-}
-enddef
-" END_INDENT
-
-" START_INDENT
-echo {
-a: 0,
-# b
-# c
-}
-" END_INDENT
-
-" START_INDENT
-echo search(
-# comment
-'1'
-.. '2'
-)
-" END_INDENT
-
-" START_INDENT
-if true
-var v = (      # trailing "(" starts line continuation
-3 + 4      # nothing special
-)              # end of expression indicates continued line
-var x: number  # needs to align with previous "var"
-endif
-" END_INDENT
-
-" START_INDENT
-def Func() # {{{
-# comment
-if true
-return
-endif
-enddef
-" END_INDENT
-
-" START_INDENT
-echo {
-key:
-'value',
-}
-" END_INDENT
-
-" START_INDENT
-var id = time
-->timer_start((_) => {
-n = 0
-})
-" END_INDENT
-
-" START_INDENT
 augroup Name
 autocmd!
 augroup END
 " END_INDENT
 
 " START_INDENT
-var n =
-# comment
-1
-+ 2
-
-var s = ''
-" END_INDENT
-
-" START_INDENT
-var keys = {
-J: 'j',
-"\<Home>": '1G',
-"\<End>": 'G',
-z: 'zz'
-}
-" END_INDENT
-
-" START_INDENT
-export def Func(
-n: number,
-s: string,
-...l: list<bool>
-)
-enddef
-" END_INDENT
-
-" START_INDENT
-var heredoc =<< trim ENDD
-var nested_heredoc =<< trim END
-END
-ENDD
-" END_INDENT
-
-" START_INDENT
-if true
-else  " comment
-endif
-" END_INDENT
-
-" START_INDENT
-if true | echo 'one' | endif
-if true | echo 'two' | endif
-if true | echo 'three' | endif
-" END_INDENT
-
-" START_INDENT
-if true
-:'<-1 mark <
-else
-echo ''
-endif
-" END_INDENT
-
-" START_INDENT
 substitute/pat /rep /
 echo
 " END_INDENT
@@ -405,92 +133,12 @@
 " END_INDENT
 
 " START_INDENT
-def Func()
-Cmd %
-enddef
-" END_INDENT
-
-" START_INDENT
 if end == 'xxx' || end == 'yyy'
 echo
 endif
 " END_INDENT
 
 " START_INDENT
-if true
-popup_move(id, {col: 1,
-line: 2})
-endif
-setwinvar(id, 'name', 3)
-" END_INDENT
-
-" START_INDENT
-var d = [
-{a: 'x',
-b: 'y'},
-FuncA(),
-FuncB(),
-]
-" END_INDENT
-
-" START_INDENT
-var ll = [[
-1,
-2,
-3], [
-4,
-5,
-6], [
-7,
-8,
-9]]
-" END_INDENT
-
-" START_INDENT
-var ld = [{
-a: 'xxx',
-b: 'yyy'}, {
-c: 'xxx',
-d: 'yyy'}, {
-e: 'xxx',
-f: 'yyy'}, {
-}]
-" END_INDENT
-
-" START_INDENT
-var d = {
-a: {
-b: {
-c: [{
-d: 'e',
-f: 'g',
-h: 'i'
-}],
-j: 'k',
-},
-},
-}
-" END_INDENT
-
-" START_INDENT
-if true
-var end: any
-if true
-end = 0
-elseif true
-echo
-endif
-endif
-" END_INDENT
-
-" START_INDENT
-if true
-var d = {
-end: 0}
-endif
-" END_INDENT
-
-" START_INDENT
 nunmap <buffer> (
 nunmap <buffer> )
 inoremap [ {
@@ -500,224 +148,6 @@
 " END_INDENT
 
 " START_INDENT
-def Func(
-s: string,
-n = 1,
-m = 2
-)
-enddef
-" END_INDENT
-
-" START_INDENT
-var h =<< END
-text
-END
-
-def Func()
-echo
-enddef
-" END_INDENT
-
-" START_INDENT
-def Func()
-var h =<< END
-text
-END
-echo 'test'
-enddef
-" END_INDENT
-
-" START_INDENT
-def Foo()
-lcd -
-enddef
-def Bar()
-echo
-enddef
-" END_INDENT
-
-" START_INDENT
-if true
-n = Func(1, 2,
-3)
-endif
-" END_INDENT
-
-" START_INDENT
-def Func(s: string,
-n: number): bool
-if true
-return false
-endif
-enddef
-" END_INDENT
-
-" START_INDENT
-def Func(
-n: number)
-#
-echo
-enddef
-" END_INDENT
-
-" START_INDENT
-" INDENT_AT  this-line
-def Func(
-	n: number)
-    #
-echo  # this-line
-enddef
-" END_INDENT
-
-" START_INDENT
-if true
-if true
-normal! ==
-endif
-endif
-" END_INDENT
-
-" START_INDENT
-var d = {
-a: () => true,
-b: () => true
-&& true
-&& Foo(),
-c: () => Bar(),
-e: () => Baz(),
-}
-" END_INDENT
-
-" START_INDENT
-def Select(Cont: func(func(any)), Pred: func(any): bool): func(func(any))
-return (Emit: func(any)) => {
-Cont((t: any) => {
-if Pred(t)
-Emit(t)
-endif
-})
-}
-enddef
-" END_INDENT
-
-" START_INDENT
-" INDENT_EXE let g:vim_indent = {'more_in_bracket_block': v:true}
-def Select(Cont: func(func(any)), Pred: func(any): bool): func(func(any))
-return (Emit: func(any)) => {
-Cont((t: any) => {
-if Pred(t)
-Emit(t)
-endif
-})
-}
-enddef
-" END_INDENT
-
-" START_INDENT
-" INDENT_EXE unlet! g:vim_indent
-" END_INDENT
-
-" START_INDENT
-g:lightline = {
-'active': {
-'left': [ [ 'mode', 'paste' ], [ 'readonly', 'relativepath', 'modified' ] ],
-},
-'inactive': {
-'left': [ [ 'readonly', 'relativepath', 'modified' ] ],
-}
-}
-" END_INDENT
-
-" START_INDENT
-if getline(1, 10)
-->map((_, v: string): number => strcharlen(v))
-->max() > 1'000
-&l:breakindent = false
-&l:linebreak = false
-else
-&l:breakindent = true
-&l:linebreak = true
-endif
-" END_INDENT
-
-" START_INDENT
-var ext2cmd: dict<string> = {
-doc: $'antiword {fname}',
-docx: $'pandoc --from=docx --to=markdown {fname}',
-epub: $'pandoc --from=epub --to=markdown {fname}',
-odp: $'odt2txt {fname}',
-odt: $'odt2txt {fname}',
-pdf: $'pdftotext -nopgbrk -layout -q -eol unix {fname} -',
-rtf: 'unrtf --text',
-}
-" END_INDENT
-
-" START_INDENT
-const ptybuf: number = term_start(&shell, {
-hidden: true,
-exit_cb: (_, _) => {
-if true
-close
-else
-help
-endif
-}
-})
-" END_INDENT
-
-" START_INDENT
-var d = {
-a: 0,
-# a ' quote {{{
-#}}}
-b: 0,
-}
-" END_INDENT
-
-" START_INDENT
-echo printf('%s () %s',
-1,
-2
-)
-" END_INDENT
-
-" START_INDENT
-prop_add(1, col('.'), {
-length: 2,
-type: 'test'
-})
-" END_INDENT
-
-" START_INDENT
-echo (() => " string starting with space")()
-echo
-" END_INDENT
-
-" START_INDENT
-var variables = deepcopy(g:)
-->filter((k: string, _): bool =>
-k =~ '\c\V' .. keyword->escape('\')
-&& k !~ '\%(loaded\|did_plugin_\)')
-->items()
-->map((_, v): string => v[0] .. ' = ' .. string(v[1]))
-new
-" END_INDENT
-
-" START_INDENT
-var d = freq
-->map((_, v) =>
-v * (
-1
-+ 2
-))
-for item in d
-->items()
-->sort((a, b) => b[1] - a[1])
-echo
-endfor
-" END_INDENT
-
-" START_INDENT
 make_job = job_start([&shell, &shellcmdflag, make_cmd], {
 callback: function(MakeProcessOutput, [qfid]),
 close_cb: function(MakeCloseCb, [qfid]),
@@ -727,109 +157,16 @@
 " END_INDENT
 
 " START_INDENT
-var matching_abbrev: list<dict<string>> = copy(ABBREV)
-->filter((_, v: dict<string>): bool =>
-stridx(v.lhs, word_to_complete) == 0)
-->map((_, v: dict<string>) => ({
-word: v.lhs,
-menu: AbbrevRhs(v.rhs)->stridx('expand_') >= 0
-?    AbbrevRhs(v.rhs)->matchstr('.*,\s*''\zs.*\ze'')')
-:    AbbrevRhs(v.rhs)
-}))
-" END_INDENT
-
-" START_INDENT
-def Func()
-if true
-vimgrep /^\C\s*\%(fu\%[nction]\|def\)\s\+/ file
-endif
-enddef
-" END_INDENT
-
-" START_INDENT
 setlocal iskeyword+=[
 cword = expand('<cword>')
 " END_INDENT
 
 " START_INDENT
-silent if true
-echo
-endif
-" END_INDENT
-
-" START_INDENT
-def Func()
-sort :^.*[\/]:
-enddef
-" END_INDENT
-
-" START_INDENT
-def Func()
-d = {
-}
-hd =<< trim END
-['
-]'
-END
-enddef
-" END_INDENT
-
-" START_INDENT
-def Func()
-if true
-var hd =<< trim END
-if get(b:, 'current_syntax', '')
-endif
-END
-elseif true
-echo
-endif
-enddef
-" END_INDENT
-
-" START_INDENT
-# test for control-flow keyword followed by commented fold marker {{{
-if true
-echo
-endif #}}}
-" END_INDENT
-
-" START_INDENT
 if winsz == 0|let winsz= ""|endif
 exe "noswapfile ".winsz."wincmd s"
 " END_INDENT
 
 " START_INDENT
-if true
-if true
-windo if true | echo | endif
-augroup Name
-autocmd WinLeave * if true | eval 1 + 2 | endif
-augroup END
-endif
-endif
-" END_INDENT
-
-" START_INDENT
-if true
-echo ' =<< trim END'
-->len()
-endif
-" END_INDENT
-
-" START_INDENT
-function Func()
-if true
-if true
-if true | echo com | endif
-if true | echo com | endif
-endif
-else
-endif
-endfunction
-" END_INDENT
-
-" START_INDENT
 function Func()
 if v:true
 +
@@ -840,128 +177,11 @@
 " END_INDENT
 
 " START_INDENT
-var matchpairs: string = &matchpairs
-var pairs: dict<list<string>>
-for [opening: string, closing: string]
-in matchpairs
-->split(',')
-->map((_, v: string): list<string> => split(v, ':'))
-pairs[opening] = [escape(opening, '[]'), escape(closing, '[]'),  'nW', 'w$']
-pairs[closing] = [escape(opening, '[]'), escape(closing, '[]'), 'bnW', 'w0']
-endfor
-" END_INDENT
-
-" START_INDENT
-{
-echo []
-+ []
-+ [{a: 1,
-b: 2}]
-}
-" END_INDENT
-
-" START_INDENT
 silent! argdel *
 edit file
 " END_INDENT
 
 " START_INDENT
-def Foo()
-Bar(1,
-[]->filter((_, v) => {
-return true
-}),
-() => {
-echo
-})
-enddef
-" END_INDENT
-
-" START_INDENT
-echo {
-k: () => {
-if true
-echo
-popup_setoptions(id,
-{title: 'title'})
-endif
-}
-}
-" END_INDENT
-
-" START_INDENT
-if true
-elseif
-endif
-" END_INDENT
-
-" START_INDENT
-if (
-true)
-&& true
-echo
-endif
-" END_INDENT
-
-" START_INDENT
-abstract class Shape
-var color = Color.Black
-var thickness = 10
-endclass
-" END_INDENT
-
-" START_INDENT
-class OtherThing
-var size: number
-static var totalSize: number
-
-static def ClearTotalSize(): number
-var prev = totalSize
-totalSize = 0
-return prev
-enddef
-endclass
-" END_INDENT
-
-" START_INDENT
-interface HasSurface
-var size: number
-def Surface(): number
-endinterface
-" END_INDENT
-
-" START_INDENT
-interface EnterExit
-def Enter(): void
-def Exit(): void
-endinterface
-" END_INDENT
-
-" START_INDENT
-enum Color
-White,
-Red,
-Green,
-Blue,
-Black
-endenum
-" END_INDENT
-
-" START_INDENT
-enum Digits
-INVALID(v:numbermax),  # The null value.
-ZERO(0 * v:numbermin), ONE(2 - 1),
-TWO(1 + 1), THREE(9 / 3), FOUR(1 * 4),
-FIVE(1 + 2 + 2), SIX(36 / 3 / 2), SEVEN(7), EIGHT(2 * 2 * 2),
-NINE(3 + 3 + 3)
-const value: number
-def new(value: number)
-this.value = value
-enddef
-endenum
-" END_INDENT
-
-" START_INDENT
 call prop_type_add('indent_after_literal_dict', #{ foo: 'bar' })
 call prop_type_delete('indent_after_literal_dict')
 " END_INDENT
diff --git a/runtime/indent/testdir/vim.ok b/runtime/indent/testdir/vim.ok
index 03001d5..2987829 100644
--- a/runtime/indent/testdir/vim.ok
+++ b/runtime/indent/testdir/vim.ok
@@ -114,284 +114,12 @@
 " END_INDENT
 
 " START_INDENT
-var result = Func(
-    arg1,
-    arg2
-)
-" END_INDENT
-
-" START_INDENT
-var result = Func(arg1,
-    arg2)
-" END_INDENT
-
-" START_INDENT
-filter(list, (k, v) =>
-    v > 0)
-" END_INDENT
-
-" START_INDENT
-filter(list, (k, v) => {
-    const x = get(list, k, 0)
-    return x > 0
-})
-" END_INDENT
-
-" START_INDENT
-if x > 0
-    filter(list, (k, v) => {
-	const x = get(list, k, 1)
-	return x > 0
-    })
-endif
-" END_INDENT
-
-" START_INDENT
-{
-    var temp = 'temp'
-}
-" END_INDENT
-
-" START_INDENT
-var text = lead
-    .. middle
-    .. end
-" END_INDENT
-
-" START_INDENT
-var text = lead ..
-    middle ..
-    end
-" END_INDENT
-
-" START_INDENT
-var total = start +
-    end -
-    correction
-" END_INDENT
-
-" START_INDENT
-var result = start
-:+ print
-" END_INDENT
-
-" START_INDENT
-var result = positive
-    ? PosFunc(arg)
-    : NegFunc(arg)
-" END_INDENT
-
-" START_INDENT
-var result = GetBuilder()
-    ->BuilderSetWidth(333)
-    ->BuilderSetHeight(777)
-    ->BuilderBuild()
-" END_INDENT
-
-" START_INDENT
-var result = MyDict
-    .member
-" END_INDENT
-
-" START_INDENT
-autocmd BufNewFile *.match if condition
-    |   echo 'match'
-    | endif
-" END_INDENT
-
-" START_INDENT
-set cpo+=C
-var lines =<< trim END
-    | this works
-END
-set cpo-=C
-" END_INDENT
-
-" START_INDENT
-syn region Text
-	    \ start='foo'
-	    #\ comment
-	    \ end='bar'
-" END_INDENT
-
-" START_INDENT
-au CursorHold * echom 'BEFORE bar'
-    #\ some comment
-    | echom 'AFTER bar'
-" END_INDENT
-
-" START_INDENT
-def MyFunc(text: string,
-	separator = '-'
-	): string
-enddef
-" END_INDENT
-
-" START_INDENT
-def MyFunc(
-	text: string,
-	separator = '-'
-	): string
-enddef
-" END_INDENT
-
-" START_INDENT
-[var1, var2] =
-    Func()
-" END_INDENT
-
-" START_INDENT
-const list = ['one',
-    'two']
-" END_INDENT
-
-" START_INDENT
-const list = [
-    'one',
-    'two',
-]
-" END_INDENT
-
-" START_INDENT
-const dict = {one: 1,
-    two: 2
-}
-" END_INDENT
-
-" START_INDENT
-const dict = {
-    one: 1,
-    two: 2
-}
-" END_INDENT
-
-" START_INDENT
-if true
-    const dict =
-	{
-	    one: 1,
-	    two: 2
-	}
-endif
-" END_INDENT
-
-" START_INDENT
-def Func()
-    return {
-	one: 1
-    }
-enddef
-" END_INDENT
-
-" START_INDENT
-echo {
-    a: 0,
-    # b
-    # c
-}
-" END_INDENT
-
-" START_INDENT
-echo search(
-    # comment
-    '1'
-    .. '2'
-)
-" END_INDENT
-
-" START_INDENT
-if true
-    var v = (      # trailing "(" starts line continuation
-	3 + 4      # nothing special
-    )              # end of expression indicates continued line
-    var x: number  # needs to align with previous "var"
-endif
-" END_INDENT
-
-" START_INDENT
-def Func() # {{{
-    # comment
-    if true
-	return
-    endif
-enddef
-" END_INDENT
-
-" START_INDENT
-echo {
-    key:
-	'value',
-}
-" END_INDENT
-
-" START_INDENT
-var id = time
-    ->timer_start((_) => {
-	n = 0
-    })
-" END_INDENT
-
-" START_INDENT
 augroup Name
     autocmd!
 augroup END
 " END_INDENT
 
 " START_INDENT
-var n =
-    # comment
-    1
-    + 2
-
-var s = ''
-" END_INDENT
-
-" START_INDENT
-var keys = {
-    J: 'j',
-    "\<Home>": '1G',
-    "\<End>": 'G',
-    z: 'zz'
-}
-" END_INDENT
-
-" START_INDENT
-export def Func(
-	n: number,
-	s: string,
-	...l: list<bool>
-	)
-enddef
-" END_INDENT
-
-" START_INDENT
-var heredoc =<< trim ENDD
-    var nested_heredoc =<< trim END
-    END
-ENDD
-" END_INDENT
-
-" START_INDENT
-if true
-else  " comment
-endif
-" END_INDENT
-
-" START_INDENT
-if true | echo 'one' | endif
-if true | echo 'two' | endif
-if true | echo 'three' | endif
-" END_INDENT
-
-" START_INDENT
-if true
-    :'<-1 mark <
-else
-    echo ''
-endif
-" END_INDENT
-
-" START_INDENT
 substitute/pat /rep /
 echo
 " END_INDENT
@@ -405,92 +133,12 @@
 " END_INDENT
 
 " START_INDENT
-def Func()
-    Cmd %
-enddef
-" END_INDENT
-
-" START_INDENT
 if end == 'xxx' || end == 'yyy'
     echo
 endif
 " END_INDENT
 
 " START_INDENT
-if true
-    popup_move(id, {col: 1,
-	line: 2})
-endif
-setwinvar(id, 'name', 3)
-" END_INDENT
-
-" START_INDENT
-var d = [
-    {a: 'x',
-	b: 'y'},
-    FuncA(),
-    FuncB(),
-]
-" END_INDENT
-
-" START_INDENT
-var ll = [[
-    1,
-    2,
-    3], [
-    4,
-    5,
-    6], [
-    7,
-    8,
-    9]]
-" END_INDENT
-
-" START_INDENT
-var ld = [{
-    a: 'xxx',
-    b: 'yyy'}, {
-    c: 'xxx',
-    d: 'yyy'}, {
-    e: 'xxx',
-    f: 'yyy'}, {
-    }]
-" END_INDENT
-
-" START_INDENT
-var d = {
-    a: {
-	b: {
-	    c: [{
-		d: 'e',
-		f: 'g',
-		h: 'i'
-	    }],
-	    j: 'k',
-	},
-    },
-}
-" END_INDENT
-
-" START_INDENT
-if true
-    var end: any
-    if true
-	end = 0
-    elseif true
-	echo
-    endif
-endif
-" END_INDENT
-
-" START_INDENT
-if true
-    var d = {
-	end: 0}
-endif
-" END_INDENT
-
-" START_INDENT
 nunmap <buffer> (
 nunmap <buffer> )
 inoremap [ {
@@ -500,224 +148,6 @@
 " END_INDENT
 
 " START_INDENT
-def Func(
-	s: string,
-	n = 1,
-	m = 2
-	)
-enddef
-" END_INDENT
-
-" START_INDENT
-var h =<< END
-text
-END
-
-def Func()
-    echo
-enddef
-" END_INDENT
-
-" START_INDENT
-def Func()
-    var h =<< END
-text
-END
-    echo 'test'
-enddef
-" END_INDENT
-
-" START_INDENT
-def Foo()
-    lcd -
-enddef
-def Bar()
-    echo
-enddef
-" END_INDENT
-
-" START_INDENT
-if true
-    n = Func(1, 2,
-	3)
-endif
-" END_INDENT
-
-" START_INDENT
-def Func(s: string,
-	n: number): bool
-    if true
-	return false
-    endif
-enddef
-" END_INDENT
-
-" START_INDENT
-def Func(
-	n: number)
-    #
-    echo
-enddef
-" END_INDENT
-
-" START_INDENT
-" INDENT_AT  this-line
-def Func(
-	n: number)
-    #
-    echo  # this-line
-enddef
-" END_INDENT
-
-" START_INDENT
-if true
-    if true
-	normal! ==
-    endif
-endif
-" END_INDENT
-
-" START_INDENT
-var d = {
-    a: () => true,
-    b: () => true
-	&& true
-	&& Foo(),
-    c: () => Bar(),
-    e: () => Baz(),
-}
-" END_INDENT
-
-" START_INDENT
-def Select(Cont: func(func(any)), Pred: func(any): bool): func(func(any))
-    return (Emit: func(any)) => {
-	Cont((t: any) => {
-	    if Pred(t)
-		Emit(t)
-	    endif
-	})
-    }
-enddef
-" END_INDENT
-
-" START_INDENT
-" INDENT_EXE let g:vim_indent = {'more_in_bracket_block': v:true}
-def Select(Cont: func(func(any)), Pred: func(any): bool): func(func(any))
-    return (Emit: func(any)) => {
-	    Cont((t: any) => {
-		    if Pred(t)
-			Emit(t)
-		    endif
-		})
-	}
-enddef
-" END_INDENT
-
-" START_INDENT
-" INDENT_EXE unlet! g:vim_indent
-" END_INDENT
-
-" START_INDENT
-g:lightline = {
-    'active': {
-	'left': [ [ 'mode', 'paste' ], [ 'readonly', 'relativepath', 'modified' ] ],
-    },
-    'inactive': {
-	'left': [ [ 'readonly', 'relativepath', 'modified' ] ],
-    }
-}
-" END_INDENT
-
-" START_INDENT
-if getline(1, 10)
-	->map((_, v: string): number => strcharlen(v))
-	->max() > 1'000
-    &l:breakindent = false
-    &l:linebreak = false
-else
-    &l:breakindent = true
-    &l:linebreak = true
-endif
-" END_INDENT
-
-" START_INDENT
-var ext2cmd: dict<string> = {
-    doc: $'antiword {fname}',
-    docx: $'pandoc --from=docx --to=markdown {fname}',
-    epub: $'pandoc --from=epub --to=markdown {fname}',
-    odp: $'odt2txt {fname}',
-    odt: $'odt2txt {fname}',
-    pdf: $'pdftotext -nopgbrk -layout -q -eol unix {fname} -',
-    rtf: 'unrtf --text',
-}
-" END_INDENT
-
-" START_INDENT
-const ptybuf: number = term_start(&shell, {
-    hidden: true,
-    exit_cb: (_, _) => {
-	if true
-	    close
-	else
-	    help
-	endif
-    }
-})
-" END_INDENT
-
-" START_INDENT
-var d = {
-    a: 0,
-    # a ' quote {{{
-    #}}}
-    b: 0,
-}
-" END_INDENT
-
-" START_INDENT
-echo printf('%s () %s',
-    1,
-    2
-)
-" END_INDENT
-
-" START_INDENT
-prop_add(1, col('.'), {
-    length: 2,
-    type: 'test'
-})
-" END_INDENT
-
-" START_INDENT
-echo (() => " string starting with space")()
-echo
-" END_INDENT
-
-" START_INDENT
-var variables = deepcopy(g:)
-    ->filter((k: string, _): bool =>
-	k =~ '\c\V' .. keyword->escape('\')
-	&& k !~ '\%(loaded\|did_plugin_\)')
-    ->items()
-    ->map((_, v): string => v[0] .. ' = ' .. string(v[1]))
-new
-" END_INDENT
-
-" START_INDENT
-var d = freq
-    ->map((_, v) =>
-	v * (
-	    1
-	    + 2
-	))
-for item in d
-	->items()
-	->sort((a, b) => b[1] - a[1])
-    echo
-endfor
-" END_INDENT
-
-" START_INDENT
 make_job = job_start([&shell, &shellcmdflag, make_cmd], {
     callback: function(MakeProcessOutput, [qfid]),
     close_cb: function(MakeCloseCb, [qfid]),
@@ -727,109 +157,16 @@
 " END_INDENT
 
 " START_INDENT
-var matching_abbrev: list<dict<string>> = copy(ABBREV)
-    ->filter((_, v: dict<string>): bool =>
-	stridx(v.lhs, word_to_complete) == 0)
-    ->map((_, v: dict<string>) => ({
-	word: v.lhs,
-	menu: AbbrevRhs(v.rhs)->stridx('expand_') >= 0
-	    ?    AbbrevRhs(v.rhs)->matchstr('.*,\s*''\zs.*\ze'')')
-	    :    AbbrevRhs(v.rhs)
-    }))
-" END_INDENT
-
-" START_INDENT
-def Func()
-    if true
-	vimgrep /^\C\s*\%(fu\%[nction]\|def\)\s\+/ file
-    endif
-enddef
-" END_INDENT
-
-" START_INDENT
 setlocal iskeyword+=[
 cword = expand('<cword>')
 " END_INDENT
 
 " START_INDENT
-silent if true
-    echo
-endif
-" END_INDENT
-
-" START_INDENT
-def Func()
-    sort :^.*[\/]:
-enddef
-" END_INDENT
-
-" START_INDENT
-def Func()
-    d = {
-    }
-    hd =<< trim END
-	['
-	]'
-    END
-enddef
-" END_INDENT
-
-" START_INDENT
-def Func()
-    if true
-	var hd =<< trim END
-	    if get(b:, 'current_syntax', '')
-	    endif
-	END
-    elseif true
-	echo
-    endif
-enddef
-" END_INDENT
-
-" START_INDENT
-# test for control-flow keyword followed by commented fold marker {{{
-if true
-    echo
-endif #}}}
-" END_INDENT
-
-" START_INDENT
 if winsz == 0|let winsz= ""|endif
 exe "noswapfile ".winsz."wincmd s"
 " END_INDENT
 
 " START_INDENT
-if true
-    if true
-	windo if true | echo | endif
-	augroup Name
-	    autocmd WinLeave * if true | eval 1 + 2 | endif
-	augroup END
-    endif
-endif
-" END_INDENT
-
-" START_INDENT
-if true
-    echo ' =<< trim END'
-	->len()
-endif
-" END_INDENT
-
-" START_INDENT
-function Func()
-    if true
-	if true
-	    if true | echo com | endif
-	    if true | echo com | endif
-	endif
-    else
-    endif
-endfunction
-" END_INDENT
-
-" START_INDENT
 function Func()
     if v:true
 	+
@@ -840,128 +177,11 @@
 " END_INDENT
 
 " START_INDENT
-var matchpairs: string = &matchpairs
-var pairs: dict<list<string>>
-for [opening: string, closing: string]
-	in matchpairs
-	->split(',')
-	->map((_, v: string): list<string> => split(v, ':'))
-    pairs[opening] = [escape(opening, '[]'), escape(closing, '[]'),  'nW', 'w$']
-    pairs[closing] = [escape(opening, '[]'), escape(closing, '[]'), 'bnW', 'w0']
-endfor
-" END_INDENT
-
-" START_INDENT
-{
-    echo []
-	+ []
-	+ [{a: 1,
-	b: 2}]
-}
-" END_INDENT
-
-" START_INDENT
 silent! argdel *
 edit file
 " END_INDENT
 
 " START_INDENT
-def Foo()
-    Bar(1,
-	[]->filter((_, v) => {
-	    return true
-	}),
-	() => {
-	    echo
-	})
-enddef
-" END_INDENT
-
-" START_INDENT
-echo {
-    k: () => {
-	if true
-	    echo
-	    popup_setoptions(id,
-		{title: 'title'})
-	endif
-    }
-}
-" END_INDENT
-
-" START_INDENT
-if true
-elseif
-endif
-" END_INDENT
-
-" START_INDENT
-if (
-	true)
-	&& true
-    echo
-endif
-" END_INDENT
-
-" START_INDENT
-abstract class Shape
-    var color = Color.Black
-    var thickness = 10
-endclass
-" END_INDENT
-
-" START_INDENT
-class OtherThing
-    var size: number
-    static var totalSize: number
-
-    static def ClearTotalSize(): number
-	var prev = totalSize
-	totalSize = 0
-	return prev
-    enddef
-endclass
-" END_INDENT
-
-" START_INDENT
-interface HasSurface
-    var size: number
-    def Surface(): number
-endinterface
-" END_INDENT
-
-" START_INDENT
-interface EnterExit
-    def Enter(): void
-    def Exit(): void
-endinterface
-" END_INDENT
-
-" START_INDENT
-enum Color
-    White,
-    Red,
-    Green,
-    Blue,
-    Black
-endenum
-" END_INDENT
-
-" START_INDENT
-enum Digits
-    INVALID(v:numbermax),  # The null value.
-    ZERO(0 * v:numbermin), ONE(2 - 1),
-    TWO(1 + 1), THREE(9 / 3), FOUR(1 * 4),
-    FIVE(1 + 2 + 2), SIX(36 / 3 / 2), SEVEN(7), EIGHT(2 * 2 * 2),
-    NINE(3 + 3 + 3)
-    const value: number
-    def new(value: number)
-	this.value = value
-    enddef
-endenum
-" END_INDENT
-
-" START_INDENT
 call prop_type_add('indent_after_literal_dict', #{ foo: 'bar' })
 call prop_type_delete('indent_after_literal_dict')
 " END_INDENT
diff --git a/runtime/indent/testdir/vim9.in b/runtime/indent/testdir/vim9.in
new file mode 100644
index 0000000..a14d4e7
--- /dev/null
+++ b/runtime/indent/testdir/vim9.in
@@ -0,0 +1,782 @@
+vim9script
+# vim: set ft=vim sw=4 :
+
+# START_INDENT
+var result = Func(
+arg1,
+arg2
+)
+# END_INDENT
+
+# START_INDENT
+var result = Func(arg1,
+arg2)
+# END_INDENT
+
+# START_INDENT
+filter(list, (k, v) =>
+v > 0)
+# END_INDENT
+
+# START_INDENT
+filter(list, (k, v) => {
+const x = get(list, k, 0)
+return x > 0
+})
+# END_INDENT
+
+# START_INDENT
+if x > 0
+filter(list, (k, v) => {
+const x = get(list, k, 1)
+return x > 0
+})
+endif
+# END_INDENT
+
+# START_INDENT
+{
+var temp = 'temp'
+}
+# END_INDENT
+
+# START_INDENT
+var text = lead
+.. middle
+.. end
+# END_INDENT
+
+# START_INDENT
+var text = lead ..
+middle ..
+end
+# END_INDENT
+
+# START_INDENT
+var total = start +
+end -
+correction
+# END_INDENT
+
+# START_INDENT
+var result = start
+:+ print
+# END_INDENT
+
+# START_INDENT
+var result = positive
+? PosFunc(arg)
+: NegFunc(arg)
+# END_INDENT
+
+# START_INDENT
+var result = GetBuilder()
+->BuilderSetWidth(333)
+->BuilderSetHeight(777)
+->BuilderBuild()
+# END_INDENT
+
+# START_INDENT
+var result = MyDict
+.member
+# END_INDENT
+
+# START_INDENT
+autocmd BufNewFile *.match if condition
+|   echo 'match'
+| endif
+# END_INDENT
+
+# START_INDENT
+set cpo+=C
+var lines =<< trim END
+| this works
+END
+set cpo-=C
+# END_INDENT
+
+# START_INDENT
+syn region Text
+\ start='foo'
+#\ comment
+\ end='bar'
+# END_INDENT
+
+# START_INDENT
+au CursorHold * echom 'BEFORE bar'
+#\ some comment
+| echom 'AFTER bar'
+# END_INDENT
+
+# START_INDENT
+def MyFunc(text: string,
+separator = '-'
+): string
+enddef
+# END_INDENT
+
+# START_INDENT
+def MyFunc(
+text: string,
+separator = '-'
+): string
+enddef
+# END_INDENT
+
+# START_INDENT
+[var1, var2] =
+Func()
+# END_INDENT
+
+# START_INDENT
+const list = ['one',
+'two']
+# END_INDENT
+
+# START_INDENT
+const list = [
+'one',
+'two',
+]
+# END_INDENT
+
+# START_INDENT
+const dict = {one: 1,
+two: 2
+}
+# END_INDENT
+
+# START_INDENT
+const dict = {
+one: 1,
+two: 2
+}
+# END_INDENT
+
+# START_INDENT
+if true
+const dict =
+{
+one: 1,
+two: 2
+}
+endif
+# END_INDENT
+
+# START_INDENT
+def Func()
+return {
+one: 1
+}
+enddef
+# END_INDENT
+
+# START_INDENT
+echo {
+a: 0,
+# b
+# c
+}
+# END_INDENT
+
+# START_INDENT
+echo search(
+# comment
+'1'
+.. '2'
+)
+# END_INDENT
+
+# START_INDENT
+if true
+var v = (      # trailing "(" starts line continuation
+3 + 4      # nothing special
+)              # end of expression indicates continued line
+var x: number  # needs to align with previous "var"
+endif
+# END_INDENT
+
+# START_INDENT
+def Func() # {{{
+# comment
+if true
+return
+endif
+enddef
+# END_INDENT
+
+# START_INDENT
+echo {
+key:
+'value',
+}
+# END_INDENT
+
+# START_INDENT
+var id = time
+->timer_start((_) => {
+n = 0
+})
+# END_INDENT
+
+# START_INDENT
+var n =
+# comment
+1
++ 2
+
+var s = ''
+# END_INDENT
+
+# START_INDENT
+var keys = {
+J: 'j',
+"\<Home>": '1G',
+"\<End>": 'G',
+z: 'zz'
+}
+# END_INDENT
+
+# START_INDENT
+export def Func(
+n: number,
+s: string,
+...l: list<bool>
+)
+enddef
+# END_INDENT
+
+# START_INDENT
+var heredoc =<< trim ENDD
+var nested_heredoc =<< trim END
+END
+ENDD
+# END_INDENT
+
+# START_INDENT
+if true
+else  " comment
+endif
+# END_INDENT
+
+# START_INDENT
+if true | echo 'one' | endif
+if true | echo 'two' | endif
+if true | echo 'three' | endif
+# END_INDENT
+
+# START_INDENT
+if true
+:'<-1 mark <
+else
+echo ''
+endif
+# END_INDENT
+
+# START_INDENT
+def Func()
+Cmd %
+enddef
+# END_INDENT
+
+# START_INDENT
+if true
+popup_move(id, {col: 1,
+line: 2})
+endif
+setwinvar(id, 'name', 3)
+# END_INDENT
+
+# START_INDENT
+var d = [
+{a: 'x',
+b: 'y'},
+FuncA(),
+FuncB(),
+]
+# END_INDENT
+
+# START_INDENT
+var ll = [[
+1,
+2,
+3], [
+4,
+5,
+6], [
+7,
+8,
+9]]
+# END_INDENT
+
+# START_INDENT
+var ld = [{
+a: 'xxx',
+b: 'yyy'}, {
+c: 'xxx',
+d: 'yyy'}, {
+e: 'xxx',
+f: 'yyy'}, {
+}]
+# END_INDENT
+
+# START_INDENT
+var d = {
+a: {
+b: {
+c: [{
+d: 'e',
+f: 'g',
+h: 'i'
+}],
+j: 'k',
+},
+},
+}
+# END_INDENT
+
+# START_INDENT
+if true
+var end: any
+if true
+end = 0
+elseif true
+echo
+endif
+endif
+# END_INDENT
+
+# START_INDENT
+if true
+var d = {
+end: 0}
+endif
+# END_INDENT
+
+# START_INDENT
+def Func(
+s: string,
+n = 1,
+m = 2
+)
+enddef
+# END_INDENT
+
+# START_INDENT
+var h =<< END
+text
+END
+
+def Func()
+echo
+enddef
+# END_INDENT
+
+# START_INDENT
+def Func()
+var h =<< END
+text
+END
+echo 'test'
+enddef
+# END_INDENT
+
+# START_INDENT
+def Foo()
+lcd -
+enddef
+def Bar()
+echo
+enddef
+# END_INDENT
+
+# START_INDENT
+if true
+n = Func(1, 2,
+3)
+endif
+# END_INDENT
+
+# START_INDENT
+def Func(s: string,
+n: number): bool
+if true
+return false
+endif
+enddef
+# END_INDENT
+
+# START_INDENT
+def Func(
+n: number)
+#
+echo
+enddef
+# END_INDENT
+
+# START_INDENT
+# INDENT_AT  this-line
+def Func(
+	n: number)
+    #
+echo  # this-line
+enddef
+# END_INDENT
+
+# START_INDENT
+if true
+if true
+normal! ==
+endif
+endif
+# END_INDENT
+
+# START_INDENT
+var d = {
+a: () => true,
+b: () => true
+&& true
+&& Foo(),
+c: () => Bar(),
+e: () => Baz(),
+}
+# END_INDENT
+
+# START_INDENT
+def Select(Cont: func(func(any)), Pred: func(any): bool): func(func(any))
+return (Emit: func(any)) => {
+Cont((t: any) => {
+if Pred(t)
+Emit(t)
+endif
+})
+}
+enddef
+# END_INDENT
+
+# START_INDENT
+# INDENT_EXE let g:vim_indent = {'more_in_bracket_block': v:true}
+def Select(Cont: func(func(any)), Pred: func(any): bool): func(func(any))
+return (Emit: func(any)) => {
+Cont((t: any) => {
+if Pred(t)
+Emit(t)
+endif
+})
+}
+enddef
+# END_INDENT
+
+# START_INDENT
+# INDENT_EXE unlet! g:vim_indent
+# END_INDENT
+
+# START_INDENT
+g:lightline = {
+'active': {
+'left': [ [ 'mode', 'paste' ], [ 'readonly', 'relativepath', 'modified' ] ],
+},
+'inactive': {
+'left': [ [ 'readonly', 'relativepath', 'modified' ] ],
+}
+}
+# END_INDENT
+
+# START_INDENT
+if getline(1, 10)
+->map((_, v: string): number => strcharlen(v))
+->max() > 1'000
+&l:breakindent = false
+&l:linebreak = false
+else
+&l:breakindent = true
+&l:linebreak = true
+endif
+# END_INDENT
+
+# START_INDENT
+var ext2cmd: dict<string> = {
+doc: $'antiword {fname}',
+docx: $'pandoc --from=docx --to=markdown {fname}',
+epub: $'pandoc --from=epub --to=markdown {fname}',
+odp: $'odt2txt {fname}',
+odt: $'odt2txt {fname}',
+pdf: $'pdftotext -nopgbrk -layout -q -eol unix {fname} -',
+rtf: 'unrtf --text',
+}
+# END_INDENT
+
+# START_INDENT
+const ptybuf: number = term_start(&shell, {
+hidden: true,
+exit_cb: (_, _) => {
+if true
+close
+else
+help
+endif
+}
+})
+# END_INDENT
+
+# START_INDENT
+var d = {
+a: 0,
+# a ' quote {{{
+#}}}
+b: 0,
+}
+# END_INDENT
+
+# START_INDENT
+echo printf('%s () %s',
+1,
+2
+)
+# END_INDENT
+
+# START_INDENT
+prop_add(1, col('.'), {
+length: 2,
+type: 'test'
+})
+# END_INDENT
+
+# START_INDENT
+echo (() => " string starting with space")()
+echo
+# END_INDENT
+
+# START_INDENT
+var variables = deepcopy(g:)
+->filter((k: string, _): bool =>
+k =~ '\c\V' .. keyword->escape('\')
+&& k !~ '\%(loaded\|did_plugin_\)')
+->items()
+->map((_, v): string => v[0] .. ' = ' .. string(v[1]))
+new
+# END_INDENT
+
+# START_INDENT
+var d = freq
+->map((_, v) =>
+v * (
+1
++ 2
+))
+for item in d
+->items()
+->sort((a, b) => b[1] - a[1])
+echo
+endfor
+# END_INDENT
+
+# START_INDENT
+var matching_abbrev: list<dict<string>> = copy(ABBREV)
+->filter((_, v: dict<string>): bool =>
+stridx(v.lhs, word_to_complete) == 0)
+->map((_, v: dict<string>) => ({
+word: v.lhs,
+menu: AbbrevRhs(v.rhs)->stridx('expand_') >= 0
+?    AbbrevRhs(v.rhs)->matchstr('.*,\s*''\zs.*\ze'')')
+:    AbbrevRhs(v.rhs)
+}))
+# END_INDENT
+
+# START_INDENT
+def Func()
+if true
+vimgrep /^\C\s*\%(fu\%[nction]\|def\)\s\+/ file
+endif
+enddef
+# END_INDENT
+
+# START_INDENT
+silent if true
+echo
+endif
+# END_INDENT
+
+# START_INDENT
+def Func()
+sort :^.*[\/]:
+enddef
+# END_INDENT
+
+# START_INDENT
+def Func()
+d = {
+}
+hd =<< trim END
+['
+]'
+END
+enddef
+# END_INDENT
+
+# START_INDENT
+def Func()
+if true
+var hd =<< trim END
+if get(b:, 'current_syntax', '')
+endif
+END
+elseif true
+echo
+endif
+enddef
+# END_INDENT
+
+# START_INDENT
+# test for control-flow keyword followed by commented fold marker {{{
+if true
+echo
+endif #}}}
+# END_INDENT
+
+# START_INDENT
+if true
+if true
+windo if true | echo | endif
+augroup Name
+autocmd WinLeave * if true | eval 1 + 2 | endif
+augroup END
+endif
+endif
+# END_INDENT
+
+# START_INDENT
+if true
+echo ' =<< trim END'
+->len()
+endif
+# END_INDENT
+
+# START_INDENT
+function Func()
+if true
+if true
+if true | echo com | endif
+if true | echo com | endif
+endif
+else
+endif
+endfunction
+# END_INDENT
+
+# START_INDENT
+var matchpairs: string = &matchpairs
+var pairs: dict<list<string>>
+for [opening: string, closing: string]
+in matchpairs
+->split(',')
+->map((_, v: string): list<string> => split(v, ':'))
+pairs[opening] = [escape(opening, '[]'), escape(closing, '[]'),  'nW', 'w$']
+pairs[closing] = [escape(opening, '[]'), escape(closing, '[]'), 'bnW', 'w0']
+endfor
+# END_INDENT
+
+# START_INDENT
+{
+echo []
++ []
++ [{a: 1,
+b: 2}]
+}
+# END_INDENT
+
+# START_INDENT
+def Foo()
+Bar(1,
+[]->filter((_, v) => {
+return true
+}),
+() => {
+echo
+})
+enddef
+# END_INDENT
+
+# START_INDENT
+echo {
+k: () => {
+if true
+echo
+popup_setoptions(id,
+{title: 'title'})
+endif
+}
+}
+# END_INDENT
+
+# START_INDENT
+if true
+elseif
+endif
+# END_INDENT
+
+# START_INDENT
+if (
+true)
+&& true
+echo
+endif
+# END_INDENT
+
+# START_INDENT
+abstract class Shape
+var color = Color.Black
+var thickness = 10
+endclass
+# END_INDENT
+
+# START_INDENT
+class OtherThing
+var size: number
+static var totalSize: number
+
+static def ClearTotalSize(): number
+var prev = totalSize
+totalSize = 0
+return prev
+enddef
+endclass
+# END_INDENT
+
+# START_INDENT
+interface HasSurface
+var size: number
+def Surface(): number
+endinterface
+# END_INDENT
+
+# START_INDENT
+interface EnterExit
+def Enter(): void
+def Exit(): void
+endinterface
+# END_INDENT
+
+# START_INDENT
+enum Color
+White,
+Red,
+Green,
+Blue,
+Black
+endenum
+# END_INDENT
+
+# START_INDENT
+enum Digits
+INVALID(v:numbermax),  # The null value.
+ZERO(0 * v:numbermin), ONE(2 - 1),
+TWO(1 + 1), THREE(9 / 3), FOUR(1 * 4),
+FIVE(1 + 2 + 2), SIX(36 / 3 / 2), SEVEN(7), EIGHT(2 * 2 * 2),
+NINE(3 + 3 + 3)
+const value: number
+def new(value: number)
+this.value = value
+enddef
+endenum
+# END_INDENT
diff --git a/runtime/indent/testdir/vim9.ok b/runtime/indent/testdir/vim9.ok
new file mode 100644
index 0000000..e4ba72c
--- /dev/null
+++ b/runtime/indent/testdir/vim9.ok
@@ -0,0 +1,782 @@
+vim9script
+# vim: set ft=vim sw=4 :
+
+# START_INDENT
+var result = Func(
+    arg1,
+    arg2
+)
+# END_INDENT
+
+# START_INDENT
+var result = Func(arg1,
+    arg2)
+# END_INDENT
+
+# START_INDENT
+filter(list, (k, v) =>
+    v > 0)
+# END_INDENT
+
+# START_INDENT
+filter(list, (k, v) => {
+    const x = get(list, k, 0)
+    return x > 0
+})
+# END_INDENT
+
+# START_INDENT
+if x > 0
+    filter(list, (k, v) => {
+	const x = get(list, k, 1)
+	return x > 0
+    })
+endif
+# END_INDENT
+
+# START_INDENT
+{
+    var temp = 'temp'
+}
+# END_INDENT
+
+# START_INDENT
+var text = lead
+    .. middle
+    .. end
+# END_INDENT
+
+# START_INDENT
+var text = lead ..
+    middle ..
+    end
+# END_INDENT
+
+# START_INDENT
+var total = start +
+    end -
+    correction
+# END_INDENT
+
+# START_INDENT
+var result = start
+:+ print
+# END_INDENT
+
+# START_INDENT
+var result = positive
+    ? PosFunc(arg)
+    : NegFunc(arg)
+# END_INDENT
+
+# START_INDENT
+var result = GetBuilder()
+    ->BuilderSetWidth(333)
+    ->BuilderSetHeight(777)
+    ->BuilderBuild()
+# END_INDENT
+
+# START_INDENT
+var result = MyDict
+    .member
+# END_INDENT
+
+# START_INDENT
+autocmd BufNewFile *.match if condition
+    |   echo 'match'
+    | endif
+# END_INDENT
+
+# START_INDENT
+set cpo+=C
+var lines =<< trim END
+    | this works
+END
+set cpo-=C
+# END_INDENT
+
+# START_INDENT
+syn region Text
+	    \ start='foo'
+	    #\ comment
+	    \ end='bar'
+# END_INDENT
+
+# START_INDENT
+au CursorHold * echom 'BEFORE bar'
+    #\ some comment
+    | echom 'AFTER bar'
+# END_INDENT
+
+# START_INDENT
+def MyFunc(text: string,
+	separator = '-'
+	): string
+enddef
+# END_INDENT
+
+# START_INDENT
+def MyFunc(
+	text: string,
+	separator = '-'
+	): string
+enddef
+# END_INDENT
+
+# START_INDENT
+[var1, var2] =
+    Func()
+# END_INDENT
+
+# START_INDENT
+const list = ['one',
+    'two']
+# END_INDENT
+
+# START_INDENT
+const list = [
+    'one',
+    'two',
+]
+# END_INDENT
+
+# START_INDENT
+const dict = {one: 1,
+    two: 2
+}
+# END_INDENT
+
+# START_INDENT
+const dict = {
+    one: 1,
+    two: 2
+}
+# END_INDENT
+
+# START_INDENT
+if true
+    const dict =
+	{
+	    one: 1,
+	    two: 2
+	}
+endif
+# END_INDENT
+
+# START_INDENT
+def Func()
+    return {
+	one: 1
+    }
+enddef
+# END_INDENT
+
+# START_INDENT
+echo {
+    a: 0,
+    # b
+    # c
+}
+# END_INDENT
+
+# START_INDENT
+echo search(
+    # comment
+    '1'
+    .. '2'
+)
+# END_INDENT
+
+# START_INDENT
+if true
+    var v = (      # trailing "(" starts line continuation
+	3 + 4      # nothing special
+    )              # end of expression indicates continued line
+    var x: number  # needs to align with previous "var"
+endif
+# END_INDENT
+
+# START_INDENT
+def Func() # {{{
+    # comment
+    if true
+	return
+    endif
+enddef
+# END_INDENT
+
+# START_INDENT
+echo {
+    key:
+	'value',
+}
+# END_INDENT
+
+# START_INDENT
+var id = time
+    ->timer_start((_) => {
+	n = 0
+    })
+# END_INDENT
+
+# START_INDENT
+var n =
+    # comment
+    1
+    + 2
+
+var s = ''
+# END_INDENT
+
+# START_INDENT
+var keys = {
+    J: 'j',
+    "\<Home>": '1G',
+    "\<End>": 'G',
+    z: 'zz'
+}
+# END_INDENT
+
+# START_INDENT
+export def Func(
+	n: number,
+	s: string,
+	...l: list<bool>
+	)
+enddef
+# END_INDENT
+
+# START_INDENT
+var heredoc =<< trim ENDD
+    var nested_heredoc =<< trim END
+    END
+ENDD
+# END_INDENT
+
+# START_INDENT
+if true
+else  " comment
+endif
+# END_INDENT
+
+# START_INDENT
+if true | echo 'one' | endif
+if true | echo 'two' | endif
+if true | echo 'three' | endif
+# END_INDENT
+
+# START_INDENT
+if true
+    :'<-1 mark <
+else
+    echo ''
+endif
+# END_INDENT
+
+# START_INDENT
+def Func()
+    Cmd %
+enddef
+# END_INDENT
+
+# START_INDENT
+if true
+    popup_move(id, {col: 1,
+	line: 2})
+endif
+setwinvar(id, 'name', 3)
+# END_INDENT
+
+# START_INDENT
+var d = [
+    {a: 'x',
+	b: 'y'},
+    FuncA(),
+    FuncB(),
+]
+# END_INDENT
+
+# START_INDENT
+var ll = [[
+    1,
+    2,
+    3], [
+    4,
+    5,
+    6], [
+    7,
+    8,
+    9]]
+# END_INDENT
+
+# START_INDENT
+var ld = [{
+    a: 'xxx',
+    b: 'yyy'}, {
+    c: 'xxx',
+    d: 'yyy'}, {
+    e: 'xxx',
+    f: 'yyy'}, {
+    }]
+# END_INDENT
+
+# START_INDENT
+var d = {
+    a: {
+	b: {
+	    c: [{
+		d: 'e',
+		f: 'g',
+		h: 'i'
+	    }],
+	    j: 'k',
+	},
+    },
+}
+# END_INDENT
+
+# START_INDENT
+if true
+    var end: any
+    if true
+	end = 0
+    elseif true
+	echo
+    endif
+endif
+# END_INDENT
+
+# START_INDENT
+if true
+    var d = {
+	end: 0}
+endif
+# END_INDENT
+
+# START_INDENT
+def Func(
+	s: string,
+	n = 1,
+	m = 2
+	)
+enddef
+# END_INDENT
+
+# START_INDENT
+var h =<< END
+text
+END
+
+def Func()
+    echo
+enddef
+# END_INDENT
+
+# START_INDENT
+def Func()
+    var h =<< END
+text
+END
+    echo 'test'
+enddef
+# END_INDENT
+
+# START_INDENT
+def Foo()
+    lcd -
+enddef
+def Bar()
+    echo
+enddef
+# END_INDENT
+
+# START_INDENT
+if true
+    n = Func(1, 2,
+	3)
+endif
+# END_INDENT
+
+# START_INDENT
+def Func(s: string,
+	n: number): bool
+    if true
+	return false
+    endif
+enddef
+# END_INDENT
+
+# START_INDENT
+def Func(
+	n: number)
+    #
+    echo
+enddef
+# END_INDENT
+
+# START_INDENT
+# INDENT_AT  this-line
+def Func(
+	n: number)
+    #
+    echo  # this-line
+enddef
+# END_INDENT
+
+# START_INDENT
+if true
+    if true
+	normal! ==
+    endif
+endif
+# END_INDENT
+
+# START_INDENT
+var d = {
+    a: () => true,
+    b: () => true
+	&& true
+	&& Foo(),
+    c: () => Bar(),
+    e: () => Baz(),
+}
+# END_INDENT
+
+# START_INDENT
+def Select(Cont: func(func(any)), Pred: func(any): bool): func(func(any))
+    return (Emit: func(any)) => {
+	Cont((t: any) => {
+	    if Pred(t)
+		Emit(t)
+	    endif
+	})
+    }
+enddef
+# END_INDENT
+
+# START_INDENT
+# INDENT_EXE let g:vim_indent = {'more_in_bracket_block': v:true}
+def Select(Cont: func(func(any)), Pred: func(any): bool): func(func(any))
+    return (Emit: func(any)) => {
+	    Cont((t: any) => {
+		    if Pred(t)
+			Emit(t)
+		    endif
+		})
+	}
+enddef
+# END_INDENT
+
+# START_INDENT
+# INDENT_EXE unlet! g:vim_indent
+# END_INDENT
+
+# START_INDENT
+g:lightline = {
+    'active': {
+	'left': [ [ 'mode', 'paste' ], [ 'readonly', 'relativepath', 'modified' ] ],
+    },
+    'inactive': {
+	'left': [ [ 'readonly', 'relativepath', 'modified' ] ],
+    }
+}
+# END_INDENT
+
+# START_INDENT
+if getline(1, 10)
+	->map((_, v: string): number => strcharlen(v))
+	->max() > 1'000
+    &l:breakindent = false
+    &l:linebreak = false
+else
+    &l:breakindent = true
+    &l:linebreak = true
+endif
+# END_INDENT
+
+# START_INDENT
+var ext2cmd: dict<string> = {
+    doc: $'antiword {fname}',
+    docx: $'pandoc --from=docx --to=markdown {fname}',
+    epub: $'pandoc --from=epub --to=markdown {fname}',
+    odp: $'odt2txt {fname}',
+    odt: $'odt2txt {fname}',
+    pdf: $'pdftotext -nopgbrk -layout -q -eol unix {fname} -',
+    rtf: 'unrtf --text',
+}
+# END_INDENT
+
+# START_INDENT
+const ptybuf: number = term_start(&shell, {
+    hidden: true,
+    exit_cb: (_, _) => {
+	if true
+	    close
+	else
+	    help
+	endif
+    }
+})
+# END_INDENT
+
+# START_INDENT
+var d = {
+    a: 0,
+    # a ' quote {{{
+    #}}}
+    b: 0,
+}
+# END_INDENT
+
+# START_INDENT
+echo printf('%s () %s',
+    1,
+    2
+)
+# END_INDENT
+
+# START_INDENT
+prop_add(1, col('.'), {
+    length: 2,
+    type: 'test'
+})
+# END_INDENT
+
+# START_INDENT
+echo (() => " string starting with space")()
+echo
+# END_INDENT
+
+# START_INDENT
+var variables = deepcopy(g:)
+    ->filter((k: string, _): bool =>
+	k =~ '\c\V' .. keyword->escape('\')
+	&& k !~ '\%(loaded\|did_plugin_\)')
+    ->items()
+    ->map((_, v): string => v[0] .. ' = ' .. string(v[1]))
+new
+# END_INDENT
+
+# START_INDENT
+var d = freq
+    ->map((_, v) =>
+	v * (
+	    1
+	    + 2
+	))
+for item in d
+	->items()
+	->sort((a, b) => b[1] - a[1])
+    echo
+endfor
+# END_INDENT
+
+# START_INDENT
+var matching_abbrev: list<dict<string>> = copy(ABBREV)
+    ->filter((_, v: dict<string>): bool =>
+	stridx(v.lhs, word_to_complete) == 0)
+    ->map((_, v: dict<string>) => ({
+	word: v.lhs,
+	menu: AbbrevRhs(v.rhs)->stridx('expand_') >= 0
+	    ?    AbbrevRhs(v.rhs)->matchstr('.*,\s*''\zs.*\ze'')')
+	    :    AbbrevRhs(v.rhs)
+    }))
+# END_INDENT
+
+# START_INDENT
+def Func()
+    if true
+	vimgrep /^\C\s*\%(fu\%[nction]\|def\)\s\+/ file
+    endif
+enddef
+# END_INDENT
+
+# START_INDENT
+silent if true
+    echo
+endif
+# END_INDENT
+
+# START_INDENT
+def Func()
+    sort :^.*[\/]:
+enddef
+# END_INDENT
+
+# START_INDENT
+def Func()
+    d = {
+    }
+    hd =<< trim END
+	['
+	]'
+    END
+enddef
+# END_INDENT
+
+# START_INDENT
+def Func()
+    if true
+	var hd =<< trim END
+	    if get(b:, 'current_syntax', '')
+	    endif
+	END
+    elseif true
+	echo
+    endif
+enddef
+# END_INDENT
+
+# START_INDENT
+# test for control-flow keyword followed by commented fold marker {{{
+if true
+    echo
+endif #}}}
+# END_INDENT
+
+# START_INDENT
+if true
+    if true
+	windo if true | echo | endif
+	augroup Name
+	    autocmd WinLeave * if true | eval 1 + 2 | endif
+	augroup END
+    endif
+endif
+# END_INDENT
+
+# START_INDENT
+if true
+    echo ' =<< trim END'
+	->len()
+endif
+# END_INDENT
+
+# START_INDENT
+function Func()
+    if true
+	if true
+	    if true | echo com | endif
+	    if true | echo com | endif
+	endif
+    else
+    endif
+endfunction
+# END_INDENT
+
+# START_INDENT
+var matchpairs: string = &matchpairs
+var pairs: dict<list<string>>
+for [opening: string, closing: string]
+	in matchpairs
+	->split(',')
+	->map((_, v: string): list<string> => split(v, ':'))
+    pairs[opening] = [escape(opening, '[]'), escape(closing, '[]'),  'nW', 'w$']
+    pairs[closing] = [escape(opening, '[]'), escape(closing, '[]'), 'bnW', 'w0']
+endfor
+# END_INDENT
+
+# START_INDENT
+{
+    echo []
+	+ []
+	+ [{a: 1,
+	b: 2}]
+}
+# END_INDENT
+
+# START_INDENT
+def Foo()
+    Bar(1,
+	[]->filter((_, v) => {
+	    return true
+	}),
+	() => {
+	    echo
+	})
+enddef
+# END_INDENT
+
+# START_INDENT
+echo {
+    k: () => {
+	if true
+	    echo
+	    popup_setoptions(id,
+		{title: 'title'})
+	endif
+    }
+}
+# END_INDENT
+
+# START_INDENT
+if true
+elseif
+endif
+# END_INDENT
+
+# START_INDENT
+if (
+	true)
+	&& true
+    echo
+endif
+# END_INDENT
+
+# START_INDENT
+abstract class Shape
+    var color = Color.Black
+    var thickness = 10
+endclass
+# END_INDENT
+
+# START_INDENT
+class OtherThing
+    var size: number
+    static var totalSize: number
+
+    static def ClearTotalSize(): number
+	var prev = totalSize
+	totalSize = 0
+	return prev
+    enddef
+endclass
+# END_INDENT
+
+# START_INDENT
+interface HasSurface
+    var size: number
+    def Surface(): number
+endinterface
+# END_INDENT
+
+# START_INDENT
+interface EnterExit
+    def Enter(): void
+    def Exit(): void
+endinterface
+# END_INDENT
+
+# START_INDENT
+enum Color
+    White,
+    Red,
+    Green,
+    Blue,
+    Black
+endenum
+# END_INDENT
+
+# START_INDENT
+enum Digits
+    INVALID(v:numbermax),  # The null value.
+    ZERO(0 * v:numbermin), ONE(2 - 1),
+    TWO(1 + 1), THREE(9 / 3), FOUR(1 * 4),
+    FIVE(1 + 2 + 2), SIX(36 / 3 / 2), SEVEN(7), EIGHT(2 * 2 * 2),
+    NINE(3 + 3 + 3)
+    const value: number
+    def new(value: number)
+	this.value = value
+    enddef
+endenum
+# END_INDENT