xref: /vim-8.2.3635/runtime/indent/eiffel.vim (revision 2bf24176)
1" Vim indent file
2" Language:	Eiffel
3" Maintainer:	Jocelyn Fiat <[email protected]>
4" Previous-Maintainer:	David Clarke <[email protected]>
5" Contributions from: Thilo Six
6" $Date: 2004/12/09 21:33:52 $
7" $Revision: 1.3 $
8" URL: https://github.com/eiffelhub/vim-eiffel
9
10" Only load this indent file when no other was loaded.
11if exists("b:did_indent")
12  finish
13endif
14let b:did_indent = 1
15
16setlocal indentexpr=GetEiffelIndent()
17setlocal nolisp
18setlocal nosmartindent
19setlocal nocindent
20setlocal autoindent
21setlocal comments=:--
22setlocal indentkeys+==end,=else,=ensure,=require,=check,=loop,=until
23setlocal indentkeys+==creation,=feature,=inherit,=class,=is,=redefine,=rename,=variant
24setlocal indentkeys+==invariant,=do,=local,=export
25
26let b:undo_indent = "setl smartindent< indentkeys< indentexpr< autoindent< comments< "
27
28" Define some stuff
29" keywords grouped by indenting
30let s:trust_user_indent = '\(+\)\(\s*\(--\).*\)\=$'
31let s:relative_indent = '^\s*\(deferred\|class\|feature\|creation\|inherit\|loop\|from\|until\|if\|else\|elseif\|ensure\|require\|check\|do\|local\|invariant\|variant\|rename\|redefine\|do\|export\)\>'
32let s:outdent = '^\s*\(else\|invariant\|variant\|do\|require\|until\|loop\|local\)\>'
33let s:no_indent = '^\s*\(class\|feature\|creation\|inherit\)\>'
34let s:single_dent = '^[^-]\+[[:alnum:]]\+ is\(\s*\(--\).*\)\=$'
35let s:inheritance_dent = '\s*\(redefine\|rename\|export\)\>'
36
37
38" Only define the function once.
39if exists("*GetEiffelIndent")
40  finish
41endif
42
43let s:keepcpo= &cpo
44set cpo&vim
45
46function GetEiffelIndent()
47
48  " Eiffel Class indenting
49  "
50  " Find a non-blank line above the current line.
51  let lnum = prevnonblank(v:lnum - 1)
52
53  " At the start of the file use zero indent.
54  if lnum == 0
55    return 0
56  endif
57
58  " trust the user's indenting
59  if getline(lnum) =~ s:trust_user_indent
60    return -1
61  endif
62
63  " Add a 'shiftwidth' after lines that start with an indent word
64  let ind = indent(lnum)
65  if getline(lnum) =~ s:relative_indent
66    let ind = ind + &sw
67  endif
68
69  " Indent to single indent
70  if getline(v:lnum) =~ s:single_dent && getline(v:lnum) !~ s:relative_indent
71	   \ && getline(v:lnum) !~ '\s*\<\(and\|or\|implies\)\>'
72     let ind = &sw
73  endif
74
75  " Indent to double indent
76  if getline(v:lnum) =~ s:inheritance_dent
77     let ind = 2 * &sw
78  endif
79
80  " Indent line after the first line of the function definition
81  if getline(lnum) =~ s:single_dent
82     let ind = ind + &sw
83  endif
84
85  " The following should always be at the start of a line, no indenting
86  if getline(v:lnum) =~ s:no_indent
87     let ind = 0
88  endif
89
90  " Subtract a 'shiftwidth', if this isn't the first thing after the 'is'
91  " or first thing after the 'do'
92  if getline(v:lnum) =~ s:outdent && getline(v:lnum - 1) !~ s:single_dent
93	\ && getline(v:lnum - 1) !~ '^\s*do\>'
94    let ind = ind - &sw
95  endif
96
97  " Subtract a shiftwidth for end statements
98  if getline(v:lnum) =~ '^\s*end\>'
99    let ind = ind - &sw
100  endif
101
102  " set indent of zero end statements that are at an indent of 3, this should
103  " only ever be the class's end.
104  if getline(v:lnum) =~ '^\s*end\>' && ind == &sw
105    let ind = 0
106  endif
107
108  return ind
109endfunction
110
111let &cpo = s:keepcpo
112unlet s:keepcpo
113
114" vim:sw=2
115