Skip to content

Commit

Permalink
Merged from the latest developing branch.
Browse files Browse the repository at this point in the history
git-svn-id: https://vim.svn.sourceforge.net/svnroot/vim/trunk@1016 2a77ed30-b011-0410-a7ad-c7884a0aa172
  • Loading branch information
edyfox committed May 29, 2008
1 parent fc7b503 commit 4067577
Show file tree
Hide file tree
Showing 8 changed files with 83 additions and 23 deletions.
16 changes: 15 additions & 1 deletion 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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
15 changes: 9 additions & 6 deletions runtime/filetype.vim
Expand Up @@ -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.
Expand Down Expand Up @@ -187,7 +190,7 @@ func! s:FTasmsyntax()
let head = " ".getline(1)." ".getline(2)." ".getline(3)." ".getline(4).
\" ".getline(5)." "
if head =~ '\sasmsyntax=\S\+\s'
let b:asmsyntax = substitute(head, '.*\sasmsyntax=\(\S\+\)\s.*','\1', "")
let b:asmsyntax = substitute(head, '.*\sasmsyntax=\([a-zA-Z0-9]\+\)\s.*','\1', "")
elseif ((head =~? '\.title') || (head =~? '\.ident') || (head =~? '\.macro') || (head =~? '\.subtitle') || (head =~? '\.library'))
let b:asmsyntax = "vmasm"
endif
Expand Down
15 changes: 15 additions & 0 deletions src/eval.c
Expand Up @@ -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));
Expand Down Expand Up @@ -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},
Expand Down Expand Up @@ -9464,6 +9466,19 @@ f_findfile(argvars, rettv)
findfilendir(argvars, rettv, FINDFILE_FILE);
}

/*
* "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
*/
Expand Down
40 changes: 27 additions & 13 deletions src/ex_getln.c
Expand Up @@ -3657,20 +3657,9 @@ ExpandEscape(xp, str, numfiles, files, options)
}
}
#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);
}
p = vim_strsave_fnameescape(files[i], FALSE);
#else
p = vim_strsave_escaped(files[i],
xp->xp_shell ? SHELL_ESC_CHARS : PATH_ESC_CHARS);
p = vim_strsave_fnameescape(files[i], xp->xp_shell);
#endif
if (p != NULL)
{
Expand Down Expand Up @@ -3709,6 +3698,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.
*/
Expand Down
1 change: 1 addition & 0 deletions src/proto/ex_getln.pro
Expand Up @@ -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));
Expand Down
5 changes: 5 additions & 0 deletions src/screen.c
Expand Up @@ -9357,6 +9357,11 @@ showruler(always)
)
maketitle();
#endif
#ifdef FEAT_WINDOWS
/* Redraw the tab pages line if needed. */
if (redraw_tabline)
draw_tabline();
#endif
}

#ifdef FEAT_CMDL_INFO
Expand Down
8 changes: 8 additions & 0 deletions src/version.c
Expand Up @@ -666,6 +666,14 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
302,
/**/
301,
/**/
300,
/**/
299,
/**/
298,
/**/
Expand Down
6 changes: 3 additions & 3 deletions src/vim.h
Expand Up @@ -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 */
Expand Down

0 comments on commit 4067577

Please sign in to comment.