Patch 7.1.299
Problem:    Filetype detection doesn't work properly for file names ending in
            a part that is ignored and contain a space or other special
            characters.
Solution:   Escape the special characters using the new fnameescape function.
Files:      runtime/doc/eval.txt, runtime/filetype.vim, src/eval.c,
            src/ex_getln.c, src/proto/ex_getln.pro, src/vim.h


*** ../vim-7.1.298/runtime/doc/eval.txt Wed Feb 20 20:09:44 2008
--- runtime/doc/eval.txt        Wed May 28 16:42:42 2008
***************
*** 1,4 ****
! *eval.txt*      For Vim version 7.1.  Last change: 2008 Feb 20
  
  
                  VIM REFERENCE MANUAL    by Bram Moolenaar
--- 1,4 ----
! *eval.txt*      For Vim version 7.1.  Last change: 2008 May 28
  
  
                  VIM REFERENCE MANUAL    by Bram Moolenaar
***************
*** 1609,1614 ****
--- 1652,1658 ----
                                String  find directory {name} in {path}
  findfile( {name}[, {path}[, {count}]])
                                String  find file {name} in {path}
+ fnameescape( {fname})         String  escape special characters in {fname}
  fnamemodify( {fname}, {mods}) String  modify file name
  foldclosed( {lnum})           Number  first line of fold at {lnum} if closed
  foldclosedend( {lnum})                Number  last line of fold at {lnum} if 
closed
***************
*** 2620,2625 ****
--- 2669,2687 ----
  <             Searches from the directory of the current file upwards until
                it finds the file "tags.vim".
  
+ fnameescape({string})                                 *fnameescape()*
+               Escape {string} for use as file name command argument.  All
+               characters that have a special meaning, such as '%' and '|'
+               are escaped with a backslash.
+               For most systems the characters escaped are "".  For systems
+               where a backslash appears in a filename, it depends on the
+               value of 'isfname'.
+               Example: >
+                       :let fname = 'some str%nge|name'
+                       :exe "edit " . fnameescape(fname)
+ <             results in executing: >
+                       edit some\ str\%nge\|name
+ 
  fnamemodify({fname}, {mods})                          *fnamemodify()*
                Modify file name {fname} according to {mods}.  {mods} is a
                string of characters like it is used for file names on the
*** ../vim-7.1.298/runtime/filetype.vim Tue May 15 09:14:33 2007
--- runtime/filetype.vim        Wed May 28 16:39:09 2008
***************
*** 16,35 ****
  augroup filetypedetect
  
  " Ignored extensions
  au BufNewFile,BufRead ?\+.orig,?\+.bak,?\+.old,?\+.new,?\+.rpmsave,?\+.rpmnew
!       \ exe "doau filetypedetect BufRead " . expand("<afile>:r")
  au BufNewFile,BufRead *~
        \ let s:name = expand("<afile>") |
        \ let s:short = substitute(s:name, '\~$', '', '') |
        \ if s:name != s:short && s:short != "" |
!       \   exe "doau filetypedetect BufRead " . s:short |
        \ endif |
!       \ unlet s:name |
!       \ unlet s:short
  au BufNewFile,BufRead ?\+.in
        \ if expand("<afile>:t") != "configure.in" |
!       \   exe "doau filetypedetect BufRead " . expand("<afile>:r") |
        \ endif
  
  " Pattern used to match file names which should not be inspected.
  " Currently finds compressed files.
--- 16,38 ----
  augroup filetypedetect
  
  " Ignored extensions
+ if exists("*fnameescape")
  au BufNewFile,BufRead ?\+.orig,?\+.bak,?\+.old,?\+.new,?\+.rpmsave,?\+.rpmnew
!       \ exe "doau filetypedetect BufRead " . fnameescape(expand("<afile>:r"))
  au BufNewFile,BufRead *~
        \ let s:name = expand("<afile>") |
        \ let s:short = substitute(s:name, '\~$', '', '') |
        \ if s:name != s:short && s:short != "" |
