| 
									
										
										
										
											2006-01-30 00:14:18 +00:00
										 |  |  | " VHDL indent ('93 syntax) | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  | " Language:    VHDL | 
					
						
							|  |  |  | " Maintainer:  Gerald Lai <laigera+vim?gmail.com> | 
					
						
							| 
									
										
										
										
											2010-07-11 16:58:51 +02:00
										 |  |  | " Version:     1.56 | 
					
						
							|  |  |  | " Last Change: 2010 Jun 29 | 
					
						
							| 
									
										
										
										
											2006-01-30 00:14:18 +00:00
										 |  |  | " URL:         http://www.vim.org/scripts/script.php?script_id=1450 | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | " only load this indent file when no other was loaded | 
					
						
							|  |  |  | if exists("b:did_indent") | 
					
						
							|  |  |  |   finish | 
					
						
							|  |  |  | endif | 
					
						
							|  |  |  | let b:did_indent = 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | " setup indent options for local VHDL buffer | 
					
						
							|  |  |  | setlocal indentexpr=GetVHDLindent() | 
					
						
							| 
									
										
										
										
											2007-05-05 17:54:07 +00:00
										 |  |  | setlocal indentkeys=!^F,o,O,0(,0) | 
					
						
							|  |  |  | setlocal indentkeys+==~begin,=~end\ ,=~end\	,=~is,=~select,=~when | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  | setlocal indentkeys+==~if,=~then,=~elsif,=~else | 
					
						
							| 
									
										
										
										
											2007-05-05 17:54:07 +00:00
										 |  |  | setlocal indentkeys+==~case,=~loop,=~for,=~generate,=~record,=~units,=~process,=~block,=~function,=~component,=~procedure | 
					
						
							|  |  |  | setlocal indentkeys+==~architecture,=~configuration,=~entity,=~package | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | " constants | 
					
						
							|  |  |  | " not a comment | 
					
						
							|  |  |  | let s:NC = '\%(--.*\)\@<!' | 
					
						
							|  |  |  | " end of string | 
					
						
							|  |  |  | let s:ES = '\s*\%(--.*\)\=$' | 
					
						
							|  |  |  | " no "end" keyword in front | 
					
						
							|  |  |  | let s:NE = '\%(\<end\s\+\)\@<!' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-05-05 17:54:07 +00:00
										 |  |  | " option to disable alignment of generic/port mappings | 
					
						
							| 
									
										
										
										
											2008-06-24 20:39:31 +00:00
										 |  |  | if !exists("g:vhdl_indent_genportmap") | 
					
						
							|  |  |  |   let g:vhdl_indent_genportmap = 1 | 
					
						
							| 
									
										
										
										
											2007-05-05 17:54:07 +00:00
										 |  |  | endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | " option to disable alignment of right-hand side assignment "<=" statements | 
					
						
							| 
									
										
										
										
											2008-06-24 20:39:31 +00:00
										 |  |  | if !exists("g:vhdl_indent_rhsassign") | 
					
						
							|  |  |  |   let g:vhdl_indent_rhsassign = 1 | 
					
						
							| 
									
										
										
										
											2007-05-05 17:54:07 +00:00
										 |  |  | endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  | " only define indent function once | 
					
						
							|  |  |  | if exists("*GetVHDLindent") | 
					
						
							|  |  |  |   finish | 
					
						
							|  |  |  | endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function GetVHDLindent() | 
					
						
							|  |  |  |   " store current line & string | 
					
						
							|  |  |  |   let curn = v:lnum | 
					
						
							|  |  |  |   let curs = getline(curn) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " find previous line that is not a comment | 
					
						
							|  |  |  |   let prevn = prevnonblank(curn - 1) | 
					
						
							|  |  |  |   let prevs = getline(prevn) | 
					
						
							|  |  |  |   while prevn > 0 && prevs =~ '^\s*--' | 
					
						
							|  |  |  |     let prevn = prevnonblank(prevn - 1) | 
					
						
							|  |  |  |     let prevs = getline(prevn) | 
					
						
							|  |  |  |   endwhile | 
					
						
							| 
									
										
										
										
											2008-06-24 20:39:31 +00:00
										 |  |  |   let prevs_noi = substitute(prevs, '^\s*', '', '') | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   " default indent starts as previous non-comment line's indent | 
					
						
							|  |  |  |   let ind = prevn > 0 ? indent(prevn) : 0 | 
					
						
							|  |  |  |   " backup default | 
					
						
							|  |  |  |   let ind2 = ind | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-30 00:14:18 +00:00
										 |  |  |   " indent:   special; kill string so it would not affect other filters | 
					
						
							|  |  |  |   " keywords: "report" + string | 
					
						
							|  |  |  |   " where:    anywhere in current or previous line | 
					
						
							|  |  |  |   let s0 = s:NC.'\<report\>\s*".*"' | 
					
						
							|  |  |  |   if curs =~? s0 | 
					
						
							|  |  |  |     let curs = "" | 
					
						
							|  |  |  |   endif | 
					
						
							|  |  |  |   if prevs =~? s0 | 
					
						
							|  |  |  |     let prevs = "" | 
					
						
							|  |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |   " indent:   previous line's comment position, otherwise follow next non-comment line if possible | 
					
						
							|  |  |  |   " keyword:  "--" | 
					
						
							|  |  |  |   " where:    start of current line | 
					
						
							|  |  |  |   if curs =~ '^\s*--' | 
					
						
							|  |  |  |     let pn = curn - 1 | 
					
						
							|  |  |  |     let ps = getline(pn) | 
					
						
							| 
									
										
										
										
											2008-06-24 20:39:31 +00:00
										 |  |  |     if curs =~ '^\s*--\s' && ps =~ '--' | 
					
						
							|  |  |  |       return indent(pn) + stridx(substitute(ps, '^\s*', '', ''), '--') | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |     else | 
					
						
							|  |  |  |       " find nextnonblank line that is not a comment | 
					
						
							|  |  |  |       let nn = nextnonblank(curn + 1) | 
					
						
							|  |  |  |       let ns = getline(nn) | 
					
						
							|  |  |  |       while nn > 0 && ns =~ '^\s*--' | 
					
						
							|  |  |  |         let nn = nextnonblank(nn + 1) | 
					
						
							|  |  |  |         let ns = getline(nn) | 
					
						
							|  |  |  |       endwhile | 
					
						
							|  |  |  |       let n = indent(nn) | 
					
						
							|  |  |  |       return n != -1 ? n : ind | 
					
						
							|  |  |  |     endif | 
					
						
							|  |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " **************************************************************************************** | 
					
						
							|  |  |  |   " indent:   align generic variables & port names | 
					
						
							|  |  |  |   " keywords: "generic", "map", "port" + "(", provided current line is part of mapping | 
					
						
							|  |  |  |   " where:    anywhere in previous 2 lines | 
					
						
							|  |  |  |   " find following previous non-comment line | 
					
						
							|  |  |  |   let pn = prevnonblank(prevn - 1) | 
					
						
							|  |  |  |   let ps = getline(pn) | 
					
						
							|  |  |  |   while pn > 0 && ps =~ '^\s*--' | 
					
						
							|  |  |  |     let pn = prevnonblank(pn - 1) | 
					
						
							|  |  |  |     let ps = getline(pn) | 
					
						
							|  |  |  |   endwhile | 
					
						
							| 
									
										
										
										
											2006-02-01 21:47:16 +00:00
										 |  |  |   if (curs =~ '^\s*)' || curs =~? '^\s*\%(\<\%(generic\|map\|port\)\>.*\)\@<!\S\+\s*\%(=>\s*\S\+\|:[^=]\@=\s*\%(\%(in\|out\|inout\|buffer\|linkage\)\>\|\w\+\s\+:=\)\)') && (prevs =~? s:NC.'\<\%(generic\|map\|port\)\s*(\%(\s*\w\)\=' || (ps =~? s:NC.'\<\%(generic\|map\|port\)'.s:ES && prevs =~ '^\s*(')) | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |     " align closing ")" with opening "(" | 
					
						
							|  |  |  |     if curs =~ '^\s*)' | 
					
						
							| 
									
										
										
										
											2008-06-24 20:39:31 +00:00
										 |  |  |       return ind2 + stridx(prevs_noi, '(') | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |     endif | 
					
						
							| 
									
										
										
										
											2008-06-24 20:39:31 +00:00
										 |  |  |     let m = matchend(prevs_noi, '(\s*\ze\w') | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |     if m != -1 | 
					
						
							| 
									
										
										
										
											2008-06-24 20:39:31 +00:00
										 |  |  |       return ind2 + m | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2008-06-24 20:39:31 +00:00
										 |  |  |       if g:vhdl_indent_genportmap | 
					
						
							|  |  |  |         return ind2 + stridx(prevs_noi, '(') + &sw | 
					
						
							| 
									
										
										
										
											2007-05-05 17:54:07 +00:00
										 |  |  |       else | 
					
						
							|  |  |  |         return ind2 + &sw | 
					
						
							|  |  |  |       endif | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |     endif | 
					
						
							|  |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " indent:   align conditional/select statement | 
					
						
							| 
									
										
										
										
											2006-01-30 00:14:18 +00:00
										 |  |  |   " keywords: variable + "<=" without ";" ending | 
					
						
							|  |  |  |   " where:    start of previous line | 
					
						
							|  |  |  |   if prevs =~? '^\s*\S\+\s*<=[^;]*'.s:ES | 
					
						
							| 
									
										
										
										
											2008-06-24 20:39:31 +00:00
										 |  |  |     if g:vhdl_indent_rhsassign | 
					
						
							|  |  |  |       return ind2 + matchend(prevs_noi, '<=\s*\ze.') | 
					
						
							| 
									
										
										
										
											2007-05-05 17:54:07 +00:00
										 |  |  |     else | 
					
						
							|  |  |  |       return ind2 + &sw | 
					
						
							|  |  |  |     endif | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " indent:   backtrace previous non-comment lines for next smaller or equal size indent | 
					
						
							|  |  |  |   " keywords: "end" + "record", "units" | 
					
						
							|  |  |  |   " where:    start of previous line | 
					
						
							|  |  |  |   " keyword:  ")" | 
					
						
							|  |  |  |   " where:    start of previous line | 
					
						
							|  |  |  |   " keyword:  without "<=" + ";" ending | 
					
						
							|  |  |  |   " where:    anywhere in previous line | 
					
						
							|  |  |  |   " keyword:  "=>" + ")" ending, provided current line does not begin with ")" | 
					
						
							|  |  |  |   " where:    anywhere in previous line | 
					
						
							|  |  |  |   " _note_:   indent allowed to leave this filter | 
					
						
							|  |  |  |   let m = 0 | 
					
						
							|  |  |  |   if prevs =~? '^\s*end\s\+\%(record\|units\)\>' | 
					
						
							|  |  |  |     let m = 3 | 
					
						
							|  |  |  |   elseif prevs =~ '^\s*)' | 
					
						
							|  |  |  |     let m = 1 | 
					
						
							|  |  |  |   elseif prevs =~ s:NC.'\%(<=.*\)\@<!;'.s:ES || (curs !~ '^\s*)' && prevs =~ s:NC.'=>.*'.s:NC.')'.s:ES) | 
					
						
							|  |  |  |     let m = 2 | 
					
						
							|  |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if m > 0 | 
					
						
							|  |  |  |     let pn = prevnonblank(prevn - 1) | 
					
						
							|  |  |  |     let ps = getline(pn) | 
					
						
							|  |  |  |     while pn > 0 | 
					
						
							|  |  |  |       let t = indent(pn) | 
					
						
							| 
									
										
										
										
											2010-07-02 20:20:09 +02:00
										 |  |  |       if ps !~ '^\s*--' && (t < ind || (t == ind && m == 3)) | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |         " make sure one of these is true | 
					
						
							| 
									
										
										
										
											2006-01-30 00:14:18 +00:00
										 |  |  |         " keywords: variable + "<=" without ";" ending | 
					
						
							|  |  |  |         " where:    start of previous non-comment line | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |         " keywords: "generic", "map", "port" | 
					
						
							|  |  |  |         " where:    anywhere in previous non-comment line | 
					
						
							|  |  |  |         " keyword:  "(" | 
					
						
							|  |  |  |         " where:    start of previous non-comment line | 
					
						
							| 
									
										
										
										
											2006-01-30 00:14:18 +00:00
										 |  |  |         if m < 3 && ps !~? '^\s*\S\+\s*<=[^;]*'.s:ES | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |           if ps =~? s:NC.'\<\%(generic\|map\|port\)\>' || ps =~ '^\s*(' | 
					
						
							|  |  |  |             let ind = t | 
					
						
							|  |  |  |           endif | 
					
						
							|  |  |  |           break | 
					
						
							|  |  |  |         endif | 
					
						
							|  |  |  |         let ind = t | 
					
						
							|  |  |  |         if m > 1 | 
					
						
							|  |  |  |           " find following previous non-comment line | 
					
						
							|  |  |  |           let ppn = prevnonblank(pn - 1) | 
					
						
							|  |  |  |           let pps = getline(ppn) | 
					
						
							|  |  |  |           while ppn > 0 && pps =~ '^\s*--' | 
					
						
							|  |  |  |             let ppn = prevnonblank(ppn - 1) | 
					
						
							|  |  |  |             let pps = getline(ppn) | 
					
						
							|  |  |  |           endwhile | 
					
						
							|  |  |  |           " indent:   follow | 
					
						
							|  |  |  |           " keyword:  "select" | 
					
						
							|  |  |  |           " where:    end of following previous non-comment line | 
					
						
							|  |  |  |           " keyword:  "type" | 
					
						
							|  |  |  |           " where:    start of following previous non-comment line | 
					
						
							|  |  |  |           if m == 2 | 
					
						
							|  |  |  |             let s1 = s:NC.'\<select'.s:ES | 
					
						
							|  |  |  |             if ps !~? s1 && pps =~? s1 | 
					
						
							|  |  |  |               let ind = indent(ppn) | 
					
						
							|  |  |  |             endif | 
					
						
							|  |  |  |           elseif m == 3 | 
					
						
							|  |  |  |             let s1 = '^\s*type\>' | 
					
						
							|  |  |  |             if ps !~? s1 && pps =~? s1 | 
					
						
							|  |  |  |               let ind = indent(ppn) | 
					
						
							|  |  |  |             endif | 
					
						
							|  |  |  |           endif | 
					
						
							|  |  |  |         endif | 
					
						
							|  |  |  |         break | 
					
						
							|  |  |  |       endif | 
					
						
							|  |  |  |       let pn = prevnonblank(pn - 1) | 
					
						
							|  |  |  |       let ps = getline(pn) | 
					
						
							|  |  |  |     endwhile | 
					
						
							|  |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " indent:   follow indent of previous opening statement, otherwise -sw | 
					
						
							|  |  |  |   " keyword:  "begin" | 
					
						
							|  |  |  |   " where:    anywhere in current line | 
					
						
							|  |  |  |   if curs =~? s:NC.'\<begin\>' | 
					
						
							|  |  |  |     let ind = ind - &sw | 
					
						
							|  |  |  |     " find previous opening statement of | 
					
						
							|  |  |  |     " keywords: "architecture", "block", "entity", "function", "generate", "procedure", "process" | 
					
						
							|  |  |  |     let s2 = s:NC.s:NE.'\<\%(architecture\|block\|entity\|function\|generate\|procedure\|process\)\>' | 
					
						
							| 
									
										
										
										
											2007-05-05 17:54:07 +00:00
										 |  |  |     if (curs !~? s2.'.*'.s:NC.'\<begin\>.*'.s:ES && prevs =~? s2) || m == 1 | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |       let ind = ind + &sw | 
					
						
							|  |  |  |     endif | 
					
						
							|  |  |  |     return ind | 
					
						
							|  |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " indent:   +sw if previous line is previous opening statement | 
					
						
							|  |  |  |   " keywords: "record", "units" | 
					
						
							|  |  |  |   " where:    anywhere in current line | 
					
						
							|  |  |  |   if curs =~? s:NC.s:NE.'\<\%(record\|units\)\>' | 
					
						
							|  |  |  |     " find previous opening statement of | 
					
						
							|  |  |  |     " keyword: "type" | 
					
						
							|  |  |  |     let s3 = s:NC.s:NE.'\<type\>' | 
					
						
							|  |  |  |     if curs !~? s3.'.*'.s:NC.'\<\%(record\|units\)\>.*'.s:ES && prevs =~? s3 | 
					
						
							|  |  |  |       let ind = ind + &sw | 
					
						
							|  |  |  |     endif | 
					
						
							|  |  |  |     return ind | 
					
						
							|  |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " **************************************************************************************** | 
					
						
							|  |  |  |   " indent:   0 | 
					
						
							|  |  |  |   " keywords: "architecture", "configuration", "entity", "library", "package" | 
					
						
							|  |  |  |   " where:    start of current line | 
					
						
							|  |  |  |   if curs =~? '^\s*\%(architecture\|configuration\|entity\|library\|package\)\>' | 
					
						
							|  |  |  |     return 0 | 
					
						
							|  |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-30 00:14:18 +00:00
										 |  |  |   " indent:   maintain indent of previous opening statement | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |   " keyword:  "is" | 
					
						
							|  |  |  |   " where:    start of current line | 
					
						
							|  |  |  |   " find previous opening statement of | 
					
						
							|  |  |  |   " keywords: "architecture", "block", "configuration", "entity", "function", "package", "procedure", "process", "type" | 
					
						
							|  |  |  |   if curs =~? '^\s*\<is\>' && prevs =~? s:NC.s:NE.'\<\%(architecture\|block\|configuration\|entity\|function\|package\|procedure\|process\|type\)\>' | 
					
						
							| 
									
										
										
										
											2006-01-30 00:14:18 +00:00
										 |  |  |     return ind2 | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-30 00:14:18 +00:00
										 |  |  |   " indent:   maintain indent of previous opening statement | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |   " keyword:  "then" | 
					
						
							|  |  |  |   " where:    start of current line | 
					
						
							|  |  |  |   " find previous opening statement of | 
					
						
							|  |  |  |   " keywords: "elsif", "if" | 
					
						
							| 
									
										
										
										
											2006-02-01 21:47:16 +00:00
										 |  |  |   if curs =~? '^\s*\<then\>' && prevs =~? s:NC.'\%(\<elsif\>\|'.s:NE.'\<if\>\)' | 
					
						
							| 
									
										
										
										
											2006-01-30 00:14:18 +00:00
										 |  |  |     return ind2 | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-30 00:14:18 +00:00
										 |  |  |   " indent:   maintain indent of previous opening statement | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |   " keyword:  "generate" | 
					
						
							|  |  |  |   " where:    start of current line | 
					
						
							|  |  |  |   " find previous opening statement of | 
					
						
							|  |  |  |   " keywords: "for", "if" | 
					
						
							| 
									
										
										
										
											2007-05-05 17:54:07 +00:00
										 |  |  |   if curs =~? '^\s*\<generate\>' && prevs =~? s:NC.s:NE.'\%(\%(\<wait\s\+\)\@<!\<for\|\<if\)\>' | 
					
						
							| 
									
										
										
										
											2006-01-30 00:14:18 +00:00
										 |  |  |     return ind2 | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " indent:   +sw | 
					
						
							| 
									
										
										
										
											2007-05-05 17:54:07 +00:00
										 |  |  |   " keywords: "block", "process" | 
					
						
							|  |  |  |   " removed:  "begin", "case", "elsif", "if", "loop", "record", "units", "while" | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |   " where:    anywhere in previous line | 
					
						
							| 
									
										
										
										
											2007-05-05 17:54:07 +00:00
										 |  |  |   if prevs =~? s:NC.s:NE.'\<\%(block\|process\)\>' | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |     return ind + &sw | 
					
						
							|  |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " indent:   +sw | 
					
						
							| 
									
										
										
										
											2007-05-05 17:54:07 +00:00
										 |  |  |   " keywords: "architecture", "configuration", "entity", "package" | 
					
						
							|  |  |  |   " removed:  "component", "for", "when", "with" | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |   " where:    start of previous line | 
					
						
							| 
									
										
										
										
											2007-05-05 17:54:07 +00:00
										 |  |  |   if prevs =~? '^\s*\%(architecture\|configuration\|entity\|package\)\>' | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |     return ind + &sw | 
					
						
							|  |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " indent:   +sw | 
					
						
							| 
									
										
										
										
											2007-05-05 17:54:07 +00:00
										 |  |  |   " keyword:  "select" | 
					
						
							|  |  |  |   " removed:  "generate", "is", "=>" | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |   " where:    end of previous line | 
					
						
							| 
									
										
										
										
											2007-05-05 17:54:07 +00:00
										 |  |  |   if prevs =~? s:NC.'\<select'.s:ES | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |     return ind + &sw | 
					
						
							|  |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " indent:   +sw | 
					
						
							| 
									
										
										
										
											2007-05-05 17:54:07 +00:00
										 |  |  |   " keyword:  "begin", "loop", "record", "units" | 
					
						
							|  |  |  |   " where:    anywhere in previous line | 
					
						
							|  |  |  |   " keyword:  "component", "else", "for" | 
					
						
							| 
									
										
										
										
											2006-02-01 21:47:16 +00:00
										 |  |  |   " where:    start of previous line | 
					
						
							| 
									
										
										
										
											2007-05-05 17:54:07 +00:00
										 |  |  |   " keyword:  "generate", "is", "then", "=>" | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |   " where:    end of previous line | 
					
						
							|  |  |  |   " _note_:   indent allowed to leave this filter | 
					
						
							| 
									
										
										
										
											2007-05-05 17:54:07 +00:00
										 |  |  |   if prevs =~? s:NC.'\%(\<begin\>\|'.s:NE.'\<\%(loop\|record\|units\)\>\)' || prevs =~? '^\s*\%(component\|else\|for\)\>' || prevs =~? s:NC.'\%('.s:NE.'\<generate\|\<\%(is\|then\)\|=>\)'.s:ES | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |     let ind = ind + &sw | 
					
						
							|  |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " **************************************************************************************** | 
					
						
							| 
									
										
										
										
											2006-02-01 21:47:16 +00:00
										 |  |  |   " indent:   -sw | 
					
						
							| 
									
										
										
										
											2007-05-05 17:54:07 +00:00
										 |  |  |   " keywords: "when", provided previous line does not begin with "when", does not end with "is" | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |   " where:    start of current line | 
					
						
							|  |  |  |   let s4 = '^\s*when\>' | 
					
						
							| 
									
										
										
										
											2006-02-01 21:47:16 +00:00
										 |  |  |   if curs =~? s4 | 
					
						
							| 
									
										
										
										
											2007-05-05 17:54:07 +00:00
										 |  |  |     if prevs =~? s:NC.'\<is'.s:ES | 
					
						
							|  |  |  |       return ind | 
					
						
							|  |  |  |     elseif prevs !~? s4 | 
					
						
							| 
									
										
										
										
											2006-02-01 21:47:16 +00:00
										 |  |  |       return ind - &sw | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       return ind2 | 
					
						
							|  |  |  |     endif | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " indent:   -sw | 
					
						
							| 
									
										
										
										
											2007-05-05 17:54:07 +00:00
										 |  |  |   " keywords: "else", "elsif", "end" + "block", "for", "function", "generate", "if", "loop", "procedure", "process", "record", "units" | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |   " where:    start of current line | 
					
						
							| 
									
										
										
										
											2007-05-05 17:54:07 +00:00
										 |  |  |   if curs =~? '^\s*\%(else\|elsif\|end\s\+\%(block\|for\|function\|generate\|if\|loop\|procedure\|process\|record\|units\)\)\>' | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |     return ind - &sw | 
					
						
							|  |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-30 00:14:18 +00:00
										 |  |  |   " indent:   backtrace previous non-comment lines | 
					
						
							|  |  |  |   " keyword:  "end" + "case", "component" | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |   " where:    start of current line | 
					
						
							| 
									
										
										
										
											2006-01-30 00:14:18 +00:00
										 |  |  |   let m = 0 | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |   if curs =~? '^\s*end\s\+case\>' | 
					
						
							| 
									
										
										
										
											2006-01-30 00:14:18 +00:00
										 |  |  |     let m = 1 | 
					
						
							|  |  |  |   elseif curs =~? '^\s*end\s\+component\>' | 
					
						
							|  |  |  |     let m = 2 | 
					
						
							|  |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if m > 0 | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |     " find following previous non-comment line | 
					
						
							|  |  |  |     let pn = prevn | 
					
						
							|  |  |  |     let ps = getline(pn) | 
					
						
							|  |  |  |     while pn > 0 | 
					
						
							|  |  |  |       if ps !~ '^\s*--' | 
					
						
							| 
									
										
										
										
											2006-01-30 00:14:18 +00:00
										 |  |  |         "indent:   -2sw | 
					
						
							|  |  |  |         "keywords: "end" + "case" | 
					
						
							|  |  |  |         "where:    start of previous non-comment line | 
					
						
							|  |  |  |         "indent:   -sw | 
					
						
							|  |  |  |         "keywords: "when" | 
					
						
							|  |  |  |         "where:    start of previous non-comment line | 
					
						
							|  |  |  |         "indent:   follow | 
					
						
							|  |  |  |         "keywords: "case" | 
					
						
							|  |  |  |         "where:    start of previous non-comment line | 
					
						
							|  |  |  |         if m == 1 | 
					
						
							|  |  |  |           if ps =~? '^\s*end\s\+case\>' | 
					
						
							|  |  |  |             return indent(pn) - 2 * &sw | 
					
						
							|  |  |  |           elseif ps =~? '^\s*when\>' | 
					
						
							|  |  |  |             return indent(pn) - &sw | 
					
						
							|  |  |  |           elseif ps =~? '^\s*case\>' | 
					
						
							|  |  |  |             return indent(pn) | 
					
						
							|  |  |  |           endif | 
					
						
							|  |  |  |         "indent:   follow | 
					
						
							|  |  |  |         "keyword:  "component" | 
					
						
							| 
									
										
										
										
											2007-05-05 17:54:07 +00:00
										 |  |  |         "where:    start of previous non-comment line | 
					
						
							| 
									
										
										
										
											2006-01-30 00:14:18 +00:00
										 |  |  |         elseif m == 2 | 
					
						
							| 
									
										
										
										
											2007-05-05 17:54:07 +00:00
										 |  |  |           if ps =~? '^\s*component\>' | 
					
						
							| 
									
										
										
										
											2006-01-30 00:14:18 +00:00
										 |  |  |             return indent(pn) | 
					
						
							|  |  |  |           endif | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |         endif | 
					
						
							|  |  |  |       endif | 
					
						
							|  |  |  |       let pn = prevnonblank(pn - 1) | 
					
						
							|  |  |  |       let ps = getline(pn) | 
					
						
							|  |  |  |     endwhile | 
					
						
							| 
									
										
										
										
											2006-01-30 00:14:18 +00:00
										 |  |  |     return ind - &sw | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-01 21:47:16 +00:00
										 |  |  |   " indent:   -sw | 
					
						
							|  |  |  |   " keyword:  ")" | 
					
						
							|  |  |  |   " where:    start of current line | 
					
						
							|  |  |  |   if curs =~ '^\s*)' | 
					
						
							|  |  |  |     return ind - &sw | 
					
						
							|  |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |   " indent:   0 | 
					
						
							|  |  |  |   " keywords: "end" + "architecture", "configuration", "entity", "package" | 
					
						
							|  |  |  |   " where:    start of current line | 
					
						
							|  |  |  |   if curs =~? '^\s*end\s\+\%(architecture\|configuration\|entity\|package\)\>' | 
					
						
							|  |  |  |     return 0 | 
					
						
							|  |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " indent:   -sw | 
					
						
							| 
									
										
										
										
											2010-07-11 16:58:51 +02:00
										 |  |  |   " keywords: "end" + identifier, ";" | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |   " where:    start of current line | 
					
						
							| 
									
										
										
										
											2007-05-05 17:54:07 +00:00
										 |  |  |   "if curs =~? '^\s*end\s\+\w\+\>' | 
					
						
							| 
									
										
										
										
											2010-07-11 16:58:51 +02:00
										 |  |  |   if curs =~? '^\s*end\%(\s\|;'.s:ES.'\)' | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |     return ind - &sw | 
					
						
							|  |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " **************************************************************************************** | 
					
						
							| 
									
										
										
										
											2006-01-30 00:14:18 +00:00
										 |  |  |   " indent:   maintain indent of previous opening statement | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |   " keywords: without "generic", "map", "port" + ":" but not ":=" + "in", "out", "inout", "buffer", "linkage", variable & ":=" | 
					
						
							| 
									
										
										
										
											2006-02-01 21:47:16 +00:00
										 |  |  |   " where:    start of current line | 
					
						
							|  |  |  |   if curs =~? '^\s*\%(\<\%(generic\|map\|port\)\>.*\)\@<!\S\+\s*:[^=]\@=\s*\%(\%(in\|out\|inout\|buffer\|linkage\)\>\|\w\+\s\+:=\)' | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |     return ind2 | 
					
						
							|  |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " return leftover filtered indent | 
					
						
							|  |  |  |   return ind | 
					
						
							|  |  |  | endfunction |