blob: a4de118ccf1a7738273a25bf03ff414f1b81c14b [file] [log] [blame]
Bram Moolenaar1e015462005-09-25 22:16:38 +00001" Vim indent file
Bram Moolenaar9964e462007-05-05 17:54:07 +00002" Language: eRuby
Bram Moolenaar1d689522010-05-28 20:54:39 +02003" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
4" Last Change: 2010 May 28
Bram Moolenaarc6249bb2006-04-15 20:25:09 +00005" URL: http://vim-ruby.rubyforge.org
6" Anon CVS: See above site
7" Release Coordinator: Doug Kearns <dougkearns@gmail.com>
Bram Moolenaar1e015462005-09-25 22:16:38 +00008
Bram Moolenaar1e015462005-09-25 22:16:38 +00009if exists("b:did_indent")
10 finish
11endif
12
Bram Moolenaar9964e462007-05-05 17:54:07 +000013runtime! indent/ruby.vim
14unlet! b:did_indent
Bram Moolenaarc236c162008-07-13 17:41:49 +000015setlocal indentexpr=
Bram Moolenaarc6249bb2006-04-15 20:25:09 +000016
Bram Moolenaar2bb8df22007-05-10 17:26:28 +000017if exists("b:eruby_subtype")
18 exe "runtime! indent/".b:eruby_subtype.".vim"
19else
20 runtime! indent/html.vim
21endif
Bram Moolenaar9964e462007-05-05 17:54:07 +000022unlet! b:did_indent
23
Bram Moolenaar2bb8df22007-05-10 17:26:28 +000024if &l:indentexpr == ''
25 if &l:cindent
26 let &l:indentexpr = 'cindent(v:lnum)'
27 else
28 let &l:indentexpr = 'indent(prevnonblank(v:lnum-1))'
29 endif
30endif
31let b:eruby_subtype_indentexpr = &l:indentexpr
32
Bram Moolenaar9964e462007-05-05 17:54:07 +000033let b:did_indent = 1
34
Bram Moolenaar2bb8df22007-05-10 17:26:28 +000035setlocal indentexpr=GetErubyIndent()
Bram Moolenaar9964e462007-05-05 17:54:07 +000036setlocal indentkeys=o,O,*<Return>,<>>,{,},0),0],o,O,!^F,=end,=else,=elsif,=rescue,=ensure,=when
37
38" Only define the function once.
39if exists("*GetErubyIndent")
40 finish
41endif
42
Bram Moolenaarc236c162008-07-13 17:41:49 +000043function! GetErubyIndent(...)
44 if a:0 && a:1 == '.'
45 let v:lnum = line('.')
46 elseif a:0 && a:1 =~ '^\d'
47 let v:lnum = a:1
48 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +000049 let vcol = col('.')
Bram Moolenaar2bb8df22007-05-10 17:26:28 +000050 call cursor(v:lnum,1)
Bram Moolenaar3577c6f2008-06-24 21:16:56 +000051 let inruby = searchpair('<%','','%>','W')
Bram Moolenaar2bb8df22007-05-10 17:26:28 +000052 call cursor(v:lnum,vcol)
Bram Moolenaarc236c162008-07-13 17:41:49 +000053 if inruby && getline(v:lnum) !~ '^<%\|^\s*-\=%>'
Bram Moolenaar9964e462007-05-05 17:54:07 +000054 let ind = GetRubyIndent()
55 else
Bram Moolenaar2bb8df22007-05-10 17:26:28 +000056 exe "let ind = ".b:eruby_subtype_indentexpr
Bram Moolenaar9964e462007-05-05 17:54:07 +000057 endif
Bram Moolenaar2bb8df22007-05-10 17:26:28 +000058 let lnum = prevnonblank(v:lnum-1)
Bram Moolenaar9964e462007-05-05 17:54:07 +000059 let line = getline(lnum)
Bram Moolenaar2bb8df22007-05-10 17:26:28 +000060 let cline = getline(v:lnum)
Bram Moolenaar1d689522010-05-28 20:54:39 +020061 if cline =~# '^\s*<%-\=\s*\%(}\|end\|else\|\%(ensure\|rescue\|elsif\|when\).\{-\}\)\s*\%(-\=%>\|$\)'
62 let ind = ind - &sw
63 endif
64 if line =~# '\S\s*<%-\=\s*\%(}\|end\).\{-\}\s*\%(-\=%>\|$\)'
Bram Moolenaar9964e462007-05-05 17:54:07 +000065 let ind = ind - &sw
66 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +000067 if line =~# '\%({\|\<do\)\%(\s*|[^|]*|\)\=\s*-\=%>'
Bram Moolenaar9964e462007-05-05 17:54:07 +000068 let ind = ind + &sw
Bram Moolenaarc236c162008-07-13 17:41:49 +000069 elseif line =~# '<%-\=\s*\%(module\|class\|def\|if\|for\|while\|until\|else\|elsif\|case\|when\|unless\|begin\|ensure\|rescue\)\>.*%>'
Bram Moolenaar9964e462007-05-05 17:54:07 +000070 let ind = ind + &sw
71 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +000072 if line =~# '^\s*<%[=#-]\=\s*$' && cline !~# '^\s*end\>'
Bram Moolenaar9964e462007-05-05 17:54:07 +000073 let ind = ind + &sw
74 endif
75 if cline =~# '^\s*-\=%>\s*$'
76 let ind = ind - &sw
77 endif
78 return ind
79endfunction
80
Bram Moolenaar3577c6f2008-06-24 21:16:56 +000081" vim:set sw=2 sts=2 ts=8 noet: