1
0
forked from aniani/vim

updated for version 7.2a-013

This commit is contained in:
Bram Moolenaar
2008-07-04 09:44:11 +00:00
parent 47b46d7c47
commit 05bb95391f
7 changed files with 136 additions and 77 deletions

View File

@@ -1856,7 +1856,8 @@ setreg( {n}, {v}[, {opt}]) Number set register to value and type
settabwinvar( {tabnr}, {winnr}, {varname}, {val}) set {varname} in window settabwinvar( {tabnr}, {winnr}, {varname}, {val}) set {varname} in window
{winnr} in tab page {tabnr} to {val} {winnr} in tab page {tabnr} to {val}
setwinvar( {nr}, {varname}, {val}) set {varname} in window {nr} to {val} setwinvar( {nr}, {varname}, {val}) set {varname} in window {nr} to {val}
shellescape( {string}) String escape {string} for use as shell shellescape( {string} [, {special}])
String escape {string} for use as shell
command argument command argument
simplify( {filename}) String simplify filename as much as possible simplify( {filename}) String simplify filename as much as possible
sin( {expr}) Float sine of {expr} sin( {expr}) Float sine of {expr}
@@ -4018,10 +4019,10 @@ mkdir({name} [, {path} [, {prot}]])
< <
*mode()* *mode()*
mode([expr]) Return a string that indicates the current mode. mode([expr]) Return a string that indicates the current mode.
If [expr] is supplied and it evaluates to a non-zero number or If [expr] is supplied and it evaluates to a non-zero Number or
a non-empty string, then the full mode is returned, otherwise a non-empty String (|non-zero-arg|), then the full mode is
only the first letter is returned. Note that " " and "0" are returned, otherwise only the first letter is returned. Note
also non-empty strings. that " " and "0" are also non-empty strings.
n Normal n Normal
no Operator-pending no Operator-pending
@@ -4941,19 +4942,23 @@ setwinvar({nr}, {varname}, {val}) *setwinvar()*
:call setwinvar(1, "&list", 0) :call setwinvar(1, "&list", 0)
:call setwinvar(2, "myvar", "foobar") :call setwinvar(2, "myvar", "foobar")
shellescape({string}) *shellescape()* shellescape({string} [, {special}]) *shellescape()*
Escape {string} for use as shell command argument. Escape {string} for use as shell command argument.
On MS-Windows and MS-DOS, when 'shellslash' is not set, it On MS-Windows and MS-DOS, when 'shellslash' is not set, it
will enclose {string} double quotes and double all double will enclose {string} in double quotes and double all double
quotes within {string}. quotes within {string}.
For other systems, it will enclose {string} in single quotes For other systems, it will enclose {string} in single quotes
and replace all "'" with "'\''". and replace all "'" with "'\''".
Example: > When the {special} argument is present and it's a non-zero
:echo shellescape('c:\program files\vim') Number or a non-empty String (|non-zero-arg|), then special
< results in: items such as "%", "#" and "<cword>" will be preceded by a
"c:\program files\vim" ~ backslash. This backslash will be removed again by the |:!|
Example usage: > command.
:call system("chmod +x -- " . shellescape(expand("%"))) Example of use with a |:!| command: >
:exe '!dir ' . shellescape(expand('<cfile>'), 1)
< This results in a directory listing for the file under the
cursor. Example of use with |system()|: >
:call system("chmod +w -- " . shellescape(expand("%")))
simplify({filename}) *simplify()* simplify({filename}) *simplify()*
@@ -5333,13 +5338,14 @@ system({expr} [, {input}]) *system()* *E677*
passed as stdin to the command. The string is written as-is, passed as stdin to the command. The string is written as-is,
you need to take care of using the correct line separators you need to take care of using the correct line separators
yourself. Pipes are not used. yourself. Pipes are not used.
Note: newlines in {expr} may cause the command to fail. The Note: Use |shellescape()| to escape special characters in a
characters in 'shellquote' and 'shellxquote' may also cause command argument. Newlines in {expr} may cause the command to
trouble. fail. The characters in 'shellquote' and 'shellxquote' may
also cause trouble.
This is not to be used for interactive commands. This is not to be used for interactive commands.
The result is a String. Example: >
:let files = system("ls") The result is a String. Example: >
:let files = system("ls " . shellescape(expand('%:h')))
< To make the result more system-independent, the shell output < To make the result more system-independent, the shell output
is filtered to replace <CR> with <NL> for Macintosh, and is filtered to replace <CR> with <NL> for Macintosh, and
@@ -5559,11 +5565,13 @@ visualmode([expr]) *visualmode()*
Visual mode that was used. Visual mode that was used.
If Visual mode is active, use |mode()| to get the Visual mode If Visual mode is active, use |mode()| to get the Visual mode
(e.g., in a |:vmap|). (e.g., in a |:vmap|).
*non-zero-arg*
If [expr] is supplied and it evaluates to a non-zero number or If [expr] is supplied and it evaluates to a non-zero Number or
a non-empty string, then the Visual mode will be cleared and a non-empty String, then the Visual mode will be cleared and
the old value is returned. Note that " " and "0" are also the old value is returned. Note that " " and "0" are also
non-empty strings, thus cause the mode to be cleared. non-empty strings, thus cause the mode to be cleared. A List,
Dictionary or Float is not a Number or String, thus does not
cause the mode to be cleared.
*winbufnr()* *winbufnr()*
winbufnr({nr}) The result is a Number, which is the number of the buffer winbufnr({nr}) The result is a Number, which is the number of the buffer
@@ -6738,8 +6746,10 @@ This would call the function "my_func_whizz(parameter)".
Be careful to correctly escape special characters in Be careful to correctly escape special characters in
file names. The |fnameescape()| function can be used file names. The |fnameescape()| function can be used
for this. Example: > for Vim commands, |shellescape()| for |:!| commands.
Examples: >
:execute "e " . fnameescape(filename) :execute "e " . fnameescape(filename)
:execute "!ls " . shellescape(expand('%:h'), 1)
< <
Note: The executed string may be any command-line, but Note: The executed string may be any command-line, but
you cannot start or end a "while", "for" or "if" you cannot start or end a "while", "for" or "if"

