updated for version 7.0012
diff --git a/runtime/indent/ocaml.vim b/runtime/indent/ocaml.vim
index a26b4bc..634d693 100644
--- a/runtime/indent/ocaml.vim
+++ b/runtime/indent/ocaml.vim
@@ -1,12 +1,12 @@
 " Vim indent file
-" Language:	OCaml
-" Maintainers:	Jean-Francois Yuen  <jfyuen@ifrance.com>
-"		Mike Leary	    <leary@nwlink.com>
-"		Markus Mottl	    <markus@oefai.at>
-" URL:		http://www.oefai.at/~markus/vim/indent/ocaml.vim
-" Last Change:	2003 Apr 14
-"		2003 Mar 05 - Added '{<' and some fixes (JY)
-"		2002 Nov 06 - Some fixes (JY)
+" Language:     OCaml
+" Maintainers:  Jean-Francois Yuen  <jfyuen@happycoders.org>
+"               Mike Leary          <leary@nwlink.com>
+"               Markus Mottl        <markus@oefai.at>
+" URL:          http://www.oefai.at/~markus/vim/indent/ocaml.vim
+" Last Change:  2004 Apr 11 - Added indent for 'class' (JY)
+"               2003 Sep 16 - Added 'private' as keyword (JY)
+"               2003 Mar 29 - Fixed bug with 'if' and 'else' (JY)
 
 " Only load this indent file when no other was loaded.
 if exists("b:did_indent")
@@ -16,7 +16,7 @@
 
 setlocal expandtab
 setlocal indentexpr=GetOCamlIndent()
-setlocal indentkeys+=0=and,0=constraint,0=done,0=else,0=end,0=exception,0=external,0=if,0=in,0=include,0=inherit,0=initializer,0=let,0=method,0=open,0=then,0=type,0=val,0=with,0=;;,0=>\],0=\|\],0=\|,0=*),0=>},0},0\],0)
+setlocal indentkeys+=0=and,0=class,0=constraint,0=done,0=else,0=end,0=exception,0=external,0=if,0=in,0=include,0=inherit,0=initializer,0=let,0=method,0=open,0=then,0=type,0=val,0=with,0;;,0>\],0\|\],0>},0\|,0},0\],0)
 setlocal nolisp
 setlocal nosmartindent
 setlocal textwidth=80
@@ -33,14 +33,13 @@
 endif
 
 " Define some patterns:
-let s:beflet = '^\s*\(initializer\|method\|try\)\|\(\<\(begin\|do\|else\|in\|then\|try\)\|->\|;\|(\)\s*$'
+let s:beflet = '^\s*\(initializer\|method\|try\)\|\(\<\(begin\|do\|else\|in\|then\|try\)\|->\|<-\|=\|;\|(\)\s*$'
 let s:letpat = '^\s*\(let\|type\|module\|class\|open\|exception\|val\|include\|external\)\>'
 let s:letlim = '\(\<\(sig\|struct\)\|;;\)\s*$'
 let s:lim = '^\s*\(exception\|external\|include\|let\|module\|open\|type\|val\)\>'
 let s:module = '\<\%(begin\|sig\|struct\|object\)\>'
 let s:obj = '^\s*\(constraint\|inherit\|initializer\|method\|val\)\>\|\<\(object\|object\s*(.*)\)\s*$'
-let s:type = '^\s*\%(let\|type\)\>.*='
-let s:val = '^\s*\(val\|external\)\>.*:'
+let s:type = '^\s*\%(class\|let\|type\)\>.*='
 
 " Skipping pattern, for comments
 function s:SkipPattern(lnum, pat)
@@ -75,7 +74,7 @@
 " Indent 'let'
 function s:FindLet(pstart, pmid, pend)
   call search(a:pend, 'bW')
