1" Vim indent file 2" Language: Haml 3" Maintainer: Tim Pope <[email protected]> 4" Last Change: 2019 Dec 05 5 6if exists("b:did_indent") 7 finish 8endif 9runtime! indent/ruby.vim 10unlet! b:did_indent 11let b:did_indent = 1 12 13setlocal autoindent 14setlocal indentexpr=GetHamlIndent() 15setlocal indentkeys=o,O,*<Return>,},],0),!^F,=end,=else,=elsif,=rescue,=ensure,=when 16 17" Only define the function once. 18if exists("*GetHamlIndent") 19 finish 20endif 21 22let s:attributes = '\%({.\{-\}}\|\[.\{-\}\]\)' 23let s:tag = '\%([%.#][[:alnum:]_-]\+\|'.s:attributes.'\)*[<>]*' 24 25if !exists('g:haml_self_closing_tags') 26 let g:haml_self_closing_tags = 'base|link|meta|br|hr|img|input' 27endif 28 29function! GetHamlIndent() 30 let lnum = prevnonblank(v:lnum-1) 31 if lnum == 0 32 return 0 33 endif 34 let line = substitute(getline(lnum),'\s\+$','','') 35 let cline = substitute(substitute(getline(v:lnum),'\s\+$','',''),'^\s\+','','') 36 let lastcol = strlen(line) 37 let line = substitute(line,'^\s\+','','') 38 let indent = indent(lnum) 39 let cindent = indent(v:lnum) 40 let sw = shiftwidth() 41 if cline =~# '\v^-\s*%(elsif|else|when)>' 42 let indent = cindent < indent ? cindent : indent - sw 43 endif 44 let increase = indent + sw 45 if indent == indent(lnum) 46 let indent = cindent <= indent ? -1 : increase 47 endif 48 49 let group = synIDattr(synID(lnum,lastcol,1),'name') 50 51 if line =~ '^!!!' 52 return indent 53 elseif line =~ '^/\%(\[[^]]*\]\)\=$' 54 return increase 55 elseif group == 'hamlFilter' 56 return increase 57 elseif line =~ '^'.s:tag.'[&!]\=[=~-]\s*\%(\%(if\|else\|elsif\|unless\|case\|when\|while\|until\|for\|begin\|module\|class\|def\)\>\%(.*\<end\>\)\@!\|.*do\%(\s*|[^|]*|\)\=\s*$\)' 58 return increase 59 elseif line =~ '^'.s:tag.'[&!]\=[=~-].*,\s*$' 60 return increase 61 elseif line == '-#' 62 return increase 63 elseif group =~? '\v^(hamlSelfCloser)$' || line =~? '^%\v%('.g:haml_self_closing_tags.')>' 64 return indent 65 elseif group =~? '\v^%(hamlTag|hamlAttributesDelimiter|hamlObjectDelimiter|hamlClass|hamlId|htmlTagName|htmlSpecialTagName)$' 66 return increase 67 elseif synIDattr(synID(v:lnum,1,1),'name') ==? 'hamlRubyFilter' 68 return GetRubyIndent() 69 else 70 return indent 71 endif 72endfunction 73 74" vim:set sw=2: 75