View File

@@ -462,6 +462,7 @@ static char_u *deref_func_name __ARGS((char_u *name, int *lenp));
static int get_func_tv __ARGS((char_u *name, int len, typval_T *rettv, char_u **arg, linenr_T firstline, linenr_T lastline, int *doesrange, int evaluate, dict_T *selfdict)); static int get_func_tv __ARGS((char_u *name, int len, typval_T *rettv, char_u **arg, linenr_T firstline, linenr_T lastline, int *doesrange, int evaluate, dict_T *selfdict));
static int call_func __ARGS((char_u *name, int len, typval_T *rettv, int argcount, typval_T *argvars, linenr_T firstline, linenr_T lastline, int *doesrange, int evaluate, dict_T *selfdict)); static int call_func __ARGS((char_u *name, int len, typval_T *rettv, int argcount, typval_T *argvars, linenr_T firstline, linenr_T lastline, int *doesrange, int evaluate, dict_T *selfdict));
static void emsg_funcname __ARGS((char *ermsg, char_u *name)); static void emsg_funcname __ARGS((char *ermsg, char_u *name));
static int non_zero_arg __ARGS((typval_T *argvars));
#ifdef FEAT_FLOAT #ifdef FEAT_FLOAT
static void f_abs __ARGS((typval_T *argvars, typval_T *rettv)); static void f_abs __ARGS((typval_T *argvars, typval_T *rettv));
@@ -7611,7 +7612,7 @@ static struct fst
{"setreg", 2, 3, f_setreg}, {"setreg", 2, 3, f_setreg},
{"settabwinvar", 4, 4, f_settabwinvar}, {"settabwinvar", 4, 4, f_settabwinvar},
{"setwinvar", 3, 3, f_setwinvar}, {"setwinvar", 3, 3, f_setwinvar},
{"shellescape", 1, 1, f_shellescape}, {"shellescape", 1, 2, f_shellescape},
{"simplify", 1, 1, f_simplify}, {"simplify", 1, 1, f_simplify},
#ifdef FEAT_FLOAT #ifdef FEAT_FLOAT
{"sin", 1, 1, f_sin}, {"sin", 1, 1, f_sin},
@@ -8094,6 +8095,20 @@ emsg_funcname(ermsg, name)
vim_free(p); vim_free(p);
} }
/*
* Return TRUE for a non-zero Number and a non-empty String.
*/
static int
non_zero_arg(argvars)
typval_T *argvars;
{
return ((argvars[0].v_type == VAR_NUMBER
&& argvars[0].vval.v_number != 0)
|| (argvars[0].v_type == VAR_STRING
&& argvars[0].vval.v_string != NULL
&& *argvars[0].vval.v_string != NUL));
}
/********************************************* /*********************************************
* Implementation of the built-in functions * Implementation of the built-in functions
*/ */
@@ -13480,10 +13495,9 @@ f_mode(argvars, rettv)
buf[1] = 'o'; buf[1] = 'o';
} }
/* A zero number or empty string argument: return only major mode. */ /* Clear out the minor mode when the argument is not a non-zero number or
if (!(argvars[0].v_type == VAR_NUMBER && argvars[0].vval.v_number != 0) * non-empty string. */
&& !(argvars[0].v_type == VAR_STRING if (!non_zero_arg(&argvars[0]))
&& *get_tv_string(&argvars[0]) != NUL))
buf[1] = NUL; buf[1] = NUL;
rettv->vval.v_string = vim_strsave(buf); rettv->vval.v_string = vim_strsave(buf);
@@ -15684,7 +15698,8 @@ f_shellescape(argvars, rettv)
typval_T *argvars; typval_T *argvars;
typval_T *rettv; typval_T *rettv;
{ {
rettv->vval.v_string = vim_strsave_shellescape(get_tv_string(&argvars[0])); rettv->vval.v_string = vim_strsave_shellescape(
get_tv_string(&argvars[0]), non_zero_arg(&argvars[1]));
rettv->v_type = VAR_STRING; rettv->v_type = VAR_STRING;
} }
@@ -17273,9 +17288,7 @@ f_visualmode(argvars, rettv)
rettv->vval.v_string = vim_strsave(str); rettv->vval.v_string = vim_strsave(str);
/* A non-zero number or non-empty string argument: reset mode. */ /* A non-zero number or non-empty string argument: reset mode. */
if ((argvars[0].v_type == VAR_NUMBER && argvars[0].vval.v_number != 0) if (non_zero_arg(&argvars[0]))
|| (argvars[0].v_type == VAR_STRING
&& *get_tv_string(&argvars[0]) != NUL))
curbuf->b_visual_mode_eval = NUL; curbuf->b_visual_mode_eval = NUL;
#else #else
rettv->vval.v_number = 0; /* return anything, it won't work anyway */ rettv->vval.v_number = 0; /* return anything, it won't work anyway */

