1" Vim indent file 2" Language: eRuby 3" Maintainer: Tim Pope <[email protected]> 4" URL: https://github.com/vim-ruby/vim-ruby 5" Release Coordinator: Doug Kearns <[email protected]> 6" Last Change: 2019 Jan 06 7 8if exists("b:did_indent") 9 finish 10endif 11 12runtime! indent/ruby.vim 13unlet! b:did_indent 14setlocal indentexpr= 15 16if exists("b:eruby_subtype") && b:eruby_subtype != '' && b:eruby_subtype !=# 'eruby' 17 exe "runtime! indent/".b:eruby_subtype.".vim" 18else 19 runtime! indent/html.vim 20endif 21unlet! b:did_indent 22 23" Force HTML indent to not keep state. 24let b:html_indent_usestate = 0 25 26if &l:indentexpr == '' 27 if &l:cindent 28 let &l:indentexpr = 'cindent(v:lnum)' 29 else 30 let &l:indentexpr = 'indent(prevnonblank(v:lnum-1))' 31 endif 32endif 33let b:eruby_subtype_indentexpr = &l:indentexpr 34 35let b:did_indent = 1 36 37setlocal indentexpr=GetErubyIndent() 38setlocal indentkeys=o,O,*<Return>,<>>,{,},0),0],o,O,!^F,=end,=else,=elsif,=rescue,=ensure,=when 39 40" Only define the function once. 41if exists("*GetErubyIndent") 42 finish 43endif 44 45" this file uses line continuations 46let s:cpo_sav = &cpo 47set cpo&vim 48 49function! GetErubyIndent(...) 50 " The value of a single shift-width 51 if exists('*shiftwidth') 52 let sw = shiftwidth() 53 else 54 let sw = &sw 55 endif 56 57 if a:0 && a:1 == '.' 58 let v:lnum = line('.') 59 elseif a:0 && a:1 =~ '^\d' 60 let v:lnum = a:1 61 endif 62 let vcol = col('.') 63 call cursor(v:lnum,1) 64 let inruby = searchpair('<%','','%>','W') 65 call cursor(v:lnum,vcol) 66 if inruby && getline(v:lnum) !~ '^<%\|^\s*[-=]\=%>' 67 let ind = GetRubyIndent(v:lnum) 68 else 69 exe "let ind = ".b:eruby_subtype_indentexpr 70 71 " Workaround for Andy Wokula's HTML indent. This should be removed after 72 " some time, since the newest version is fixed in a different way. 73 if b:eruby_subtype_indentexpr =~# '^HtmlIndent(' 74 \ && exists('b:indent') 75 \ && type(b:indent) == type({}) 76 \ && has_key(b:indent, 'lnum') 77 " Force HTML indent to not keep state 78 let b:indent.lnum = -1 79 endif 80 endif 81 let lnum = prevnonblank(v:lnum-1) 82 let line = getline(lnum) 83 let cline = getline(v:lnum) 84 if cline =~# '^\s*<%[-=]\=\s*\%(}\|end\|else\|\%(ensure\|rescue\|elsif\|when\).\{-\}\)\s*\%([-=]\=%>\|$\)' 85 let ind = ind - sw 86 endif 87 if line =~# '\S\s*<%[-=]\=\s*\%(}\|end\).\{-\}\s*\%([-=]\=%>\|$\)' 88 let ind = ind - sw 89 endif 90 if line =~# '\%({\|\<do\)\%(\s*|[^|]*|\)\=\s*[-=]\=%>' 91 let ind = ind + sw 92 elseif line =~# '<%[-=]\=\s*\%(module\|class\|def\|if\|for\|while\|until\|else\|elsif\|case\|when\|unless\|begin\|ensure\|rescue\)\>.*%>' 93 let ind = ind + sw 94 endif 95 if line =~# '^\s*<%[=#-]\=\s*$' && cline !~# '^\s*end\>' 96 let ind = ind + sw 97 endif 98 if line !~# '^\s*<%' && line =~# '%>\s*$' && line !~# '^\s*end\>' 99 \ && synID(v:lnum, match(cline, '\S') + 1, 1) != hlID('htmlEndTag') 100 let ind = ind - sw 101 endif 102 if cline =~# '^\s*[-=]\=%>\s*$' 103 let ind = ind - sw 104 endif 105 return ind 106endfunction 107 108let &cpo = s:cpo_sav 109unlet! s:cpo_sav 110 111" vim:set sw=2 sts=2 ts=8 noet: 112