1" Vim indent file 2" Language: Haml 3" Maintainer: Tim Pope <vimNOSPAM@tpope.org> 4" Last Change: 2010 May 21 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 sw=2 et 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 = 'meta|link|img|hr|br' 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 if cline =~# '\v^-\s*%(elsif|else|when)>' 41 let indent = cindent < indent ? cindent : indent - &sw 42 endif 43 let increase = indent + &sw 44 if indent == indent(lnum) 45 let indent = cindent <= indent ? -1 : increase 46 endif 47 48 let group = synIDattr(synID(lnum,lastcol,1),'name') 49 50 if line =~ '^!!!' 51 return indent 52 elseif line =~ '^/\%(\[[^]]*\]\)\=$' 53 return increase 54 elseif group == 'hamlFilter' 55 return increase 56 elseif line =~ '^'.s:tag.'[&!]\=[=~-]\s*\%(\%(if\|else\|elsif\|unless\|case\|when\|while\|until\|for\|begin\|module\|class\|def\)\>\%(.*\<end\>\)\@!\|.*do\%(\s*|[^|]*|\)\=\s*$\)' 57 return increase 58 elseif line =~ '^'.s:tag.'[&!]\=[=~-].*,\s*$' 59 return increase 60 elseif line == '-#' 61 return increase 62 elseif group =~? '\v^(hamlSelfCloser)$' || line =~? '^%\v%('.g:haml_self_closing_tags.')>' 63 return indent 64 elseif group =~? '\v^%(hamlTag|hamlAttributesDelimiter|hamlObjectDelimiter|hamlClass|hamlId|htmlTagName|htmlSpecialTagName)$' 65 return increase 66 elseif synIDattr(synID(v:lnum,1,1),'name') ==? 'hamlRubyFilter' 67 return GetRubyIndent() 68 else 69 return indent 70 endif 71endfunction 72 73" vim:set sw=2: 74