View File

@@ -7059,8 +7059,8 @@ ex_splitview(eap)
# ifdef FEAT_QUICKFIX # ifdef FEAT_QUICKFIX
/* A ":split" in the quickfix window works like ":new". Don't want two /* A ":split" in the quickfix window works like ":new". Don't want two
* quickfix windows. */ * quickfix windows. But it's OK when doing ":tab split". */
if (bt_quickfix(curbuf)) if (bt_quickfix(curbuf) && cmdmod.tab == 0)
{ {
if (eap->cmdidx == CMD_split) if (eap->cmdidx == CMD_split)
eap->cmdidx = CMD_new; eap->cmdidx = CMD_new;
@@ -9320,6 +9320,58 @@ ex_tag_cmd(eap, name)
eap->forceit, TRUE); eap->forceit, TRUE);
} }
/*
* Check "str" for starting with a special cmdline variable.
* If found return one of the SPEC_ values and set "*usedlen" to the length of
* the variable. Otherwise return -1 and "*usedlen" is unchanged.
*/
int
find_cmdline_var(src, usedlen)
char_u *src;
int *usedlen;
{
int len;
int i;
static char *(spec_str[]) = {
"%",
#define SPEC_PERC 0
"#",
#define SPEC_HASH 1
"<cword>", /* cursor word */
#define SPEC_CWORD 2
"<cWORD>", /* cursor WORD */
#define SPEC_CCWORD 3
"<cfile>", /* cursor path name */
#define SPEC_CFILE 4
"<sfile>", /* ":so" file name */
#define SPEC_SFILE 5
#ifdef FEAT_AUTOCMD
"<afile>", /* autocommand file name */
# define SPEC_AFILE 6
"<abuf>", /* autocommand buffer number */
# define SPEC_ABUF 7
"<amatch>", /* autocommand match name */
# define SPEC_AMATCH 8
#endif
#ifdef FEAT_CLIENTSERVER
"<client>"
# define SPEC_CLIENT 9
#endif
};
#define SPEC_COUNT (sizeof(spec_str) / sizeof(char *))
for (i = 0; i < SPEC_COUNT; ++i)
{
len = (int)STRLEN(spec_str[i]);
if (STRNCMP(src, spec_str[i], len) == 0)
{
*usedlen = len;
return i;
}
}
return -1;
}
/* /*
* Evaluate cmdline variables. * Evaluate cmdline variables.
* *
@@ -9360,34 +9412,6 @@ eval_vars(src, srcstart, usedlen, lnump, errormsg, escaped)
#ifdef FEAT_MODIFY_FNAME #ifdef FEAT_MODIFY_FNAME
int skip_mod = FALSE; int skip_mod = FALSE;
#endif #endif
static char *(spec_str[]) =
{
"%",
#define SPEC_PERC 0
"#",
#define SPEC_HASH 1
"<cword>", /* cursor word */
#define SPEC_CWORD 2
"<cWORD>", /* cursor WORD */
#define SPEC_CCWORD 3
"<cfile>", /* cursor path name */
#define SPEC_CFILE 4
"<sfile>", /* ":so" file name */
#define SPEC_SFILE 5
#ifdef FEAT_AUTOCMD
"<afile>", /* autocommand file name */
# define SPEC_AFILE 6
"<abuf>", /* autocommand buffer number */
# define SPEC_ABUF 7
"<amatch>", /* autocommand match name */
# define SPEC_AMATCH 8
#endif
#ifdef FEAT_CLIENTSERVER
"<client>"
# define SPEC_CLIENT 9
#endif
};
#define SPEC_COUNT (sizeof(spec_str) / sizeof(char *))
#if defined(FEAT_AUTOCMD) || defined(FEAT_CLIENTSERVER) #if defined(FEAT_AUTOCMD) || defined(FEAT_CLIENTSERVER)
char_u strbuf[30]; char_u strbuf[30];
@@ -9400,13 +9424,8 @@ eval_vars(src, srcstart, usedlen, lnump, errormsg, escaped)
/* /*
* Check if there is something to do. * Check if there is something to do.
*/ */
for (spec_idx = 0; spec_idx < SPEC_COUNT; ++spec_idx) spec_idx = find_cmdline_var(src, usedlen);
{ if (spec_idx < 0) /* no match */
*usedlen = (int)STRLEN(spec_str[spec_idx]);
if (STRNCMP(src, spec_str[spec_idx], *usedlen) == 0)
break;
}
if (spec_idx == SPEC_COUNT) /* no match */
{ {
*usedlen = 1; *usedlen = 1;
return NULL; return NULL;

View File

@@ -1262,16 +1262,19 @@ vim_strsave_escaped_ext(string, esc_chars, cc, bsl)
* Escape "string" for use as a shell argument with system(). * Escape "string" for use as a shell argument with system().
* This uses single quotes, except when we know we need to use double qoutes * This uses single quotes, except when we know we need to use double qoutes
* (MS-DOS and MS-Windows without 'shellslash' set). * (MS-DOS and MS-Windows without 'shellslash' set).
* Also replace "%", "#" and things like "<cfile>" when "do_special" is TRUE.
* Returns the result in allocated memory, NULL if we have run out. * Returns the result in allocated memory, NULL if we have run out.
*/ */
char_u * char_u *
vim_strsave_shellescape(string) vim_strsave_shellescape(string, do_special)
char_u *string; char_u *string;
int do_special;
{ {
unsigned length; unsigned length;
char_u *p; char_u *p;
char_u *d; char_u *d;
char_u *escaped_string; char_u *escaped_string;
int l;
/* First count the number of extra bytes required. */ /* First count the number of extra bytes required. */
length = (unsigned)STRLEN(string) + 3; /* two quotes and a trailing NUL */ length = (unsigned)STRLEN(string) + 3; /* two quotes and a trailing NUL */
@@ -1287,6 +1290,11 @@ vim_strsave_shellescape(string)
# endif # endif
if (*p == '\'') if (*p == '\'')
length += 3; /* ' => '\'' */ length += 3; /* ' => '\'' */
if (do_special && find_cmdline_var(p, &l) >= 0)
{
++length; /* insert backslash */
p += l - 1;
}
} }
/* Allocate memory for the result and fill it. */ /* Allocate memory for the result and fill it. */
@@ -1320,13 +1328,19 @@ vim_strsave_shellescape(string)
# endif # endif
if (*p == '\'') if (*p == '\'')
{ {
*d++='\''; *d++ = '\'';
*d++='\\'; *d++ = '\\';
*d++='\''; *d++ = '\'';
*d++='\''; *d++ = '\'';
++p; ++p;
continue; continue;
} }
if (do_special && find_cmdline_var(p, &l) >= 0)
{
*d++ = '\\'; /* insert backslash */
while (--l >= 0) /* copy the var */
*d++ = *p++;
}
MB_COPY_CHAR(p, d); MB_COPY_CHAR(p, d);
} }
@@ -2776,7 +2790,7 @@ get_special_key_code(name)
return 0; return 0;
} }
#ifdef FEAT_CMDL_COMPL #if defined(FEAT_CMDL_COMPL) || defined(PROTO)
char_u * char_u *
get_key_name(i) get_key_name(i)
int i; int i;
@@ -2787,7 +2801,7 @@ get_key_name(i)
} }
#endif #endif
#ifdef FEAT_MOUSE #if defined(FEAT_MOUSE) || defined(PROTO)
/* /*
* Look up the given mouse code to return the relevant information in the other * Look up the given mouse code to return the relevant information in the other
* arguments. Return which button is down or was released. * arguments. Return which button is down or was released.

View File

@@ -46,6 +46,7 @@ int vim_mkdir_emsg __ARGS((char_u *name, int prot));
FILE *open_exfile __ARGS((char_u *fname, int forceit, char *mode)); FILE *open_exfile __ARGS((char_u *fname, int forceit, char *mode));
void update_topline_cursor __ARGS((void)); void update_topline_cursor __ARGS((void));
void exec_normal_cmd __ARGS((char_u *cmd, int remap, int silent)); void exec_normal_cmd __ARGS((char_u *cmd, int remap, int silent));
int find_cmdline_var __ARGS((char_u *src, int *usedlen));
char_u *eval_vars __ARGS((char_u *src, char_u *srcstart, int *usedlen, linenr_T *lnump, char_u **errormsg, int *escaped)); char_u *eval_vars __ARGS((char_u *src, char_u *srcstart, int *usedlen, linenr_T *lnump, char_u **errormsg, int *escaped));
char_u *expand_sfile __ARGS((char_u *arg)); char_u *expand_sfile __ARGS((char_u *arg));
int put_eol __ARGS((FILE *fd)); int put_eol __ARGS((FILE *fd));

View File

@@ -29,7 +29,7 @@ char_u *vim_strsave __ARGS((char_u *string));
char_u *vim_strnsave __ARGS((char_u *string, int len)); char_u *vim_strnsave __ARGS((char_u *string, int len));
char_u *vim_strsave_escaped __ARGS((char_u *string, char_u *esc_chars)); char_u *vim_strsave_escaped __ARGS((char_u *string, char_u *esc_chars));
char_u *vim_strsave_escaped_ext __ARGS((char_u *string, char_u *esc_chars, int cc, int bsl)); char_u *vim_strsave_escaped_ext __ARGS((char_u *string, char_u *esc_chars, int cc, int bsl));
char_u *vim_strsave_shellescape __ARGS((char_u *string)); char_u *vim_strsave_shellescape __ARGS((char_u *string, int do_special));
char_u *vim_strsave_up __ARGS((char_u *string)); char_u *vim_strsave_up __ARGS((char_u *string));
char_u *vim_strnsave_up __ARGS((char_u *string, int len)); char_u *vim_strnsave_up __ARGS((char_u *string, int len));
void vim_strup __ARGS((char_u *p)); void vim_strup __ARGS((char_u *p));

View File

@@ -676,6 +676,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
13,
/**/ /**/
12, 12,
/**/ /**/