diff --git a/runtime/indent/pascal.vim b/runtime/indent/pascal.vim
index b67071c..7085287 100644
--- a/runtime/indent/pascal.vim
+++ b/runtime/indent/pascal.vim
@@ -1,173 +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
+" Vim indent file
+" Language:    Pascal
+" Maintainer:  Neil Carter <n.carter@swansea.ac.uk>
+" Created:     2004 Jul 13
+" Last Change: 2005 Jun 15
+
+
+if exists("b:did_indent")
+	finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetPascalIndent(v:lnum)
+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:GetPrevNonCommentLineNum( line_num )
+
+	" Skip lines starting with a comment
+	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
+
+	return nline
+endfunction
+
+
+function! GetPascalIndent( line_num )
+	" Line 0 always goes at column 0
+	if a:line_num == 0
+		return 0
+	endif
+
+	let this_codeline = getline( a:line_num )
+
+	" If in the middle of a three-part comment
+	if this_codeline =~ '^\s*\*'
+		return indent( a:line_num )
+	endif
+
+	let prev_codeline_num = s:GetPrevNonCommentLineNum( a:line_num )
+	let prev_codeline = getline( prev_codeline_num )
+	let indnt = indent( prev_codeline_num )
+
+	" Compiler directives should always go in column zero.
+	if this_codeline =~ '^\s*{\(\$IFDEF\|\$ELSE\|\$ENDIF\)'
+		return 0
+	endif
+
+	" These items have nothing before or after (not even a comment), and
+	" go on column 0. Make sure that the ^\s* is followed by \( to make
+	" ORs work properly, and not include the start of line (this must
+	" always appear).
+	" The bracketed expression with the underline is a routine
+	" separator. This is one case where we do indent comment lines.
+	if this_codeline =~ '^\s*\((\*\ _\+\ \*)\|\<\(const\|var\)\>\)$'
+		return 0
+	endif
+
+	" These items may have text after them, and go on column 0 (in most
+	" cases). The problem is that "function" and "procedure" keywords
+	" should be indented if within a class declaration.
+	if this_codeline =~ '^\s*\<\(program\|type\|uses\|procedure\|function\)\>'
+		return 0
+	endif
+
+	" BEGIN
+	" If the begin does not come after "if", "for", or "else", then it
+	" goes in column 0
+	if this_codeline =~ '^\s*begin\>' && prev_codeline !~ '^\s*\<\(if\|for\|else\)\>'
+		return 0
+	endif
+
+	" These keywords are indented once only.
+	if this_codeline =~ '^\s*\<\(private\)\>'
+		return &shiftwidth
+	endif
+
+	" If the PREVIOUS LINE contained these items, the current line is
+	" always indented once.
+	if prev_codeline =~ '^\s*\<\(type\|uses\)\>'
+		return &shiftwidth
+	endif
+
+	" These keywords are indented once only. Possibly surrounded by
+	" other chars.
+	if this_codeline =~ '^.\+\<\(object\|record\)\>'
+		return &shiftwidth
+	endif
+
+	" If the previous line was indenting...
+	if prev_codeline =~ '^\s*\<\(for\|if\|case\|else\|end\ else\)\>'
+		" then indent.
+		let indnt = indnt + &shiftwidth
+		" BUT... if this is the start of a multistatement block then we
+		" need to align the begin with the previous line.
+		if this_codeline =~ '^\s*begin\>'
+			return indnt - &shiftwidth
+		endif
+
+		" We also need to keep the indentation level constant if the
+		" whole if-then statement was on one line.
+		if prev_codeline =~ '\<then\>.\+'
+			let indnt = indnt - &shiftwidth
+		endif
+	endif
+
+	" PREVIOUS-LINE BEGIN
+	" If the previous line was an indenting keyword then indent once...
+	if prev_codeline =~ '^\s*\<\(const\|var\|begin\|repeat\|private\)\>'
+		" But only if this is another var in a list.
+		if this_codeline !~ '^\s*var\>'
+			return indnt + &shiftwidth
+		endif
+	endif
+
+	" PREVIOUS-LINE BEGIN
+	" Indent code after a case statement begin
+	if prev_codeline =~ '\:\ begin\>'
+		return indnt + &shiftwidth
+	endif
+
+	" These words may have text before them on the line (hence the .*)
+	" but are followed by nothing. Always indent once only.
+	if prev_codeline =~ '^\(.*\|\s*\)\<\(object\|record\)\>$'
+		return indnt + &shiftwidth
+	endif
+
+	" If we just closed a bracket that started on a previous line, then
+	" unindent. But don't return yet -- we need to check for further
+	" unindentation (for end/until/else)
+	if prev_codeline =~ '^[^(]*[^*])'
+		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_codeline =~ '^\s*\<\(end\|until\|else\)\>'
+		return indnt - &shiftwidth
+	endif
+
+	" If we have opened a bracket and it continues over one line,
+	" then indent once.
+	"
+	" 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_codeline =~ '([^*]\=[^)]*$'
+		return indnt + &shiftwidth
+	endif
+
+	return indnt
+endfunction
+
