diff options
Diffstat (limited to 'indent/ishd.vim')
| -rw-r--r-- | indent/ishd.vim | 72 | 
1 files changed, 72 insertions, 0 deletions
diff --git a/indent/ishd.vim b/indent/ishd.vim new file mode 100644 index 00000000..203e1bde --- /dev/null +++ b/indent/ishd.vim @@ -0,0 +1,72 @@ +if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 +   +" Description:	InstallShield indenter +" Author:	Johannes Zellner <johannes@zellner.org> +" Last Change:	Tue, 27 Apr 2004 14:54:59 CEST + +" Only load this indent file when no other was loaded. +if exists("b:did_indent") +    finish +endif +let b:did_indent = 1 + +setlocal autoindent +setlocal indentexpr=GetIshdIndent(v:lnum) +setlocal indentkeys& +setlocal indentkeys+==else,=elseif,=endif,=end,=begin,<:> +" setlocal indentkeys-=0# + +let b:undo_indent = "setl ai< indentexpr< indentkeys<" + +" Only define the function once. +if exists("*GetIshdIndent") +    finish +endif + +fun! GetIshdIndent(lnum) +    " labels and preprocessor get zero indent immediately +    let this_line = getline(a:lnum) +    let LABELS_OR_PREPROC = '^\s*\(\<\k\+\>:\s*$\|#.*\)' +    let LABELS_OR_PREPROC_EXCEPT = '^\s*\<default\+\>:' +    if this_line =~ LABELS_OR_PREPROC && this_line !~ LABELS_OR_PREPROC_EXCEPT +	return 0 +    endif + +    " Find a non-blank line above the current line. +    " Skip over labels and preprocessor directives. +    let lnum = a:lnum +    while lnum > 0 +	let lnum = prevnonblank(lnum - 1) +	let previous_line = getline(lnum) +	if previous_line !~ LABELS_OR_PREPROC || previous_line =~ LABELS_OR_PREPROC_EXCEPT +	    break +	endif +    endwhile + +    " Hit the start of the file, use zero indent. +    if lnum == 0 +	return 0 +    endif + +    let ind = indent(lnum) + +    " Add +    if previous_line =~ '^\s*\<\(function\|begin\|switch\|case\|default\|if.\{-}then\|else\|elseif\|while\|repeat\)\>' +	let ind = ind + shiftwidth() +    endif + +    " Subtract +    if this_line =~ '^\s*\<endswitch\>' +	let ind = ind - 2 * shiftwidth() +    elseif this_line =~ '^\s*\<\(begin\|end\|endif\|endwhile\|else\|elseif\|until\)\>' +	let ind = ind - shiftwidth() +    elseif this_line =~ '^\s*\<\(case\|default\)\>' +	if previous_line !~ '^\s*\<switch\>' +	    let ind = ind - shiftwidth() +	endif +    endif + +    return ind +endfun + +endif  | 