!       \   exe "doau filetypedetect BufRead " . fnameescape(s:short) |
        \ endif |
!       \ unlet s:name s:short
  au BufNewFile,BufRead ?\+.in
        \ if expand("<afile>:t") != "configure.in" |
!       \   exe "doau filetypedetect BufRead " . 
fnameescape(expand("<afile>:r")) |
        \ endif
+ elseif &verbose > 0
+   echomsg "Warning: some filetypes will not be recognized because this 
version of Vim does not have fnameescape()"
+ endif
  
  " Pattern used to match file names which should not be inspected.
  " Currently finds compressed files.
*** ../vim-7.1.298/src/eval.c   Tue Apr  1 13:10:45 2008
--- src/eval.c  Wed May 28 16:35:51 2008
***************
*** 507,512 ****
--- 516,522 ----
  static void f_filter __ARGS((typval_T *argvars, typval_T *rettv));
  static void f_finddir __ARGS((typval_T *argvars, typval_T *rettv));
  static void f_findfile __ARGS((typval_T *argvars, typval_T *rettv));
+ static void f_fnameescape __ARGS((typval_T *argvars, typval_T *rettv));
  static void f_fnamemodify __ARGS((typval_T *argvars, typval_T *rettv));
  static void f_foldclosed __ARGS((typval_T *argvars, typval_T *rettv));
  static void f_foldclosedend __ARGS((typval_T *argvars, typval_T *rettv));
***************
*** 7107,7112 ****
--- 7437,7443 ----
      {"filter",                2, 2, f_filter},
      {"finddir",               1, 3, f_finddir},
      {"findfile",      1, 3, f_findfile},
+     {"fnameescape",   1, 1, f_fnameescape},
      {"fnamemodify",   2, 2, f_fnamemodify},
      {"foldclosed",    1, 1, f_foldclosed},
      {"foldclosedend", 1, 1, f_foldclosedend},
***************
*** 9465,9470 ****
--- 9804,9822 ----
  }
  
  /*
+  * "fnameescape({string})" function
+  */
+     static void
+ f_fnameescape(argvars, rettv)
+     typval_T  *argvars;
+     typval_T  *rettv;
+ {
+     rettv->vval.v_string = vim_strsave_fnameescape(
+                                          get_tv_string(&argvars[0]), FALSE);
+     rettv->v_type = VAR_STRING;
+ }
+ 
+ /*
   * "fnamemodify({fname}, {mods})" function
   */
      static void
*** ../vim-7.1.298/src/ex_getln.c       Tue Jan 22 12:44:03 2008
--- src/ex_getln.c      Mon May 26 22:14:51 2008
***************
*** 3656,3677 ****
  #endif
                    }
                }
! #ifdef BACKSLASH_IN_FILENAME
!               {
!                   char_u      buf[20];
!                   int         j = 0;
! 
!                   /* Don't escape '[' and '{' if they are in 'isfname'. */
!                   for (p = PATH_ESC_CHARS; *p != NUL; ++p)
!                       if ((*p != '[' && *p != '{') || !vim_isfilec(*p))
!                           buf[j++] = *p;
!                   buf[j] = NUL;
!                   p = vim_strsave_escaped(files[i], buf);
!               }
! #else
!               p = vim_strsave_escaped(files[i],
!                            xp->xp_shell ? SHELL_ESC_CHARS : PATH_ESC_CHARS);
! #endif
                if (p != NULL)
                {
                    vim_free(files[i]);
--- 3656,3662 ----
  #endif
                    }
                }
