| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | " Vim indent file | 
					
						
							| 
									
										
										
										
											2018-12-09 20:43:55 +01:00
										 |  |  | " Language:	    	Tcl | 
					
						
							|  |  |  | " Previous Maintainer:	Nikolai Weibull <now@bitwi.se> | 
					
						
							|  |  |  | " Latest Update:  	Chris Heithoff <chrisheithoff@gmail.com> | 
					
						
							|  |  |  | " Latest Revision:  	2018-12-05 | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | if exists("b:did_indent") | 
					
						
							|  |  |  |   finish | 
					
						
							|  |  |  | endif | 
					
						
							|  |  |  | let b:did_indent = 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | setlocal indentexpr=GetTclIndent() | 
					
						
							| 
									
										
										
										
											2005-06-29 22:40:58 +00:00
										 |  |  | setlocal indentkeys=0{,0},!^F,o,O,0] | 
					
						
							| 
									
										
										
										
											2007-05-10 18:19:11 +00:00
										 |  |  | setlocal nosmartindent | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | if exists("*GetTclIndent") | 
					
						
							|  |  |  |   finish | 
					
						
							|  |  |  | endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-06-29 22:40:58 +00:00
										 |  |  | function s:prevnonblanknoncomment(lnum) | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  |   let lnum = prevnonblank(a:lnum) | 
					
						
							|  |  |  |   while lnum > 0 | 
					
						
							|  |  |  |     let line = getline(lnum) | 
					
						
							|  |  |  |     if line !~ '^\s*\(#\|$\)' | 
					
						
							|  |  |  |       break | 
					
						
							|  |  |  |     endif | 
					
						
							|  |  |  |     let lnum = prevnonblank(lnum - 1) | 
					
						
							|  |  |  |   endwhile | 
					
						
							|  |  |  |   return lnum | 
					
						
							|  |  |  | endfunction | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-09 20:43:55 +01:00
										 |  |  | function s:ends_with_backslash(lnum) | 
					
						
							|  |  |  |   let line = getline(a:lnum) | 
					
						
							|  |  |  |   if line =~ '\\\s*$' | 
					
						
							|  |  |  |     return 1 | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     return 0 | 
					
						
							|  |  |  |   endif | 
					
						
							|  |  |  | endfunction  | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-06-29 22:40:58 +00:00
										 |  |  | function s:count_braces(lnum, count_open) | 
					
						
							|  |  |  |   let n_open = 0 | 
					
						
							|  |  |  |   let n_close = 0 | 
					
						
							|  |  |  |   let line = getline(a:lnum) | 
					
						
							| 
									
										
										
										
											2005-07-04 22:49:24 +00:00
										 |  |  |   let pattern = '[{}]' | 
					
						
							| 
									
										
										
										
											2005-06-29 22:40:58 +00:00
										 |  |  |   let i = match(line, pattern) | 
					
						
							|  |  |  |   while i != -1 | 
					
						
							| 
									
										
										
										
											2005-07-04 22:49:24 +00:00
										 |  |  |     if synIDattr(synID(a:lnum, i + 1, 0), 'name') !~ 'tcl\%(Comment\|String\)' | 
					
						
							| 
									
										
										
										
											2005-06-29 22:40:58 +00:00
										 |  |  |       if line[i] == '{' | 
					
						
							| 
									
										
										
										
											2007-05-10 18:19:11 +00:00
										 |  |  |         let n_open += 1 | 
					
						
							| 
									
										
										
										
											2005-06-29 22:40:58 +00:00
										 |  |  |       elseif line[i] == '}' | 
					
						
							| 
									
										
										
										
											2007-05-10 18:19:11 +00:00
										 |  |  |         if n_open > 0 | 
					
						
							|  |  |  |           let n_open -= 1 | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |           let n_close += 1 | 
					
						
							|  |  |  |         endif | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  |       endif | 
					
						
							|  |  |  |     endif | 
					
						
							| 
									
										
										
										
											2005-06-29 22:40:58 +00:00
										 |  |  |     let i = match(line, pattern, i + 1) | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  |   endwhile | 
					
						
							| 
									
										
										
										
											2005-06-29 22:40:58 +00:00
										 |  |  |   return a:count_open ? n_open : n_close | 
					
						
							|  |  |  | endfunction | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-06-29 22:40:58 +00:00
										 |  |  | function GetTclIndent() | 
					
						
							| 
									
										
										
										
											2005-07-04 22:49:24 +00:00
										 |  |  |   let line = getline(v:lnum) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-09 20:43:55 +01:00
										 |  |  |   " Get the line number of the previous non-blank or non-comment line. | 
					
						
							| 
									
										
										
										
											2005-06-29 22:40:58 +00:00
										 |  |  |   let pnum = s:prevnonblanknoncomment(v:lnum - 1) | 
					
						
							|  |  |  |   if pnum == 0 | 
					
						
							|  |  |  |     return 0 | 
					
						
							|  |  |  |   endif | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-09 20:43:55 +01:00
										 |  |  |   " ..and the previous line before the previous line. | 
					
						
							|  |  |  |   let pnum2 = s:prevnonblanknoncomment(pnum-1) | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-09 20:43:55 +01:00
										 |  |  |   " Default indentation is to preserve the previous indentation. | 
					
						
							|  |  |  |   let ind = indent(pnum) | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |   " ...but if previous line introduces an open brace, then increase current line's indentation | 
					
						
							|  |  |  |   if s:count_braces(pnum, 1) > 0 | 
					
						
							|  |  |  |     let ind += shiftwidth() | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     " Look for backslash line continuation on the previous two lines. | 
					
						
							|  |  |  |     let slash1 = s:ends_with_backslash(pnum) | 
					
						
							|  |  |  |     let slash2 = s:ends_with_backslash(pnum2) | 
					
						
							|  |  |  |     if slash1 && !slash2 | 
					
						
							|  |  |  |       " If the previous line begins a line continuation. | 
					
						
							|  |  |  |       let ind += shiftwidth() | 
					
						
							|  |  |  |     elseif !slash1 && slash2 | 
					
						
							|  |  |  |       " If two lines ago was the end of a line continuation group of lines. | 
					
						
							|  |  |  |       let ind -= shiftwidth() | 
					
						
							|  |  |  |     endif | 
					
						
							| 
									
										
										
										
											2005-06-29 22:40:58 +00:00
										 |  |  |   endif | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-09 20:43:55 +01:00
										 |  |  |   " If the current line begins with a closed brace, then decrease the indentation by one. | 
					
						
							|  |  |  |   if line =~ '^\s*}' | 
					
						
							|  |  |  |     let ind -= shiftwidth() | 
					
						
							|  |  |  |   endif | 
					
						
							|  |  |  |    | 
					
						
							| 
									
										
										
										
											2005-07-04 22:49:24 +00:00
										 |  |  |   return ind | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | endfunction |