1" Vim indent file 2" Language: occam 3" Maintainer: Mario Schweigler <[email protected]> 4" Last Change: 23 April 2003 5 6" Only load this indent file when no other was loaded. 7if exists("b:did_indent") 8 finish 9endif 10let b:did_indent = 1 11 12"{{{ Settings 13" Set the occam indent function 14setlocal indentexpr=GetOccamIndent() 15" Indent after new line and after initial colon 16setlocal indentkeys=o,O,0=: 17"}}} 18 19" Only define the function once 20if exists("*GetOccamIndent") 21 finish 22endif 23let s:keepcpo= &cpo 24set cpo&vim 25 26"{{{ Indent definitions 27" Define carriage return indent 28let s:FirstLevelIndent = '^\C\s*\(IF\|ALT\|PRI\s\+ALT\|PAR\|SEQ\|PRI\s\+PAR\|WHILE\|VALOF\|CLAIM\|FORKING\)\>\|\(--.*\)\@<!\(\<PROC\>\|??\|\<CASE\>\s*\(--.*\)\=\_$\)' 29let s:FirstLevelNonColonEndIndent = '^\C\s*PROTOCOL\>\|\(--.*\)\@<!\<\(\(CHAN\|DATA\)\s\+TYPE\|FUNCTION\)\>' 30let s:SecondLevelIndent = '^\C\s*\(IF\|ALT\|PRI\s\+ALT\)\>\|\(--.*\)\@<!?\s*\<CASE\>\s*\(--.*\)\=\_$' 31let s:SecondLevelNonColonEndIndent = '\(--.*\)\@<!\<\(CHAN\|DATA\)\s\+TYPE\>' 32 33" Define colon indent 34let s:ColonIndent = '\(--.*\)\@<!\<PROC\>' 35let s:ColonNonColonEndIndent = '^\C\s*PROTOCOL\>\|\(--.*\)\@<!\<\(\(CHAN\|DATA\)\s\+TYPE\|FUNCTION\)\>' 36 37let s:ColonEnd = '\(--.*\)\@<!:\s*\(--.*\)\=$' 38let s:ColonStart = '^\s*:\s*\(--.*\)\=$' 39 40" Define comment 41let s:CommentLine = '^\s*--' 42"}}} 43 44"{{{ function GetOccamIndent() 45" Auxiliary function to get the correct indent for a line of occam code 46function GetOccamIndent() 47 48 " Ensure magic is on 49 let save_magic = &magic 50 setlocal magic 51 52 " Get reference line number 53 let linenum = prevnonblank(v:lnum - 1) 54 while linenum > 0 && getline(linenum) =~ s:CommentLine 55 let linenum = prevnonblank(linenum - 1) 56 endwhile 57 58 " Get current indent 59 let curindent = indent(linenum) 60 61 " Get current line 62 let line = getline(linenum) 63 64 " Get previous line number 65 let prevlinenum = prevnonblank(linenum - 1) 66 while prevlinenum > 0 && getline(prevlinenum) =~ s:CommentLine 67 let prevlinenum = prevnonblank(prevlinenum - 1) 68 endwhile 69 70 " Get previous line 71 let prevline = getline(prevlinenum) 72 73 " Colon indent 74 if getline(v:lnum) =~ s:ColonStart 75 76 let found = 0 77 78 while found < 1 79 80 if line =~ s:ColonStart 81 let found = found - 1 82 elseif line =~ s:ColonIndent || (line =~ s:ColonNonColonEndIndent && line !~ s:ColonEnd) 83 let found = found + 1 84 endif 85 86 if found < 1 87 let linenum = prevnonblank(linenum - 1) 88 if linenum > 0 89 let line = getline(linenum) 90 else 91 let found = 1 92 endif 93 endif 94 95 endwhile 96 97 if linenum > 0 98 let curindent = indent(linenum) 99 else 100 let colonline = getline(v:lnum) 101 let tabstr = '' 102 while strlen(tabstr) < &tabstop 103 let tabstr = ' ' . tabstr 104 endwhile 105 let colonline = substitute(colonline, '\t', tabstr, 'g') 106 let curindent = match(colonline, ':') 107 endif 108 109 " Restore magic 110 if !save_magic|setlocal nomagic|endif 111 112 return curindent 113 endif 114 115 if getline(v:lnum) =~ '^\s*:' 116 let colonline = getline(v:lnum) 117 let tabstr = '' 118 while strlen(tabstr) < &tabstop 119 let tabstr = ' ' . tabstr 120 endwhile 121 let colonline = substitute(colonline, '\t', tabstr, 'g') 122 let curindent = match(colonline, ':') 123 124 " Restore magic 125 if !save_magic|setlocal nomagic|endif 126 127 return curindent 128 endif 129 130 " Carriage return indenat 131 if line =~ s:FirstLevelIndent || (line =~ s:FirstLevelNonColonEndIndent && line !~ s:ColonEnd) 132 \ || (line !~ s:ColonStart && (prevline =~ s:SecondLevelIndent 133 \ || (prevline =~ s:SecondLevelNonColonEndIndent && prevline !~ s:ColonEnd))) 134 let curindent = curindent + &shiftwidth 135 136 " Restore magic 137 if !save_magic|setlocal nomagic|endif 138 139 return curindent 140 endif 141 142 " Commented line 143 if getline(prevnonblank(v:lnum - 1)) =~ s:CommentLine 144 145 " Restore magic 146 if !save_magic|setlocal nomagic|endif 147 148 return indent(prevnonblank(v:lnum - 1)) 149 endif 150 151 " Look for previous second level IF / ALT / PRI ALT 152 let found = 0 153 154 while !found 155 156 if indent(prevlinenum) == curindent - &shiftwidth 157 let found = 1 158 endif 159 160 if !found 161 let prevlinenum = prevnonblank(prevlinenum - 1) 162 while prevlinenum > 0 && getline(prevlinenum) =~ s:CommentLine 163 let prevlinenum = prevnonblank(prevlinenum - 1) 164 endwhile 165 if prevlinenum == 0 166 let found = 1 167 endif 168 endif 169 170 endwhile 171 172 if prevlinenum > 0 173 if getline(prevlinenum) =~ s:SecondLevelIndent 174 let curindent = curindent + &shiftwidth 175 endif 176 endif 177 178 " Restore magic 179 if !save_magic|setlocal nomagic|endif 180 181 return curindent 182 183endfunction 184"}}} 185 186let &cpo = s:keepcpo 187unlet s:keepcpo 188