# HG changeset patch # User vimboss # Date 1211986198 0 # Node ID fe7db192c7cc7ef3d8cdc6bbd8680833338fd7fe # Parent 4a317df1696281eaee0e54b5c1636186290863a3 updated for version 7.1-299 diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -1,4 +1,4 @@ -*eval.txt* For Vim version 7.1. Last change: 2008 Feb 20 +*eval.txt* For Vim version 7.1. Last change: 2008 May 28 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1609,6 +1609,7 @@ finddir( {name}[, {path}[, {count}]]) 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,6 +2621,19 @@ findfile({name}[, {path}[, {count}]]) < 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 diff --git a/runtime/filetype.vim b/runtime/filetype.vim --- a/runtime/filetype.vim +++ b/runtime/filetype.vim @@ -16,20 +16,23 @@ set cpo&vim augroup filetypedetect " Ignored extensions +if exists("*fnameescape") au BufNewFile,BufRead ?\+.orig,?\+.bak,?\+.old,?\+.new,?\+.rpmsave,?\+.rpmnew - \ exe "doau filetypedetect BufRead " . expand(":r") + \ exe "doau filetypedetect BufRead " . fnameescape(expand(":r")) au BufNewFile,BufRead *~ \ let s:name = expand("") | \ let s:short = substitute(s:name, '\~$', '', '') | \ if s:name != s:short && s:short != "" | - \ exe "doau filetypedetect BufRead " . s:short | + \ exe "doau filetypedetect BufRead " . fnameescape(s:short) | \ endif | - \ unlet s:name | - \ unlet s:short + \ unlet s:name s:short au BufNewFile,BufRead ?\+.in \ if expand(":t") != "configure.in" | - \ exe "doau filetypedetect BufRead " . expand(":r") | + \ exe "doau filetypedetect BufRead " . fnameescape(expand(":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. diff --git a/src/eval.c b/src/eval.c --- a/src/eval.c +++ b/src/eval.c @@ -507,6 +507,7 @@ static void f_filewritable __ARGS((typva 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,6 +7108,7 @@ static struct fst {"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,6 +9467,19 @@ f_findfile(argvars, rettv) } /* + * "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 diff --git a/src/ex_getln.c b/src/ex_getln.c --- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -3656,22 +3656,7 @@ ExpandEscape(xp, str, numfiles, files, o #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 + p = vim_strsave_fnameescape(files[i], xp->xp_shell); if (p != NULL) { vim_free(files[i]); @@ -3710,6 +3695,31 @@ ExpandEscape(xp, str, numfiles, files, o } /* + * 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 diff --git a/src/proto/ex_getln.pro b/src/proto/ex_getln.pro --- a/src/proto/ex_getln.pro +++ b/src/proto/ex_getln.pro @@ -24,6 +24,7 @@ char_u *ExpandOne __ARGS((expand_T *xp, 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)); diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -667,6 +667,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 299, +/**/ 298, /**/ 297, diff --git a/src/vim.h b/src/vim.h --- a/src/vim.h +++ b/src/vim.h @@ -336,10 +336,10 @@ # endif #endif #ifdef BACKSLASH_IN_FILENAME -# define PATH_ESC_CHARS ((char_u *)" \t*?[{`%#") +# define PATH_ESC_CHARS ((char_u *)" \t\n*?[{`%#'\"|!<") #else -# define PATH_ESC_CHARS ((char_u *)" \t*?[{`$\\%#'\"|") -# define SHELL_ESC_CHARS ((char_u *)" \t*?[{`$\\%#'\"|<>();&!") +# 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 */