!               p = vim_strsave_fnameescape(files[i], xp->xp_shell);
                if (p != NULL)
                {
                    vim_free(files[i]);
***************
*** 3710,3715 ****
--- 3695,3725 ----
  }
  
  /*
+  * Escape special characters in "fname" for when used as a file name argument
+  * after a Vim command, or, when "shell" is non-zero, a shell command.
+  * Returns the result in allocated memory.
+  */
+     char_u *
+ vim_strsave_fnameescape(fname, shell)
+     char_u *fname;
+     int    shell;
+ {
+ #ifdef BACKSLASH_IN_FILENAME
+     char_u    buf[20];
+     int               j = 0;
+ 
+     /* Don't escape '[' and '{' if they are in 'isfname'. */
+     for (p = PATH_ESC_CHARS; *p != NUL; ++p)
+       if ((*p != '[' && *p != '{') || !vim_isfilec(*p))
+           buf[j++] = *p;
+     buf[j] = NUL;
+     return vim_strsave_escaped(fname, buf);
+ #else
+     return vim_strsave_escaped(fname, shell ? SHELL_ESC_CHARS : 
PATH_ESC_CHARS);
+ #endif
+ }
+ 
+ /*
   * Put a backslash before the file name in "pp", which is in allocated memory.
   */
      static void
*** ../vim-7.1.298/src/proto/ex_getln.pro       Sat May  5 19:24:48 2007
--- src/proto/ex_getln.pro      Mon May 26 22:14:41 2008
***************
*** 24,29 ****
--- 24,30 ----
  void ExpandInit __ARGS((expand_T *xp));
  void ExpandCleanup __ARGS((expand_T *xp));
  void ExpandEscape __ARGS((expand_T *xp, char_u *str, int numfiles, char_u 
**files, int options));
+ char_u *vim_strsave_fnameescape __ARGS((char_u *fname, int shell));
  void tilde_replace __ARGS((char_u *orig_pat, int num_files, char_u **files));
  char_u *sm_gettail __ARGS((char_u *s));
  char_u *addstar __ARGS((char_u *fname, int len, int context));
*** ../vim-7.1.298/src/vim.h    Sun Mar 16 16:02:47 2008
--- src/vim.h   Wed May 28 16:37:50 2008
***************
*** 336,345 ****
  # endif
  #endif
  #ifdef BACKSLASH_IN_FILENAME
! # define PATH_ESC_CHARS ((char_u *)" \t*?[{`%#")
  #else
! # define PATH_ESC_CHARS ((char_u *)" \t*?[{`$\\%#'\"|")
! # define SHELL_ESC_CHARS ((char_u *)" \t*?[{`$\\%#'\"|<>();&!")
  #endif
  
  #define NUMBUFLEN 30      /* length of a buffer to store a number in ASCII */
--- 336,345 ----
  # endif
  #endif
  #ifdef BACKSLASH_IN_FILENAME
! # define PATH_ESC_CHARS ((char_u *)" \t\n*?[{`%#'\"|!<")
  #else
! # define PATH_ESC_CHARS ((char_u *)" \t\n*?[{`$\\%#'\"|!<")
! # define SHELL_ESC_CHARS ((char_u *)" \t\n*?[{`$\\%#'\"|!<>();&")
  #endif
  
  #define NUMBUFLEN 30      /* length of a buffer to store a number in ASCII */
*** ../vim-7.1.298/src/version.c        Sat May 10 21:37:56 2008
--- src/version.c       Wed May 28 16:40:11 2008
***************
*** 668,669 ****
--- 673,676 ----
  {   /* Add new patch number below this line */
+ /**/
+     299,
  /**/

-- 
FIRST SOLDIER:  So they wouldn't be able to bring a coconut back anyway.
SECOND SOLDIER: Wait a minute! Suppose two swallows carried it together?
FIRST SOLDIER:  No, they'd have to have it on a line.
                 "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD

 /// Bram Moolenaar -- [EMAIL PROTECTED] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\        download, build and distribute -- http://www.A-A-P.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

--~--~---------~--~----~------------~-------~--~----~
You received this message from the "vim_dev" maillist.
For more information, visit http://www.vim.org/maillist.php
-~----------~----~----~----~------~----~------~--~---

Raspunde prin e-mail lui