typst.vim (2107B)
1 " Language: Typst 2 " Previous Maintainer: Luca Saccarola <github.e41mv@aleeas.com> 3 " Maintainer: This runtime file is looking for a new maintainer. 4 " Last Change: 2025 Aug 05 5 " Based on: https://github.com/kaarmu/typst.vim 6 7 function! typst#indentexpr() abort 8 let l:lnum = v:lnum 9 let s:sw = shiftwidth() 10 11 let [l:plnum, l:pline] = s:get_prev_nonblank(l:lnum - 1) 12 if l:plnum == 0 | return 0 | endif 13 14 let l:line = getline(l:lnum) 15 let l:ind = indent(l:plnum) 16 17 let l:synname = synIDattr(synID(l:lnum, 1, 1), 'name') 18 19 " Use last indent for block comments 20 if l:synname == 'typstCommentBlock' 21 return l:ind 22 " do not change the indents of bullet lists 23 elseif l:synname == 'typstMarkupBulletList' 24 return indent(a:lnum) 25 endif 26 27 if l:pline =~ '\v[{[(]\s*$' 28 let l:ind += s:sw 29 endif 30 31 if l:line =~ '\v^\s*[}\])]' 32 let l:ind -= s:sw 33 endif 34 35 return l:ind 36 endfunction 37 38 function typst#foldexpr() 39 let line = getline(v:lnum) 40 41 " Whenever the user wants to fold nested headers under the parent 42 let nested = get(g:, "typst_foldnested", 1) 43 44 " Regular headers 45 let depth = match(line, '\(^=\+\)\@<=\( .*$\)\@=') 46 47 " Do not fold nested regular headers 48 if depth > 1 && !nested 49 let depth = 1 50 endif 51 52 if depth > 0 53 " check syntax, it should be typstMarkupHeading 54 let syncode = synstack(v:lnum, 1) 55 if len(syncode) > 0 && synIDattr(syncode[0], 'name') ==# 'typstMarkupHeading' 56 return ">" . depth 57 endif 58 endif 59 60 return "=" 61 endfunction 62 63 " Gets the previous non-blank line that is not a comment. 64 function! s:get_prev_nonblank(lnum) abort 65 let l:lnum = prevnonblank(a:lnum) 66 let l:line = getline(l:lnum) 67 68 while l:lnum > 0 && l:line =~ '^\s*//' 69 let l:lnum = prevnonblank(l:lnum - 1) 70 let l:line = getline(l:lnum) 71 endwhile 72 73 return [l:lnum, s:remove_comments(l:line)] 74 endfunction 75 76 " Removes comments from the given line. 77 function! s:remove_comments(line) abort 78 return substitute(a:line, '\s*//.*', '', '') 79 endfunction