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
