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