xref: /vim-8.2.3635/runtime/indent/eruby.vim (revision d09091d4)
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