-  return indent(searchpair(a:pstart, a:pmid, a:pend, 'bWn', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment" || getline(".") =~ "^\\s*let\\>.*=.*\\<in\\s*$" || getline(prevnonblank(".") - 1) =~ "^\\s*let\\>.*=\\s*$\\|" . s:beflet'))
+  return indent(searchpair(a:pstart, a:pmid, a:pend, 'bWn', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment" || getline(".") =~ "^\\s*let\\>.*=.*\\<in\\s*$" || getline(prevnonblank(".") - 1) =~ s:beflet'))
 endfunction
 
 function GetOCamlIndent()
@@ -97,8 +96,7 @@
 
   let line = getline(v:lnum)
 
-  " Indent if current line begins with 'end'
-  " for 'sig', 'struct', 'object' and 'begin':
+  " Indent if current line begins with 'end':
   if line =~ '^\s*end\>'
     return s:FindPair(s:module, '','\<end\>')
 
@@ -118,27 +116,25 @@
   elseif line =~ '^\s*)'
     return s:FindPair('(', '',')')
 
-  " Indent if current line begins with 'let'
-  " and last line does not begin with 'let' or end with 'in' or ';;':
+  " Indent if current line begins with 'let':
   elseif line =~ '^\s*let\>'
     if lline !~ s:lim . '\|' . s:letlim . '\|' . s:beflet
       return s:FindLet(s:type, '','\<let\s*$')
     else return ind
     endif
 
-  " Indent if current line begins with 'type'
-  " and last line does not end with 'and' or ';;':
-  elseif line =~ '^\s*type\>'
+  " Indent if current line begins with 'class' or 'type':
+  elseif line =~ '^\s*\(class\|type\)\>'
     if lline !~ s:lim . '\|\<and\s*$\|' . s:letlim
-      return s:FindLet(s:type, '','\<type\s*$')
+      return s:FindLet(s:type, '','\<\(class\|type\)\s*$')
     else return ind
     endif
 
   " Indent for pattern matching:
   elseif line =~ '^\s*|'
-    if lline !~ '^\s*\(|\|\(match\|with\|type\)\>\)\|\<\(function\|parser\|with\)\s*$'
+    if lline !~ '^\s*\(|[^\]]\|\(match\|type\|with\)\>\)\|\<\(function\|parser\|private\|with\)\s*$'
       call search('|', 'bW')
-      return indent(searchpair('^\s*\(type\|match\)\>\|\<\(with\|function\|parser\)\s*$', '', '|', 'bWn', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment" || getline(".") =~ "\\[|\\||\\]" && getline(".") !~ "^\\s*|.*->"'))
+      return indent(searchpair('^\s*\(match\|type\)\>\|\<\(function\|parser\|private\|with\)\s*$', '', '^\s*|', 'bWn', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment" || getline(".") !~ "^\\s*|.*->"'))
     else return ind
     endif
 
@@ -149,41 +145,35 @@
     else return ind
     endif
 
-  " Indent if current line begins with 'in' and previous
-  " line does not start with 'let' or 'and':
+  " Indent if current line begins with 'in':
   elseif line =~ '^\s*in\>'
     if lline !~ '^\s*\(let\|and\)\>'
       return s:FindPair('\<let\>', '', '\<in\>')
     else return ind
     endif
 
-  " Indent if current line begins with 'else'
-  " and previous line does not start with 'if', 'then' or 'else':
+  " Indent if current line begins with 'else':
   elseif line =~ '^\s*else\>'
-    if lline !~ '^\s*\(if\|else\|then\)\>'
+    if lline !~ '^\s*\(if\|then\)\>'
       return s:FindPair('\<if\>', '', '\<else\>')
     else return ind
     endif
 
-  " Indent if current line begins with 'then'
-  " and previous line does not start with 'if', 'then' or 'else':
+  " Indent if current line begins with 'then':
   elseif line =~ '^\s*then\>'
-    if lline !~ '^\s*\(if\|else\|then\)\>'
+    if lline !~ '^\s*\(if\|else\)\>'
       return s:FindPair('\<if\>', '', '\<then\>')
     else return ind
     endif
 
-  " Subtract a 'shiftwidth' if current line begins with 'and' and previous
-  " line does not start with 'let', 'and' or 'type' or end with 'end'
-  " (for classes):
+  " Indent if current line begins with 'and':
   elseif line =~ '^\s*and\>'
     if lline !~ '^\s*\(and\|let\|type\)\>\|\<end\s*$'
       return ind - &sw
     else return ind
     endif
 
-  " Indent if current line begins with 'with'
-  " and previous line does not start with 'match' or 'try':
+  " Indent if current line begins with 'with':
   elseif line =~ '^\s*with\>'
     if lline !~ '^\s*\(match\|try\)\>'
       return s:FindPair('\<\%(match\|try\)\>', '','\<with\>')
@@ -193,35 +183,35 @@
   " Indent if current line begins with 'exception':
   elseif line =~ '^\s*exception\>'
     if lline !~ s:lim . '\|' . s:letlim
-      return indent(search(s:val . '\|^\s*\(external\|include\|open\|type\)\>', 'bW'))
+      return indent(search('^\s*\(\(external\|include\|open\|type\)\>\|val\>.*:\)', 'bW'))
     else return ind
     endif
 
   " Indent if current line begins with 'external':
   elseif line =~ '^\s*external\>'
     if lline !~ s:lim . '\|' . s:letlim
-      return indent(search(s:val . '\|^\s*\(exception\|include\|open\|type\)\>', 'bW'))
+      return indent(search('^\s*\(\(exception\|external\|include\|open\|type\)\>\|val\>.*:\)', 'bW'))
     else return ind
     endif
 
   " Indent if current line begins with 'include':
   elseif line =~ '^\s*include\>'
     if lline !~ s:lim . '\|' . s:letlim
-      return indent(search(s:val . '\|^\s*\(exception\|external\|open\|type\)\>', 'bW'))
+      return indent(search('^\s*\(\(exception\|external\|open\|type\)\>\|val\>.*:\)', 'bW'))
     else return ind
     endif
 
   " Indent if current line begins with 'open':
   elseif line =~ '^\s*open\>'
     if lline !~ s:lim . '\|' . s:letlim
-      return indent(search(s:val . '\|^\s*\(exception\|external\|include\|type\)\>', 'bW'))
+      return indent(search('^\s*\(\(exception\|external\|include\|type\)\>\|val\>.*:\)', 'bW'))
     else return ind
     endif
 
   " Indent if current line begins with 'val':
   elseif line =~ '^\s*val\>'
     if lline !~ '^\s*\(exception\|external\|include\|open\)\>\|' . s:obj . '\|' . s:letlim
-      return indent(search(s:val . '\|^\s*\(exception\|include\|initializer\|method\|open\|type\)\>', 'bW'))
+      return indent(search('^\s*\(\(exception\|include\|initializer\|method\|open\|type\|val\)\>\|external\>.*:\)', 'bW'))
     else return ind
     endif
 
@@ -253,15 +243,10 @@
     else return ind
     endif
 
-  " Indent back to normal after comments:
-  elseif line =~ '^\s*\*)'
-    call search('\*)', 'bW')
-    return indent(searchpair('(\*', '', '\*)', 'bWn', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string"'))
-
   endif
 
   " Add a 'shiftwidth' after lines ending with:
-  if lline =~ '\(:\|=\|->\|<-\|(\|\[\|{\|{<\|\[|\|\[<\|\<\(begin\|struct\|sig\|functor\|initializer\|object\|try\|do\|if\|then\|else\|fun\|function\|parser\)\|\<object\s*(.*)\)\s*$'
+  if lline =~ '\(:\|=\|->\|<-\|(\|\[\|{\|{<\|\[|\|\[<\|\<\(begin\|do\|else\|fun\|function\|functor\|if\|initializer\|object\|parser\|private\|sig\|struct\|then\|try\)\|\<object\s*(.*)\)\s*$'
     let ind = ind + &sw
 
   " Back to normal indent after lines ending with ';;':