66 lines
1.7 KiB
VimL
66 lines
1.7 KiB
VimL
vim9script
|
|
|
|
# Language: ConTeXt typesetting engine
|
|
# Maintainer: Nicola Vitacolonna <nvitacolonna@gmail.com>
|
|
# Former Maintainers: Nikolai Weibull <now@bitwi.se>
|
|
# Latest Revision: 2023 Dec 26
|
|
|
|
if exists("b:did_indent")
|
|
finish
|
|
endif
|
|
|
|
# Load MetaPost indentation script (this will also set b:did_indent)
|
|
runtime! indent/mp.vim
|
|
|
|
setlocal indentexpr=ConTeXtIndent()
|
|
|
|
b:undo_indent = "setl indentexpr<"
|
|
|
|
def PrevNotComment(l: number): number
|
|
var prevlnum = prevnonblank(l)
|
|
|
|
while prevlnum > 0 && getline(prevlnum) =~# '^\s*%'
|
|
prevlnum = prevnonblank(prevlnum - 1)
|
|
endwhile
|
|
|
|
return prevlnum
|
|
enddef
|
|
|
|
def FindPair(pstart: string, pmid: string, pend: string): number
|
|
cursor(v:lnum, 1)
|
|
return indent(searchpair(pstart, pmid, pend, 'bWn',
|
|
'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment"'))
|
|
enddef
|
|
|
|
def ConTeXtIndent(): number
|
|
# Use MetaPost rules inside MetaPost graphic environments
|
|
if len(synstack(v:lnum, 1)) > 0 &&
|
|
synIDattr(synstack(v:lnum, 1)[0], "name") ==# 'contextMPGraphic'
|
|
return g:MetaPostIndent()
|
|
endif
|
|
|
|
const prevlnum = PrevNotComment(v:lnum - 1)
|
|
const prevind = indent(prevlnum)
|
|
const prevline = getline(prevlnum)
|
|
const currline = getline(v:lnum)
|
|
|
|
# If the current line starts with ], match indentation.
|
|
if currline =~# '^\s*\]'
|
|
return FindPair('\[', '', '\]')
|
|
endif
|
|
|
|
# If the current line starts with }, match indentation.
|
|
if currline =~# '^\s*}'
|
|
return FindPair('{', '', '}')
|
|
endif
|
|
|
|
# If the previous line ends with [ or { (possibly followed by a comment) then indent.
|
|
if prevline =~# '[{[]\s*\%(%.*\)\=$'
|
|
return prevind + shiftwidth()
|
|
endif
|
|
|
|
return -1
|
|
enddef
|
|
|
|
# vim: sw=2 fdm=marker
|