diff options
Diffstat (limited to '')
-rw-r--r-- | runtime/indent/vb.vim | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/runtime/indent/vb.vim b/runtime/indent/vb.vim new file mode 100644 index 0000000..4d05345 --- /dev/null +++ b/runtime/indent/vb.vim @@ -0,0 +1,78 @@ +" Vim indent file +" Language: VisualBasic (ft=vb) / Basic (ft=basic) / SaxBasic (ft=vb) +" Author: Johannes Zellner <johannes@zellner.org> +" Last Change: Fri, 18 Jun 2004 07:22:42 CEST +" Small update 2010 Jul 28 by Maxim Kim + +if exists("b:did_indent") + finish +endif +let b:did_indent = 1 + +setlocal autoindent +setlocal indentexpr=VbGetIndent(v:lnum) +setlocal indentkeys& +setlocal indentkeys+==~else,=~elseif,=~end,=~wend,=~case,=~next,=~select,=~loop,<:> + +let b:undo_indent = "set ai< indentexpr< indentkeys<" + +" Only define the function once. +if exists("*VbGetIndent") + finish +endif + +fun! VbGetIndent(lnum) + " labels and preprocessor get zero indent immediately + let this_line = getline(a:lnum) + let LABELS_OR_PREPROC = '^\s*\(\<\k\+\>:\s*$\|#.*\)' + if this_line =~? LABELS_OR_PREPROC + 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 + 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*\<\(begin\|\%(\%(private\|public\|friend\)\s\+\)\=\%(function\|sub\|property\)\|select\|case\|default\|if\|else\|elseif\|do\|for\|while\|enum\|with\)\>' + let ind = ind + shiftwidth() + endif + + " Subtract + if this_line =~? '^\s*\<end\>\s\+\<select\>' + if previous_line !~? '^\s*\<select\>' + let ind = ind - 2 * shiftwidth() + else + " this case is for an empty 'select' -- 'end select' + " (w/o any case statements) like: + " + " select case readwrite + " end select + let ind = ind - shiftwidth() + endif + elseif this_line =~? '^\s*\<\(end\|else\|elseif\|until\|loop\|next\|wend\)\>' + let ind = ind - shiftwidth() + elseif this_line =~? '^\s*\<\(case\|default\)\>' + if previous_line !~? '^\s*\<select\>' + let ind = ind - shiftwidth() + endif + endif + + return ind +endfun + +" vim:sw=4 |