mirror of
				https://github.com/vim/vim.git
				synced 2025-10-31 09:57:14 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			79 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
| " 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
 |