| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | " Vim indent file | 
					
						
							|  |  |  | " Language:	Eiffel | 
					
						
							| 
									
										
										
										
											2012-06-01 22:38:45 +02:00
										 |  |  | " Maintainer:	Jocelyn Fiat <jfiat@eiffel.com> | 
					
						
							| 
									
										
										
										
											2004-10-07 21:02:47 +00:00
										 |  |  | " Previous-Maintainer:	David Clarke <gadicath@dishevelled.net> | 
					
						
							| 
									
										
										
										
											2017-03-16 17:41:02 +01:00
										 |  |  | " Contributions from: Takuya Fujiwara | 
					
						
							| 
									
										
										
										
											2012-06-01 22:38:45 +02:00
										 |  |  | " Contributions from: Thilo Six | 
					
						
							| 
									
										
										
										
											2017-03-16 17:41:02 +01:00
										 |  |  | " $Date: 2017/03/08 06:00:00 $ | 
					
						
							|  |  |  | " $Revision: 1.4 $ | 
					
						
							| 
									
										
										
										
											2012-06-01 22:38:45 +02:00
										 |  |  | " URL: https://github.com/eiffelhub/vim-eiffel | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | " Only load this indent file when no other was loaded. | 
					
						
							|  |  |  | if exists("b:did_indent") | 
					
						
							|  |  |  |   finish | 
					
						
							|  |  |  | endif | 
					
						
							|  |  |  | let b:did_indent = 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | setlocal indentexpr=GetEiffelIndent() | 
					
						
							|  |  |  | setlocal nolisp | 
					
						
							|  |  |  | setlocal nosmartindent | 
					
						
							|  |  |  | setlocal nocindent | 
					
						
							|  |  |  | setlocal autoindent | 
					
						
							|  |  |  | setlocal comments=:-- | 
					
						
							|  |  |  | setlocal indentkeys+==end,=else,=ensure,=require,=check,=loop,=until | 
					
						
							|  |  |  | setlocal indentkeys+==creation,=feature,=inherit,=class,=is,=redefine,=rename,=variant | 
					
						
							|  |  |  | setlocal indentkeys+==invariant,=do,=local,=export | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-01 22:38:45 +02:00
										 |  |  | let b:undo_indent = "setl smartindent< indentkeys< indentexpr< autoindent< comments< " | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | " Define some stuff | 
					
						
							|  |  |  | " keywords grouped by indenting | 
					
						
							|  |  |  | let s:trust_user_indent = '\(+\)\(\s*\(--\).*\)\=$' | 
					
						
							| 
									
										
										
										
											2017-03-16 17:41:02 +01:00
										 |  |  | let s:relative_indent = '^\s*\(deferred\|class\|feature\|creation\|inherit\|loop\|from\|across\|until\|if\|else\|elseif\|ensure\|require\|check\|do\|local\|invariant\|variant\|rename\|redefine\|do\|export\)\>' | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | let s:outdent = '^\s*\(else\|invariant\|variant\|do\|require\|until\|loop\|local\)\>' | 
					
						
							|  |  |  | let s:no_indent = '^\s*\(class\|feature\|creation\|inherit\)\>' | 
					
						
							|  |  |  | let s:single_dent = '^[^-]\+[[:alnum:]]\+ is\(\s*\(--\).*\)\=$' | 
					
						
							|  |  |  | let s:inheritance_dent = '\s*\(redefine\|rename\|export\)\>' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | " Only define the function once. | 
					
						
							|  |  |  | if exists("*GetEiffelIndent") | 
					
						
							|  |  |  |   finish | 
					
						
							|  |  |  | endif | 
					
						
							| 
									
										
										
										
											2012-06-01 22:38:45 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-18 21:49:28 +02:00
										 |  |  | let s:keepcpo= &cpo | 
					
						
							|  |  |  | set cpo&vim | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | function GetEiffelIndent() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " Eiffel Class indenting | 
					
						
							|  |  |  |   " | 
					
						
							|  |  |  |   " Find a non-blank line above the current line. | 
					
						
							|  |  |  |   let lnum = prevnonblank(v:lnum - 1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " At the start of the file use zero indent. | 
					
						
							|  |  |  |   if lnum == 0 | 
					
						
							|  |  |  |     return 0 | 
					
						
							|  |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " trust the user's indenting | 
					
						
							|  |  |  |   if getline(lnum) =~ s:trust_user_indent | 
					
						
							|  |  |  |     return -1 | 
					
						
							|  |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " Add a 'shiftwidth' after lines that start with an indent word | 
					
						
							|  |  |  |   let ind = indent(lnum) | 
					
						
							|  |  |  |   if getline(lnum) =~ s:relative_indent | 
					
						
							| 
									
										
										
										
											2017-03-16 17:41:02 +01:00
										 |  |  |     let ind = ind + shiftwidth() | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " Indent to single indent | 
					
						
							|  |  |  |   if getline(v:lnum) =~ s:single_dent && getline(v:lnum) !~ s:relative_indent | 
					
						
							|  |  |  | 	   \ && getline(v:lnum) !~ '\s*\<\(and\|or\|implies\)\>' | 
					
						
							| 
									
										
										
										
											2017-03-16 17:41:02 +01:00
										 |  |  |      let ind = shiftwidth() | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " Indent to double indent | 
					
						
							|  |  |  |   if getline(v:lnum) =~ s:inheritance_dent | 
					
						
							| 
									
										
										
										
											2017-03-16 17:41:02 +01:00
										 |  |  |      let ind = 2 * shiftwidth() | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " Indent line after the first line of the function definition | 
					
						
							|  |  |  |   if getline(lnum) =~ s:single_dent | 
					
						
							| 
									
										
										
										
											2017-03-16 17:41:02 +01:00
										 |  |  |      let ind = ind + shiftwidth() | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " The following should always be at the start of a line, no indenting | 
					
						
							|  |  |  |   if getline(v:lnum) =~ s:no_indent | 
					
						
							|  |  |  |      let ind = 0 | 
					
						
							|  |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " Subtract a 'shiftwidth', if this isn't the first thing after the 'is' | 
					
						
							|  |  |  |   " or first thing after the 'do' | 
					
						
							|  |  |  |   if getline(v:lnum) =~ s:outdent && getline(v:lnum - 1) !~ s:single_dent | 
					
						
							|  |  |  | 	\ && getline(v:lnum - 1) !~ '^\s*do\>' | 
					
						
							| 
									
										
										
										
											2017-03-16 17:41:02 +01:00
										 |  |  |     let ind = ind - shiftwidth() | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " Subtract a shiftwidth for end statements | 
					
						
							|  |  |  |   if getline(v:lnum) =~ '^\s*end\>' | 
					
						
							| 
									
										
										
										
											2017-03-16 17:41:02 +01:00
										 |  |  |     let ind = ind - shiftwidth() | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " set indent of zero end statements that are at an indent of 3, this should | 
					
						
							|  |  |  |   " only ever be the class's end. | 
					
						
							| 
									
										
										
										
											2017-03-16 17:41:02 +01:00
										 |  |  |   if getline(v:lnum) =~ '^\s*end\>' && ind == shiftwidth() | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  |     let ind = 0 | 
					
						
							|  |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return ind | 
					
						
							|  |  |  | endfunction | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-18 21:49:28 +02:00
										 |  |  | let &cpo = s:keepcpo | 
					
						
							|  |  |  | unlet s:keepcpo | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | " vim:sw=2 |