xref: /vim-8.2.3635/runtime/indent/ishd.vim (revision 3ec574f2)
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