From aed8ce9da277f5ecffe968b324f242c41c3b752a Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 10:50:31 +0200 Subject: Adding upstream version 2:9.0.1378. Signed-off-by: Daniel Baumann --- runtime/indent/context.vim | 65 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 runtime/indent/context.vim (limited to 'runtime/indent/context.vim') diff --git a/runtime/indent/context.vim b/runtime/indent/context.vim new file mode 100644 index 0000000..762c5c1 --- /dev/null +++ b/runtime/indent/context.vim @@ -0,0 +1,65 @@ +vim9script + +# Language: ConTeXt typesetting engine +# Maintainer: Nicola Vitacolonna +# Former Maintainers: Nikolai Weibull +# Latest Revision: 2022 Aug 12 + +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 -- cgit v1.2.3