xref: /vim-8.2.3635/runtime/indent/vb.vim (revision 3ec574f2)
1071d4279SBram Moolenaar" Vim indent file
2071d4279SBram Moolenaar" Language:	VisualBasic (ft=vb) / Basic (ft=basic) / SaxBasic (ft=vb)
3071d4279SBram Moolenaar" Author:	Johannes Zellner <[email protected]>
469a7cb47SBram Moolenaar" Last Change:	Fri, 18 Jun 2004 07:22:42 CEST
559c0395eSBram Moolenaar"		Small update 2010 Jul 28 by Maxim Kim
6071d4279SBram Moolenaar
7071d4279SBram Moolenaarif exists("b:did_indent")
8071d4279SBram Moolenaar    finish
9071d4279SBram Moolenaarendif
10071d4279SBram Moolenaarlet b:did_indent = 1
11071d4279SBram Moolenaar
12582fd85bSBram Moolenaarsetlocal autoindent
13071d4279SBram Moolenaarsetlocal indentexpr=VbGetIndent(v:lnum)
14071d4279SBram Moolenaarsetlocal indentkeys&
1569a7cb47SBram Moolenaarsetlocal indentkeys+==~else,=~elseif,=~end,=~wend,=~case,=~next,=~select,=~loop,<:>
16071d4279SBram Moolenaar
17582fd85bSBram Moolenaarlet b:undo_indent = "set ai< indentexpr< indentkeys<"
18582fd85bSBram Moolenaar
19071d4279SBram Moolenaar" Only define the function once.
20071d4279SBram Moolenaarif exists("*VbGetIndent")
21071d4279SBram Moolenaar    finish
22071d4279SBram Moolenaarendif
23071d4279SBram Moolenaar
24071d4279SBram Moolenaarfun! VbGetIndent(lnum)
25071d4279SBram Moolenaar    " labels and preprocessor get zero indent immediately
26071d4279SBram Moolenaar    let this_line = getline(a:lnum)
27071d4279SBram Moolenaar    let LABELS_OR_PREPROC = '^\s*\(\<\k\+\>:\s*$\|#.*\)'
28071d4279SBram Moolenaar    if this_line =~? LABELS_OR_PREPROC
29071d4279SBram Moolenaar	return 0
30071d4279SBram Moolenaar    endif
31071d4279SBram Moolenaar
32071d4279SBram Moolenaar    " Find a non-blank line above the current line.
33071d4279SBram Moolenaar    " Skip over labels and preprocessor directives.
34071d4279SBram Moolenaar    let lnum = a:lnum
35071d4279SBram Moolenaar    while lnum > 0
36071d4279SBram Moolenaar	let lnum = prevnonblank(lnum - 1)
37071d4279SBram Moolenaar	let previous_line = getline(lnum)
38071d4279SBram Moolenaar	if previous_line !~? LABELS_OR_PREPROC
39071d4279SBram Moolenaar	    break
40071d4279SBram Moolenaar	endif
41071d4279SBram Moolenaar    endwhile
42071d4279SBram Moolenaar
43071d4279SBram Moolenaar    " Hit the start of the file, use zero indent.
44071d4279SBram Moolenaar    if lnum == 0
45071d4279SBram Moolenaar	return 0
46071d4279SBram Moolenaar    endif
47071d4279SBram Moolenaar
48071d4279SBram Moolenaar    let ind = indent(lnum)
49071d4279SBram Moolenaar
50071d4279SBram Moolenaar    " Add
518ada2ccaSBram Moolenaar    if previous_line =~? '^\s*\<\(begin\|\%(\%(private\|public\|friend\)\s\+\)\=\%(function\|sub\|property\)\|select\|case\|default\|if\|else\|elseif\|do\|for\|while\|enum\|with\)\>'
52*3ec574f2SBram Moolenaar	let ind = ind + shiftwidth()
53071d4279SBram Moolenaar    endif
54071d4279SBram Moolenaar
55071d4279SBram Moolenaar    " Subtract
56071d4279SBram Moolenaar    if this_line =~? '^\s*\<end\>\s\+\<select\>'
57071d4279SBram Moolenaar	if previous_line !~? '^\s*\<select\>'
58*3ec574f2SBram Moolenaar	    let ind = ind - 2 * shiftwidth()
59071d4279SBram Moolenaar	else
60071d4279SBram Moolenaar	    " this case is for an empty 'select' -- 'end select'
61071d4279SBram Moolenaar	    " (w/o any case statements) like:
62071d4279SBram Moolenaar	    "
63071d4279SBram Moolenaar	    " select case readwrite
64071d4279SBram Moolenaar	    " end select
65*3ec574f2SBram Moolenaar	    let ind = ind - shiftwidth()
66071d4279SBram Moolenaar	endif
6759c0395eSBram Moolenaar    elseif this_line =~? '^\s*\<\(end\|else\|elseif\|until\|loop\|next\|wend\)\>'
68*3ec574f2SBram Moolenaar	let ind = ind - shiftwidth()
69071d4279SBram Moolenaar    elseif this_line =~? '^\s*\<\(case\|default\)\>'
70071d4279SBram Moolenaar	if previous_line !~? '^\s*\<select\>'
71*3ec574f2SBram Moolenaar	    let ind = ind - shiftwidth()
72071d4279SBram Moolenaar	endif
73071d4279SBram Moolenaar    endif
74071d4279SBram Moolenaar
75071d4279SBram Moolenaar    return ind
76071d4279SBram Moolenaarendfun
7759c0395eSBram Moolenaar
7859c0395eSBram Moolenaar" vim:sw=4
79