" Vim indent file" Language: occam" Maintainer: Mario Schweigler <ms44@kent.ac.uk>" Last Change: 23 April 2003" Only load this indent file when no other was loaded.if exists("b:did_indent") finishendiflet b:did_indent = 1"{{{ Settings" Set the occam indent functionsetlocal indentexpr=GetOccamIndent()" Indent after new line and after initial colonsetlocal indentkeys=o,O,0=:"}}}" Only define the function onceif exists("*GetOccamIndent") finishendif"{{{ Indent definitions" Define carriage return indentlet s:FirstLevelIndent = '^\C\s*\(IF\|ALT\|PRI\s\+ALT\|PAR\|SEQ\|PRI\s\+PAR\|WHILE\|VALOF\|CLAIM\|FORKING\)\>\|\(--.*\)\@<!\(\<PROC\>\|??\|\<CASE\>\s*\(--.*\)\=\_$\)'let s:FirstLevelNonColonEndIndent = '^\C\s*PROTOCOL\>\|\(--.*\)\@<!\<\(\(CHAN\|DATA\)\s\+TYPE\|FUNCTION\)\>'let s:SecondLevelIndent = '^\C\s*\(IF\|ALT\|PRI\s\+ALT\)\>\|\(--.*\)\@<!?\s*\<CASE\>\s*\(--.*\)\=\_$'let s:SecondLevelNonColonEndIndent = '\(--.*\)\@<!\<\(CHAN\|DATA\)\s\+TYPE\>'" Define colon indentlet s:ColonIndent = '\(--.*\)\@<!\<PROC\>'let s:ColonNonColonEndIndent = '^\C\s*PROTOCOL\>\|\(--.*\)\@<!\<\(\(CHAN\|DATA\)\s\+TYPE\|FUNCTION\)\>'let s:ColonEnd = '\(--.*\)\@<!:\s*\(--.*\)\=$'let s:ColonStart = '^\s*:\s*\(--.*\)\=$'" Define commentlet s:CommentLine = '^\s*--'"}}}"{{{ function GetOccamIndent()" Auxiliary function to get the correct indent for a line of occam codefunction GetOccamIndent() " Ensure magic is on let save_magic = &magic setlocal magic " Get reference line number let linenum = prevnonblank(v:lnum - 1) while linenum > 0 && getline(linenum) =~ s:CommentLine let linenum = prevnonblank(linenum - 1) endwhile " Get current indent let curindent = indent(linenum) " Get current line let line = getline(linenum) " Get previous line number let prevlinenum = prevnonblank(linenum - 1) while prevlinenum > 0 && getline(prevlinenum) =~ s:CommentLine let prevlinenum = prevnonblank(prevlinenum - 1) endwhile " Get previous line let prevline = getline(prevlinenum) " Colon indent if getline(v:lnum) =~ s:ColonStart let found = 0 while found < 1 if line =~ s:ColonStart let found = found - 1 elseif line =~ s:ColonIndent || (line =~ s:ColonNonColonEndIndent && line !~ s:ColonEnd) let found = found + 1 endif if found < 1 let linenum = prevnonblank(linenum - 1) if linenum > 0 let line = getline(linenum) else let found = 1 endif endif endwhile if linenum > 0 let curindent = indent(linenum) else let colonline = getline(v:lnum) let tabstr = '' while strlen(tabstr) < &tabstop let tabstr = ' ' . tabstr endwhile let colonline = substitute(colonline, '\t', tabstr, 'g') let curindent = match(colonline, ':') endif " Restore magic if !save_magic|setlocal nomagic|endif return curindent endif if getline(v:lnum) =~ '^\s*:' let colonline = getline(v:lnum) let tabstr = '' while strlen(tabstr) < &tabstop let tabstr = ' ' . tabstr endwhile let colonline = substitute(colonline, '\t', tabstr, 'g') let curindent = match(colonline, ':') " Restore magic if !save_magic|setlocal nomagic|endif return curindent endif " Carriage return indenat if line =~ s:FirstLevelIndent || (line =~ s:FirstLevelNonColonEndIndent && line !~ s:ColonEnd) \ || (line !~ s:ColonStart && (prevline =~ s:SecondLevelIndent \ || (prevline =~ s:SecondLevelNonColonEndIndent && prevline !~ s:ColonEnd))) let curindent = curindent + &shiftwidth " Restore magic if !save_magic|setlocal nomagic|endif return curindent endif " Commented line if getline(prevnonblank(v:lnum - 1)) =~ s:CommentLine " Restore magic if !save_magic|setlocal nomagic|endif return indent(prevnonblank(v:lnum - 1)) endif " Look for previous second level IF / ALT / PRI ALT let found = 0 while !found if indent(prevlinenum) == curindent - &shiftwidth let found = 1 endif if !found let prevlinenum = prevnonblank(prevlinenum - 1) while prevlinenum > 0 && getline(prevlinenum) =~ s:CommentLine let prevlinenum = prevnonblank(prevlinenum - 1) endwhile if prevlinenum == 0 let found = 1 endif endif endwhile if prevlinenum > 0 if getline(prevlinenum) =~ s:SecondLevelIndent let curindent = curindent + &shiftwidth endif endif " Restore magic if !save_magic|setlocal nomagic|endif return curindentendfunction"}}}
" Vim indent file
" Language: occam
" Maintainer: Mario Schweigler <ms44@kent.ac.uk>
" Last Change: 23 April 2003
" Only load this indent file when no other was loaded.
if exists("b:did_indent")
finish
endif
let b:did_indent = 1
"{{{ Settings
" Set the occam indent function
setlocal indentexpr=GetOccamIndent()
" Indent after new line and after initial colon
setlocal indentkeys=o,O,0=:
"}}}
" Only define the function once
if exists("*GetOccamIndent")
finish
endif
"{{{ Indent definitions
" Define carriage return indent
let s:FirstLevelIndent = '^\C\s*\(IF\|ALT\|PRI\s\+ALT\|PAR\|SEQ\|PRI\s\+PAR\|WHILE\|VALOF\|CLAIM\|FORKING\)\>\|\(--.*\)\@<!\(\<PROC\>\|??\|\<CASE\>\s*\(--.*\)\=\_$\)'
let s:FirstLevelNonColonEndIndent = '^\C\s*PROTOCOL\>\|\(--.*\)\@<!\<\(\(CHAN\|DATA\)\s\+TYPE\|FUNCTION\)\>'
let s:SecondLevelIndent = '^\C\s*\(IF\|ALT\|PRI\s\+ALT\)\>\|\(--.*\)\@<!?\s*\<CASE\>\s*\(--.*\)\=\_$'
let s:SecondLevelNonColonEndIndent = '\(--.*\)\@<!\<\(CHAN\|DATA\)\s\+TYPE\>'
" Define colon indent
let s:ColonIndent = '\(--.*\)\@<!\<PROC\>'
let s:ColonNonColonEndIndent = '^\C\s*PROTOCOL\>\|\(--.*\)\@<!\<\(\(CHAN\|DATA\)\s\+TYPE\|FUNCTION\)\>'
let s:ColonEnd = '\(--.*\)\@<!:\s*\(--.*\)\=$'
let s:ColonStart = '^\s*:\s*\(--.*\)\=$'
" Define comment
let s:CommentLine = '^\s*--'
"}}}
"{{{ function GetOccamIndent()
" Auxiliary function to get the correct indent for a line of occam code
function GetOccamIndent()
" Ensure magic is on
let save_magic = &magic
setlocal magic
" Get reference line number
let linenum = prevnonblank(v:lnum - 1)
while linenum > 0 && getline(linenum) =~ s:CommentLine
let linenum = prevnonblank(linenum - 1)
endwhile
" Get current indent
let curindent = indent(linenum)
" Get current line
let line = getline(linenum)
" Get previous line number
let prevlinenum = prevnonblank(linenum - 1)
while prevlinenum > 0 && getline(prevlinenum) =~ s:CommentLine
let prevlinenum = prevnonblank(prevlinenum - 1)
endwhile
" Get previous line
let prevline = getline(prevlinenum)
" Colon indent
if getline(v:lnum) =~ s:ColonStart
let found = 0
while found < 1
if line =~ s:ColonStart
let found = found - 1
elseif line =~ s:ColonIndent || (line =~ s:ColonNonColonEndIndent && line !~ s:ColonEnd)
let found = found + 1
endif
if found < 1
let linenum = prevnonblank(linenum - 1)
if linenum > 0
let line = getline(linenum)
else
let found = 1
endif
endif
endwhile
if linenum > 0
let curindent = indent(linenum)
else
let colonline = getline(v:lnum)
let tabstr = ''
while strlen(tabstr) < &tabstop
let tabstr = ' ' . tabstr
endwhile
let colonline = substitute(colonline, '\t', tabstr, 'g')
let curindent = match(colonline, ':')
endif
" Restore magic
if !save_magic|setlocal nomagic|endif
return curindent
endif
if getline(v:lnum) =~ '^\s*:'
let colonline = getline(v:lnum)
let tabstr = ''
while strlen(tabstr) < &tabstop
let tabstr = ' ' . tabstr
endwhile
let colonline = substitute(colonline, '\t', tabstr, 'g')
let curindent = match(colonline, ':')
" Restore magic
if !save_magic|setlocal nomagic|endif
return curindent
endif
" Carriage return indenat
if line =~ s:FirstLevelIndent || (line =~ s:FirstLevelNonColonEndIndent && line !~ s:ColonEnd)
\ || (line !~ s:ColonStart && (prevline =~ s:SecondLevelIndent
\ || (prevline =~ s:SecondLevelNonColonEndIndent && prevline !~ s:ColonEnd)))
let curindent = curindent + &shiftwidth
" Restore magic
if !save_magic|setlocal nomagic|endif
return curindent
endif
" Commented line
if getline(prevnonblank(v:lnum - 1)) =~ s:CommentLine
" Restore magic
if !save_magic|setlocal nomagic|endif
return indent(prevnonblank(v:lnum - 1))
endif
" Look for previous second level IF / ALT / PRI ALT
let found = 0
while !found
if indent(prevlinenum) == curindent - &shiftwidth
let found = 1
endif
if !found
let prevlinenum = prevnonblank(prevlinenum - 1)
while prevlinenum > 0 && getline(prevlinenum) =~ s:CommentLine
let prevlinenum = prevnonblank(prevlinenum - 1)
endwhile
if prevlinenum == 0
let found = 1
endif
endif
endwhile
if prevlinenum > 0
if getline(prevlinenum) =~ s:SecondLevelIndent
let curindent = curindent + &shiftwidth
endif
endif
" Restore magic
if !save_magic|setlocal nomagic|endif
return curindent
endfunction
"}}}