vim9script
# vim: set ft=vim sw=4 :

# START_INDENT
# INDENT_EXE let g:vim_indent = {'searchpair_timeout': 8192}
# INDENT_EXE runtime autoload/dist/vimindent.vim
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 let g:vim_indent = {'searchpair_timeout': 8192}
# 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

# START_INDENT
def ToggleBoolOpt(opt: string)
    exe $"&{opt} = !&{opt}"
    $"&{opt}"
	->eval()
	->( (v) => v ? "ON" : "OFF" )()
	->printf($"{opt} %s")
	->popup_notification({})
enddef
# END_INDENT
