1" Description: InstallShield indenter 2" Author: Johannes Zellner <[email protected]> 3" Last Change: Tue, 27 Apr 2004 14:54:59 CEST 4 5" Only load this indent file when no other was loaded. 6if exists("b:did_indent") 7 finish 8endif 9let b:did_indent = 1 10 11setlocal autoindent 12setlocal indentexpr=GetIshdIndent(v:lnum) 13setlocal indentkeys& 14setlocal indentkeys+==else,=elseif,=endif,=end,=begin,<:> 15" setlocal indentkeys-=0# 16 17let b:undo_indent = "setl ai< indentexpr< indentkeys<" 18 19" Only define the function once. 20if exists("*GetIshdIndent") 21 finish 22endif 23 24fun! GetIshdIndent(lnum) 25 " labels and preprocessor get zero indent immediately 26 let this_line = getline(a:lnum) 27 let LABELS_OR_PREPROC = '^\s*\(\<\k\+\>:\s*$\|#.*\)' 28 let LABELS_OR_PREPROC_EXCEPT = '^\s*\<default\+\>:' 29 if this_line =~ LABELS_OR_PREPROC && this_line !~ LABELS_OR_PREPROC_EXCEPT 30 return 0 31 endif 32 33 " Find a non-blank line above the current line. 34 " Skip over labels and preprocessor directives. 35 let lnum = a:lnum 36 while lnum > 0 37 let lnum = prevnonblank(lnum - 1) 38 let previous_line = getline(lnum) 39 if previous_line !~ LABELS_OR_PREPROC || previous_line =~ LABELS_OR_PREPROC_EXCEPT 40 break 41 endif 42 endwhile 43 44 " Hit the start of the file, use zero indent. 45 if lnum == 0 46 return 0 47 endif 48 49 let ind = indent(lnum) 50 51 " Add 52 if previous_line =~ '^\s*\<\(function\|begin\|switch\|case\|default\|if.\{-}then\|else\|elseif\|while\|repeat\)\>' 53 let ind = ind + shiftwidth() 54 endif 55 56 " Subtract 57 if this_line =~ '^\s*\<endswitch\>' 58 let ind = ind - 2 * shiftwidth() 59 elseif this_line =~ '^\s*\<\(begin\|end\|endif\|endwhile\|else\|elseif\|until\)\>' 60 let ind = ind - shiftwidth() 61 elseif this_line =~ '^\s*\<\(case\|default\)\>' 62 if previous_line !~ '^\s*\<switch\>' 63 let ind = ind - shiftwidth() 64 endif 65 endif 66 67 return ind 68endfun 69