| 
									
										
										
										
											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> | 
					
						
							| 
									
										
										
										
											2017-11-02 22:58:42 +01:00
										 |  |  | " Version:     1.62 | 
					
						
							|  |  |  | " Last Change: 2017 Oct 17 | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2011-10-20 22:22:38 +02:00
										 |  |  |   " keywords: "procedure" + name, "generic", "map", "port" + "(", provided current line is part of mapping | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |   " 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 | 
					
						
							| 
									
										
										
										
											2016-06-04 20:20:29 +02:00
										 |  |  |   if (curs =~ '^\s*)' || curs =~? '^\s*\%(\<\%(procedure\|generic\|map\|port\)\>.*\)\@<!\w\+\s*\w*\s*\((.*)\)*\s*\%(=>\s*\S\+\|:[^=]\@=\s*\%(\%(in\|out\|inout\|buffer\|linkage\)\>\|\s\+\)\)') && (prevs =~? s:NC.'\<\%(procedure\s\+\S\+\|generic\|map\|port\)\s*(\%(\s*\w\)\=' || (ps =~? s:NC.'\<\%(procedure\|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 | 
					
						
							| 
									
										
										
										
											2017-06-13 18:12:01 +02:00
										 |  |  |         return ind2 + stridx(prevs_noi, '(') + shiftwidth() | 
					
						
							| 
									
										
										
										
											2007-05-05 17:54:07 +00:00
										 |  |  |       else | 
					
						
							| 
									
										
										
										
											2017-06-13 18:12:01 +02:00
										 |  |  |         return ind2 + shiftwidth() | 
					
						
							| 
									
										
										
										
											2007-05-05 17:54:07 +00:00
										 |  |  |       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 | 
					
						
							| 
									
										
										
										
											2017-06-13 18:12:01 +02:00
										 |  |  |       return ind2 + shiftwidth() | 
					
						
							| 
									
										
										
										
											2007-05-05 17:54:07 +00:00
										 |  |  |     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 | 
					
						
							| 
									
										
										
										
											2011-10-20 22:22:38 +02:00
										 |  |  |         " keywords: "procedure", "generic", "map", "port" | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |         " 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 | 
					
						
							| 
									
										
										
										
											2011-10-20 22:22:38 +02:00
										 |  |  |           if ps =~? s:NC.'\<\%(procedure\|generic\|map\|port\)\>' || ps =~ '^\s*(' | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |             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\>' | 
					
						
							|  |  |  |     " 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\)\>' | 
					
						
							| 
									
										
										
										
											2011-10-20 22:22:38 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     let pn = prevnonblank(curn - 1) | 
					
						
							|  |  |  |     let ps = getline(pn) | 
					
						
							|  |  |  |     while pn > 0 && (ps =~ '^\s*--' || ps !~? s2) | 
					
						
							|  |  |  |       let pn = prevnonblank(pn - 1) | 
					
						
							|  |  |  |       let ps = getline(pn) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (ps =~? s:NC.'\<begin\>') | 
					
						
							| 
									
										
										
										
											2017-06-13 18:12:01 +02:00
										 |  |  |         return indent(pn) - shiftwidth() | 
					
						
							| 
									
										
										
										
											2011-10-20 22:22:38 +02:00
										 |  |  |       endif | 
					
						
							|  |  |  |     endwhile | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (pn == 0) | 
					
						
							| 
									
										
										
										
											2017-06-13 18:12:01 +02:00
										 |  |  |       return ind - shiftwidth() | 
					
						
							| 
									
										
										
										
											2011-10-20 22:22:38 +02:00
										 |  |  |     else | 
					
						
							|  |  |  |       return indent(pn) | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |     endif | 
					
						
							|  |  |  |   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 | 
					
						
							| 
									
										
										
										
											2017-06-13 18:12:01 +02:00
										 |  |  |       let ind = ind + shiftwidth() | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |     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\)\>' | 
					
						
							| 
									
										
										
										
											2017-06-13 18:12:01 +02:00
										 |  |  |     return ind + shiftwidth() | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |   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\)\>' | 
					
						
							| 
									
										
										
										
											2017-06-13 18:12:01 +02:00
										 |  |  |     return ind + shiftwidth() | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |   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 | 
					
						
							| 
									
										
										
										
											2017-06-13 18:12:01 +02:00
										 |  |  |     return ind + shiftwidth() | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |   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 | 
					
						
							| 
									
										
										
										
											2017-06-13 18:12:01 +02:00
										 |  |  |     let ind = ind + shiftwidth() | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |   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 | 
					
						
							| 
									
										
										
										
											2017-06-13 18:12:01 +02:00
										 |  |  |       return ind - shiftwidth() | 
					
						
							| 
									
										
										
										
											2006-02-01 21:47:16 +00:00
										 |  |  |     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 | 
					
						
							| 
									
										
										
										
											2011-10-20 22:22:38 +02:00
										 |  |  |   let s5 = 'block\|for\|function\|generate\|if\|loop\|procedure\|process\|record\|units' | 
					
						
							|  |  |  |   if curs =~? '^\s*\%(else\|elsif\|end\s\+\%('.s5.'\)\)\>' | 
					
						
							|  |  |  |     if prevs =~? '^\s*\%(elsif\|'.s5.'\)' | 
					
						
							|  |  |  |       return ind | 
					
						
							|  |  |  |     else | 
					
						
							| 
									
										
										
										
											2017-06-13 18:12:01 +02:00
										 |  |  |       return ind - shiftwidth() | 
					
						
							| 
									
										
										
										
											2011-10-20 22:22:38 +02:00
										 |  |  |     endif | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |   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\>' | 
					
						
							| 
									
										
										
										
											2017-06-13 18:12:01 +02:00
										 |  |  |             return indent(pn) - 2 * shiftwidth() | 
					
						
							| 
									
										
										
										
											2006-01-30 00:14:18 +00:00
										 |  |  |           elseif ps =~? '^\s*when\>' | 
					
						
							| 
									
										
										
										
											2017-06-13 18:12:01 +02:00
										 |  |  |             return indent(pn) - shiftwidth() | 
					
						
							| 
									
										
										
										
											2006-01-30 00:14:18 +00:00
										 |  |  |           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 | 
					
						
							| 
									
										
										
										
											2017-06-13 18:12:01 +02:00
										 |  |  |     return ind - shiftwidth() | 
					
						
							| 
									
										
										
										
											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*)' | 
					
						
							| 
									
										
										
										
											2017-06-13 18:12:01 +02:00
										 |  |  |     return ind - shiftwidth() | 
					
						
							| 
									
										
										
										
											2006-02-01 21:47:16 +00:00
										 |  |  |   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.'\)' | 
					
						
							| 
									
										
										
										
											2017-06-13 18:12:01 +02:00
										 |  |  |     return ind - shiftwidth() | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " **************************************************************************************** | 
					
						
							| 
									
										
										
										
											2006-01-30 00:14:18 +00:00
										 |  |  |   " indent:   maintain indent of previous opening statement | 
					
						
							| 
									
										
										
										
											2017-11-02 22:58:42 +01:00
										 |  |  |   " keywords: without "procedure", "generic", "map", "port" + ":" but not ":=" + "in", "out", "inout", "buffer", "linkage", variable & ":=" | 
					
						
							| 
									
										
										
										
											2006-02-01 21:47:16 +00:00
										 |  |  |   " where:    start of current line | 
					
						
							| 
									
										
										
										
											2017-11-02 22:58:42 +01:00
										 |  |  |   if curs =~? '^\s*\%(\<\%(procedure\|generic\|map\|port\)\>.*\)\@<!\w\+\s*\w*\s*:[^=]\@=\s*\%(\%(in\|out\|inout\|buffer\|linkage\)\>\|\w\+\s\+:=\)' | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  |     return ind2 | 
					
						
							|  |  |  |   endif | 
					
						
							| 
									
										
										
										
											2017-11-02 22:58:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-04 20:20:29 +02:00
										 |  |  |   " **************************************************************************************** | 
					
						
							|  |  |  |   " indent:     maintain indent of previous opening statement, corner case which | 
					
						
							|  |  |  |   "             does not end in ;, but is part of a mapping | 
					
						
							|  |  |  |   " keywords:   without "procedure", "generic", "map", "port" + ":" but not ":=", never + ;$ and | 
					
						
							|  |  |  |   "             prevline without "procedure", "generic", "map", "port" + ":" but not ":=" + eventually ;$ | 
					
						
							|  |  |  |   " where:      start of current line | 
					
						
							|  |  |  |   if curs =~? '^\s*\%(\<\%(procedure\|generic\|map\|port\)\>.*\)\@<!\w\+\s*\w*\s*:[^=].*[^;].*$' | 
					
						
							| 
									
										
										
										
											2017-11-02 22:58:42 +01:00
										 |  |  |     if prevs =~? '^\s*\%(\<\%(procedure\|generic\|map\|port\)\>.*\)\@<!\w\+\s*\w*\s*:[^=].*;.*$' | 
					
						
							|  |  |  |       return ind2 | 
					
						
							|  |  |  |     endif | 
					
						
							|  |  |  |   endif | 
					
						
							| 
									
										
										
										
											2006-01-26 22:17:47 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   " return leftover filtered indent | 
					
						
							|  |  |  |   return ind | 
					
						
							|  |  |  | endfunction |