updated for version 7.2c-000
diff --git a/runtime/ftplugin/ocaml.vim b/runtime/ftplugin/ocaml.vim
index 53431c9..7acf493 100644
--- a/runtime/ftplugin/ocaml.vim
+++ b/runtime/ftplugin/ocaml.vim
@@ -5,7 +5,8 @@
 "              Stefano Zacchiroli  <zack@bononia.it>
 "              Vincent Aravantinos <firstname.name@imag.fr>
 " URL:         http://www.ocaml.info/vim/ftplugin/ocaml.vim
-" Last Change: 2007 Sep 09 - Added .annot support for ocamlbuild, python not 
+" Last Change: 2008 Jul 17 - Bugfix related to fnameescape (VA)
+"              2007 Sep 09 - Added .annot support for ocamlbuild, python not 
 "                            needed anymore (VA)
 "              2006 May 01 - Added .annot support for file.whateverext (SZ)
 "	             2006 Apr 11 - Fixed an initialization bug; fixed ASS abbrev (MM)
@@ -16,6 +17,17 @@
 endif
 let b:did_ftplugin=1
 
+" some macro
+if exists('*fnameescape')
+  function! s:Fnameescape(s)
+    return fnameescape(a:s)
+  endfun
+else
+  function! s:Fnameescape(s)
+    return escape(a:s," \t\n*?[{`$\\%#'\"|!<")
+  endfun
+endif
+
 " Error handling -- helps moving where the compiler wants you to go
 let s:cposet=&cpoptions
 set cpo-=C
@@ -71,14 +83,14 @@
   map <LocalLeader>S :call OCaml_switch(1)<CR>
   fun OCaml_switch(newwin)
     if (match(bufname(""), "\\.mli$") >= 0)
-      let fname = substitute(bufname(""), "\\.mli$", ".ml", "")
+      let fname = s:Fnameescape(substitute(bufname(""), "\\.mli$", ".ml", ""))
       if (a:newwin == 1)
         exec "new " . fname
       else
         exec "arge " . fname
       endif
     elseif (match(bufname(""), "\\.ml$") >= 0)
-      let fname = bufname("") . "i"
+      let fname = s:Fnameescape(bufname("")) . "i"
       if (a:newwin == 1)
         exec "new " . fname
       else
@@ -260,6 +272,7 @@
   "      For the moment, the only possible keyword is \"type\"."
   " >>
 
+
 " 1. Finding the annotation file even if we use ocamlbuild
 
     " In:  two strings representing paths
@@ -286,16 +299,16 @@
   function! s:Locate_annotation()
     if !b:annotation_file_located
 
-      silent exe 'cd' expand('%:p:h')
+      silent exe 'cd' s:Fnameescape(expand('%:p:h'))
 
-      let annot_file_name = expand('%:r').'.annot'
+      let annot_file_name = s:Fnameescape(expand('%:r')).'.annot'
 
       " 1st case : the annot file is in the same directory as the buffer (no ocamlbuild)
       let b:annot_file_path = findfile(annot_file_name,'.')
       if b:annot_file_path != ''
         let b:annot_file_path = getcwd().'/'.b:annot_file_path
         let b:_build_path = ''
-        let b:source_file_relative_path = expand('%')
+        let b:source_file_relative_path = s:Fnameescape(expand('%'))
       else
         " 2nd case : the buffer and the _build directory are in the same directory
         "      ..
@@ -310,7 +323,7 @@
           if b:annot_file_path != ''
             let b:annot_file_path = getcwd().'/'.b:annot_file_path
           endif
-          let b:source_file_relative_path = expand('%')
+          let b:source_file_relative_path = s:Fnameescape(expand('%'))
         else
           " 3rd case : the _build directory is in a directory higher in the file hierarchy 
           "            (it can't be deeper by ocamlbuild requirements)
@@ -325,9 +338,9 @@
           let b:_build_path = finddir('_build',';')
           if b:_build_path != ''
             let project_path                = substitute(b:_build_path,'/_build$','','')
-            let path_relative_to_project    = substitute(expand('%:p:h'),project_path.'/','','')
+            let path_relative_to_project    = s:Fnameescape(substitute(expand('%:p:h'),project_path.'/','',''))
             let b:annot_file_path           = findfile(annot_file_name,project_path.'/_build/'.path_relative_to_project)
-            let b:source_file_relative_path = substitute(expand('%:p'),project_path.'/','','')
+            let b:source_file_relative_path = s:Fnameescape(substitute(expand('%:p'),project_path.'/','',''))
           else
             let b:annot_file_path = findfile(annot_file_name,'**')
             "4th case : what if the user decided to change the name of the _build directory ?
@@ -339,7 +352,7 @@
                 let b:annot_file_path = getcwd().'/'.b:annot_file_path
                 let b:_build_path     = getcwd().'/'.b:_build_path
               endif
-              let b:source_file_relative_path = expand('%')
+              let b:source_file_relative_path = s:Fnameescape(expand('%'))
             else
               " 4b. anarchy : the renamed _build directory may be higher in the hierarchy
               " this will work if the file for which we are looking annotations has a unique name in the whole project
@@ -380,16 +393,16 @@
       set hidden
       let s:current_buf = bufname('%')
       if bufloaded(b:annot_file_path)
-        silent exe 'keepj keepalt' 'buffer' b:annot_file_path
+        silent exe 'keepj keepalt' 'buffer' s:Fnameescape(b:annot_file_path)
       else
-        silent exe 'keepj keepalt' 'view' b:annot_file_path
+        silent exe 'keepj keepalt' 'view' s:Fnameescape(b:annot_file_path)
       endif
     endfun
 
       " After call:
       "   The original buffer has been restored in the exact same state as before.
     function! s:Exit_annotation_buffer()
-      silent exe 'keepj keepalt' 'buffer' s:current_buf
+      silent exe 'keepj keepalt' 'buffer' s:Fnameescape(s:current_buf)
       let &l:hidden = s:current_hidden
       call setpos('.',s:current_pos)
     endfun