summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2008-05-28 14:49:58 +0000
committerBram Moolenaar <Bram@vim.org>2008-05-28 14:49:58 +0000
commitaebaf89fd4626e52dee4a6bb4cdec8dbf2556bd2 (patch)
tree2afe10fdf37a9f22f6f948a7ca56c35cbdc01bb6
parent7a9892558776b37077b4a889364cef1c7902cba2 (diff)
updated for version 7.1-299v7.1.299
-rw-r--r--runtime/doc/eval.txt16
-rw-r--r--runtime/filetype.vim13
-rw-r--r--src/eval.c15
-rw-r--r--src/ex_getln.c42
-rw-r--r--src/proto/ex_getln.pro1
-rw-r--r--src/version.c2
-rw-r--r--src/vim.h6
7 files changed, 70 insertions, 25 deletions
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt
index 13caa16cf1..57e2c4e43d 100644
--- 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}]]) *findfile()*
< 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
index 20719aa2e4..e20a53aed4 100644
--- 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("<afile>:r")
+ \ 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 " . 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("<afile>:t") != "configure.in" |
- \ exe "doau filetypedetect BufRead " . expand("<afile>:r") |
+ \ 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.
diff --git a/src/eval.c b/src/eval.c
index e008df24aa..34263544cb 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -507,6 +507,7 @@ static void f_filewritable __ARGS((typval_T *argvars, typval_T *rettv));
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
index e7f8c1b1c7..b575e29983 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -3656,22 +3656,7 @@ ExpandEscape(xp, str, numfiles, files, options)
#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, options)
}
/*
+ * 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
index f5feb201f1..b4a5018143 100644
--- a/src/proto/ex_getln.pro
+++ b/src/proto/ex_getln.pro
@@ -24,6 +24,7 @@ char_u *ExpandOne __ARGS((expand_T *xp, char_u *str, char_u *orig, int options,
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
index 45b003e1d2..7b7bdcd03d 100644
--- 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
index d93bec1545..71dd3ae2da 100644
--- 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 */