updated for version 7.0082
diff --git a/runtime/indent/pascal.vim b/runtime/indent/pascal.vim
new file mode 100644
index 0000000..b67071c
--- /dev/null
+++ b/runtime/indent/pascal.vim
@@ -0,0 +1,173 @@
+" Vim indent file
+" Language:    Pascal
+" Maintainer:  Neil Carter <n.carter@swansea.ac.uk>
+" Created:     2004 Jul 13
+" Last Change: 2005 Jun 07
+" TODO: Reduce indentation on line after a statement that flowed across
+" two lines (e.g. parameter list closed on second line). Also, increase
+" indent of a becomes-statement that flows onto second line.
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+   finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetPascalIndent(v:lnum)
+" Appending an & to an option sets it to its default value.
+setlocal indentkeys&
+setlocal indentkeys+=~end;,=~const,=~type,=~var,=~begin,=~repeat,=~until,=~for
+setlocal indentkeys+=~program,=~function,=~procedure,=~object,=~private
+setlocal indentkeys+=~record,=~if,=~else,=~case
+
+if exists("*GetPascalIndent")
+	finish
+endif
+
+
+function s:GetPrevLineNum( line_num )
+	
+	" Skip over comments and conditional directives
+	let SKIP_LINES = '^\s*\((\*\)\|\(\*\ \)\|\(\*)\)\|\({\$\)'
+	
+	let nline = a:line_num
+	while nline > 0
+		let nline = prevnonblank(nline-1)
+		if getline(nline) !~? SKIP_LINES
+			break
+		endif
+	endwhile
+	
+"	call input( "nline = ".nline )
+	
+	return nline
+
+endfunction
+
+
+function! GetPascalIndent( line_num )
+	if a:line_num == 0
+		return 0
+	endif
+
+	" If in the middle of a three-part comment
+	if getline( a:line_num ) =~ '^\s*\*\ '
+		return indent( a:line_num )
+	endif
+	
+	" We have to subtract one to start on the line before the current
+	" one. Otherwise, prevnonblank() returns the current line!
+	let prev_line_num = s:GetPrevLineNum( a:line_num )
+	let prev_line = getline( prev_line_num )
+	let indnt = indent( prev_line_num )
+
+	let this_line = getline( a:line_num )
+
+	" At the start of a block, we have to indent the newly-created line
+	" based on the previous line.
+	" =~ means matches a regular expression
+	" a question mark after =~ means ignore case (# means match case)
+	" const, type, var should always appear at the start of a line, but
+	" begin can appear anywhere in the line.
+	" if one of the following keywords appear in the previous line with
+	" nothing before it but optional whitespace, and nothing after it.
+	" Has to be end of line at end to show this is not a routine
+	" parameter list. Otherwise, you'd end up with cascading vars.
+	
+	" These words appear alone on a line (apart from whitespace).
+	if prev_line =~ '^\s*\(const\|var\|begin\|repeat\|private\)$'
+		" Place an & before an option to obtain its value.
+		let indnt = indnt + &shiftwidth
+	endif
+
+	" Words preceded by optional whitespace and followed by anything.
+	if prev_line =~ '^\s*\(for\|if\|else\|case\)'
+		" Place an & before an option to obtain its value.
+		let indnt = indnt + &shiftwidth
+		" if this is a multistatement block then we need to align the
+		" begin with the previous line.
+		if this_line =~ '^\s*begin'
+			let indnt = indnt - &shiftwidth
+		endif
+	endif
+	" These words may have text before them on the line (hence the .*).
+	if prev_line =~ '^.*\s*\<\(object\|record\)\>$'
+		let indnt = indnt + &shiftwidth
+	endif
+	" If we have opened a bracket and the contents spills over one line,
+	" then indent one level beyond the bracket's first line. RE = an
+	" opening bracket followed by any amount of anything other than a
+	" closing bracket and then the end-of-line. If we didn't include the
+	" end of line, this RE would match even closed brackets, since it
+	" would match everything up to the closing bracket.
+	" This test isn't clever enough to handle brackets inside strings or
+	" comments.
+	if prev_line =~ '([^*][^)]*$'
+		let indnt = indnt + &shiftwidth
+	endif
+	
+	" If we just closed a bracket that started on a previous line, then
+	" unindent.
+	if prev_line =~ '^[^(]*[^*])'
+		let indnt = indnt - &shiftwidth
+	endif
+
+	" At the end of a block, we have to unindent both the current line
+	" (the 'end;' for instance) and the newly-created line.
+	if this_line =~ '^\s*\(end;\|until\|else\)'
+		let indnt = indnt - &shiftwidth
+	endif
+
+	" Keywords that always appear at the start of a line.
+	" Problem is that function and procedure keywords should be indented
+	" if within a class declaration.
+	if this_line =~ '^\s*\<type\|uses\|$IFDEF\|$ENDIF\|procedure\|function\>'
+		let indnt = 0
+	endif
+	if prev_line =~ '^\s*\<type\|uses\>'
+		let indnt = &shiftwidth
+	endif
+	
+	" Put conditional compile directives on first column.
+	if this_line =~ '^\s*{\$'
+		let indnt = 0
+	endif
+	
+	return indnt
+endfunction
+
+" TODO: end; should align with the previous (begin/record/object/else).
+" "else begin" is the only case where begin does not appear at the start
+" of the line.
+
+" TODO: Don't align with {$IFDEF}
+
+"Example from vb.vim
+" regular expression match, case insensitive
+"if previous_line =~? 
+" start of line, zero or more whitespace
+"'^\s*
+" start of word
+"\<
+" 
+"\(
+"	begin\|
+"	\%(
+"		\%(
+"			private\|public\|friend
+"		\)
+"		\s\+
+"	\)
+"	zero or more of the previous atom
+"	\=
+"	\%(
+"		function\|sub\|property
+"	\)
+"	\|select\|case\|default\|if
+"\>
+"	.\{-}\<then\>\s*$\|else\|elseif\|do\|for\|while\|enum\|with
+"\)
+" end of word
+"\>'
+"	let ind = ind + &sw
+"endif