diff options
Diffstat (limited to 'indent/plantuml.vim')
-rw-r--r-- | indent/plantuml.vim | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/indent/plantuml.vim b/indent/plantuml.vim new file mode 100644 index 00000000..3e0f455d --- /dev/null +++ b/indent/plantuml.vim @@ -0,0 +1,58 @@ +if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'plantuml') == -1 + +if exists("b:did_indent") + finish +endif +let b:did_indent = 1 + +setlocal indentexpr=GetPlantUMLIndent() +setlocal indentkeys=o,O,<CR>,<:>,!^F,0end,0else,} + +" only define the indent code once +if exists("*GetPlantUMLIndent") + finish +endif + +let s:incIndent = + \ '^\s*\(loop\|alt\|opt\|group\|critical\|else\|legend\|box\)\>\|' . + \ '^\s*\([hr]\?note\|ref\)\>[^:]*$\|' . + \ '^\s*title\s*$\|' . + \ '^\s*skinparam\>.*{\s*$\|' . + \ '^\s*state\>.*{' + +let s:decIndent = '^\s*\(end\|else\|}\)' + +function! GetPlantUMLIndent(...) abort + "for current line, use arg if given or v:lnum otherwise + let clnum = a:0 ? a:1 : v:lnum + + if !s:insidePlantUMLTags(clnum) + return indent(clnum) + endif + + let pnum = prevnonblank(clnum-1) + let pindent = indent(pnum) + let pline = getline(pnum) + let cline = getline(clnum) + + if cline =~ s:decIndent + if pline =~ s:incIndent + return pindent + else + return pindent - shiftwidth() + endif + + elseif pline =~ s:incIndent + return pindent + shiftwidth() + endif + + return pindent + +endfunction + +function! s:insidePlantUMLTags(lnum) abort + call cursor(a:lnum, 1) + return search('@startuml', 'Wbn') && search('@enduml', 'Wn') +endfunction + +endif |