ishd.vim (1877B)
1 " Description: InstallShield indenter 2 " Author: Johannes Zellner <johannes@zellner.org> 3 " Last Change: Tue, 27 Apr 2004 14:54:59 CEST 4 5 " Only load this indent file when no other was loaded. 6 if exists("b:did_indent") 7 finish 8 endif 9 let b:did_indent = 1 10 11 setlocal autoindent 12 setlocal indentexpr=GetIshdIndent(v:lnum) 13 setlocal indentkeys& 14 setlocal indentkeys+==else,=elseif,=endif,=end,=begin,<:> 15 " setlocal indentkeys-=0# 16 17 let b:undo_indent = "setl ai< indentexpr< indentkeys<" 18 19 " Only define the function once. 20 if exists("*GetIshdIndent") 21 finish 22 endif 23 24 fun! 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 68 endfun