Bram Moolenaar | 7dd5432 | 2022-08-26 18:01:12 +0100 | [diff] [blame] | 1 | vim9script |
| 2 | |
| 3 | # Language: ConTeXt typesetting engine |
| 4 | # Maintainer: Nicola Vitacolonna <nvitacolonna@gmail.com> |
| 5 | # Former Maintainers: Nikolai Weibull <now@bitwi.se> |
Lifepillar | 0bca4a0 | 2023-12-27 18:49:50 +0100 | [diff] [blame] | 6 | # Latest Revision: 2023 Dec 26 |
Bram Moolenaar | 46fceaa | 2016-10-23 21:21:08 +0200 | [diff] [blame] | 7 | |
| 8 | if exists("b:did_indent") |
| 9 | finish |
| 10 | endif |
| 11 | |
Bram Moolenaar | 7dd5432 | 2022-08-26 18:01:12 +0100 | [diff] [blame] | 12 | # Load MetaPost indentation script (this will also set b:did_indent) |
Bram Moolenaar | 46fceaa | 2016-10-23 21:21:08 +0200 | [diff] [blame] | 13 | runtime! indent/mp.vim |
| 14 | |
Bram Moolenaar | 7dd5432 | 2022-08-26 18:01:12 +0100 | [diff] [blame] | 15 | setlocal indentexpr=ConTeXtIndent() |
Bram Moolenaar | 46fceaa | 2016-10-23 21:21:08 +0200 | [diff] [blame] | 16 | |
Bram Moolenaar | 7dd5432 | 2022-08-26 18:01:12 +0100 | [diff] [blame] | 17 | b:undo_indent = "setl indentexpr<" |
Bram Moolenaar | 46fceaa | 2016-10-23 21:21:08 +0200 | [diff] [blame] | 18 | |
Bram Moolenaar | 7dd5432 | 2022-08-26 18:01:12 +0100 | [diff] [blame] | 19 | def PrevNotComment(l: number): number |
| 20 | var prevlnum = prevnonblank(l) |
Bram Moolenaar | 46fceaa | 2016-10-23 21:21:08 +0200 | [diff] [blame] | 21 | |
Bram Moolenaar | 7dd5432 | 2022-08-26 18:01:12 +0100 | [diff] [blame] | 22 | while prevlnum > 0 && getline(prevlnum) =~# '^\s*%' |
| 23 | prevlnum = prevnonblank(prevlnum - 1) |
| 24 | endwhile |
| 25 | |
| 26 | return prevlnum |
| 27 | enddef |
| 28 | |
| 29 | def FindPair(pstart: string, pmid: string, pend: string): number |
| 30 | cursor(v:lnum, 1) |
| 31 | return indent(searchpair(pstart, pmid, pend, 'bWn', |
| 32 | 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment"')) |
| 33 | enddef |
| 34 | |
| 35 | def ConTeXtIndent(): number |
| 36 | # Use MetaPost rules inside MetaPost graphic environments |
Bram Moolenaar | 46fceaa | 2016-10-23 21:21:08 +0200 | [diff] [blame] | 37 | if len(synstack(v:lnum, 1)) > 0 && |
Bram Moolenaar | 7dd5432 | 2022-08-26 18:01:12 +0100 | [diff] [blame] | 38 | synIDattr(synstack(v:lnum, 1)[0], "name") ==# 'contextMPGraphic' |
| 39 | return g:MetaPostIndent() |
Bram Moolenaar | 46fceaa | 2016-10-23 21:21:08 +0200 | [diff] [blame] | 40 | endif |
Bram Moolenaar | 7dd5432 | 2022-08-26 18:01:12 +0100 | [diff] [blame] | 41 | |
| 42 | const prevlnum = PrevNotComment(v:lnum - 1) |
| 43 | const prevind = indent(prevlnum) |
| 44 | const prevline = getline(prevlnum) |
| 45 | const currline = getline(v:lnum) |
| 46 | |
| 47 | # If the current line starts with ], match indentation. |
| 48 | if currline =~# '^\s*\]' |
| 49 | return FindPair('\[', '', '\]') |
| 50 | endif |
| 51 | |
| 52 | # If the current line starts with }, match indentation. |
| 53 | if currline =~# '^\s*}' |
| 54 | return FindPair('{', '', '}') |
| 55 | endif |
| 56 | |
| 57 | # If the previous line ends with [ or { (possibly followed by a comment) then indent. |
| 58 | if prevline =~# '[{[]\s*\%(%.*\)\=$' |
| 59 | return prevind + shiftwidth() |
| 60 | endif |
| 61 | |
Bram Moolenaar | 46fceaa | 2016-10-23 21:21:08 +0200 | [diff] [blame] | 62 | return -1 |
Bram Moolenaar | 7dd5432 | 2022-08-26 18:01:12 +0100 | [diff] [blame] | 63 | enddef |
Bram Moolenaar | 46fceaa | 2016-10-23 21:21:08 +0200 | [diff] [blame] | 64 | |
Bram Moolenaar | 7dd5432 | 2022-08-26 18:01:12 +0100 | [diff] [blame] | 65 | # vim: sw=2 fdm=marker |