| 
									
										
										
										
											2012-05-18 13:46:39 +02:00
										 |  |  | " Vim indent file | 
					
						
							|  |  |  | " Language:	Zimbu | 
					
						
							|  |  |  | " Maintainer:	Bram Moolenaar <Bram@vim.org> | 
					
						
							| 
									
										
										
										
											2016-01-28 22:38:53 +01:00
										 |  |  | " Last Change:	2016 Jan 25 | 
					
						
							| 
									
										
										
										
											2012-05-18 13:46:39 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | " Only load this indent file when no other was loaded. | 
					
						
							|  |  |  | if exists("b:did_indent") | 
					
						
							|  |  |  |    finish | 
					
						
							|  |  |  | endif | 
					
						
							|  |  |  | let b:did_indent = 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | setlocal ai nolisp nocin | 
					
						
							|  |  |  | setlocal indentexpr=GetZimbuIndent(v:lnum) | 
					
						
							|  |  |  | setlocal indentkeys=0{,0},!^F,o,O,0=ELSE,0=ELSEIF,0=CASE,0=DEFAULT,0=FINALLY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | " We impose recommended defaults: no Tabs, 'shiftwidth' = 2 | 
					
						
							|  |  |  | setlocal sw=2 et | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-18 21:49:28 +02:00
										 |  |  | let b:undo_indent = "setl et< sw< ai< indentkeys< indentexpr=" | 
					
						
							| 
									
										
										
										
											2012-05-18 13:46:39 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | " Only define the function once. | 
					
						
							|  |  |  | if exists("*GetZimbuIndent") | 
					
						
							|  |  |  |   finish | 
					
						
							|  |  |  | endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-18 21:49:28 +02:00
										 |  |  | let s:cpo_save = &cpo | 
					
						
							|  |  |  | set cpo&vim | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-18 13:46:39 +02:00
										 |  |  | " Come here when loading the script the first time. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | let s:maxoff = 50	" maximum number of lines to look backwards for () | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func GetZimbuIndent(lnum) | 
					
						
							|  |  |  |   let prevLnum = prevnonblank(a:lnum - 1) | 
					
						
							|  |  |  |   if prevLnum == 0 | 
					
						
							|  |  |  |     " This is the first non-empty line, use zero indent. | 
					
						
							|  |  |  |     return 0 | 
					
						
							|  |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " Taken from Python indenting: | 
					
						
							|  |  |  |   " If the previous line is inside parenthesis, use the indent of the starting | 
					
						
							|  |  |  |   " line. | 
					
						
							|  |  |  |   " Trick: use the non-existing "dummy" variable to break out of the loop when | 
					
						
							|  |  |  |   " going too far back. | 
					
						
							|  |  |  |   call cursor(prevLnum, 1) | 
					
						
							|  |  |  |   let parlnum = searchpair('(\|{\|\[', '', ')\|}\|\]', 'nbW', | 
					
						
							|  |  |  | 	  \ "line('.') < " . (prevLnum - s:maxoff) . " ? dummy :" | 
					
						
							|  |  |  | 	  \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')" | 
					
						
							|  |  |  | 	  \ . " =~ '\\(Comment\\|String\\|Char\\)$'") | 
					
						
							|  |  |  |   if parlnum > 0 | 
					
						
							|  |  |  |     let plindent = indent(parlnum) | 
					
						
							|  |  |  |     let plnumstart = parlnum | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     let plindent = indent(prevLnum) | 
					
						
							|  |  |  |     let plnumstart = prevLnum | 
					
						
							|  |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " When inside parenthesis: If at the first line below the parenthesis add | 
					
						
							|  |  |  |   " two 'shiftwidth', otherwise same as previous line. | 
					
						
							|  |  |  |   " i = (a | 
					
						
							|  |  |  |   "       + b | 
					
						
							|  |  |  |   "       + c) | 
					
						
							|  |  |  |   call cursor(a:lnum, 1) | 
					
						
							|  |  |  |   let p = searchpair('(\|{\|\[', '', ')\|}\|\]', 'bW', | 
					
						
							|  |  |  | 	  \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :" | 
					
						
							|  |  |  | 	  \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')" | 
					
						
							|  |  |  | 	  \ . " =~ '\\(Comment\\|String\\|Char\\)$'") | 
					
						
							|  |  |  |   if p > 0 | 
					
						
							|  |  |  |     if p == prevLnum | 
					
						
							|  |  |  |       " When the start is inside parenthesis, only indent one 'shiftwidth'. | 
					
						
							|  |  |  |       let pp = searchpair('(\|{\|\[', '', ')\|}\|\]', 'bW', | 
					
						
							|  |  |  | 	  \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :" | 
					
						
							|  |  |  | 	  \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')" | 
					
						
							|  |  |  | 	  \ . " =~ '\\(Comment\\|String\\|Char\\)$'") | 
					
						
							|  |  |  |       if pp > 0 | 
					
						
							| 
									
										
										
										
											2016-01-28 22:38:53 +01:00
										 |  |  | 	return indent(prevLnum) + shiftwidth() | 
					
						
							| 
									
										
										
										
											2012-05-18 13:46:39 +02:00
										 |  |  |       endif | 
					
						
							| 
									
										
										
										
											2016-01-28 22:38:53 +01:00
										 |  |  |       return indent(prevLnum) + shiftwidth() * 2 | 
					
						
							| 
									
										
										
										
											2012-05-18 13:46:39 +02:00
										 |  |  |     endif | 
					
						
							|  |  |  |     if plnumstart == p | 
					
						
							|  |  |  |       return indent(prevLnum) | 
					
						
							|  |  |  |     endif | 
					
						
							|  |  |  |     return plindent | 
					
						
							|  |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   let prevline = getline(prevLnum) | 
					
						
							|  |  |  |   let thisline = getline(a:lnum) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " If this line is not a comment and the previous one is then move the | 
					
						
							|  |  |  |   " previous line further back. | 
					
						
							|  |  |  |   if thisline !~ '^\s*#' | 
					
						
							|  |  |  |     while prevline =~ '^\s*#' | 
					
						
							|  |  |  |       let prevLnum = prevnonblank(prevLnum - 1) | 
					
						
							|  |  |  |       if prevLnum == 0 | 
					
						
							|  |  |  | 	" Only comment lines before this, no indent | 
					
						
							|  |  |  | 	return 0 | 
					
						
							|  |  |  |       endif | 
					
						
							|  |  |  |       let prevline = getline(prevLnum) | 
					
						
							|  |  |  |       let plindent = indent(prevLnum) | 
					
						
							|  |  |  |     endwhile | 
					
						
							|  |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-21 14:54:30 +02:00
										 |  |  |   if prevline =~ '^\s*\(IF\|\|ELSEIF\|ELSE\|GENERATE_IF\|\|GENERATE_ELSEIF\|GENERATE_ELSE\|WHILE\|REPEAT\|TRY\|CATCH\|FINALLY\|FOR\|DO\|SWITCH\|CASE\|DEFAULT\|FUNC\|VIRTUAL\|ABSTRACT\|DEFINE\|REPLACE\|FINAL\|PROC\|MAIN\|NEW\|ENUM\|CLASS\|INTERFACE\|BITS\|MODULE\|SHARED\)\>' | 
					
						
							| 
									
										
										
										
											2016-01-28 22:38:53 +01:00
										 |  |  |     let plindent += shiftwidth() | 
					
						
							| 
									
										
										
										
											2012-05-18 13:46:39 +02:00
										 |  |  |   endif | 
					
						
							|  |  |  |   if thisline =~ '^\s*\(}\|ELSEIF\>\|ELSE\>\|CATCH\|FINALLY\|GENERATE_ELSEIF\>\|GENERATE_ELSE\>\|UNTIL\>\)' | 
					
						
							| 
									
										
										
										
											2016-01-28 22:38:53 +01:00
										 |  |  |     let plindent -= shiftwidth() | 
					
						
							| 
									
										
										
										
											2012-05-18 13:46:39 +02:00
										 |  |  |   endif | 
					
						
							|  |  |  |   if thisline =~ '^\s*\(CASE\>\|DEFAULT\>\)' && prevline !~ '^\s*SWITCH\>' | 
					
						
							| 
									
										
										
										
											2016-01-28 22:38:53 +01:00
										 |  |  |     let plindent -= shiftwidth() | 
					
						
							| 
									
										
										
										
											2012-05-18 13:46:39 +02:00
										 |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " line up continued comment that started after some code | 
					
						
							|  |  |  |   "   String something   # comment comment | 
					
						
							|  |  |  |   "                      # comment | 
					
						
							|  |  |  |   if a:lnum == prevLnum + 1 && thisline =~ '^\s*#' && prevline !~ '^\s*#' | 
					
						
							|  |  |  |     let n = match(prevline, '#') | 
					
						
							|  |  |  |     if n > 1 | 
					
						
							|  |  |  |       let plindent = n | 
					
						
							|  |  |  |     endif | 
					
						
							|  |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return plindent | 
					
						
							|  |  |  | endfunc | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-18 21:49:28 +02:00
										 |  |  | let &cpo = s:cpo_save | 
					
						
							|  |  |  | unlet s:cpo_save |