neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

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: