mirror of
https://github.com/vim/vim.git
synced 2025-09-30 04:44:14 -04:00
patch 8.0.1455: if $SHELL contains a space then 'shell' is incorrect
Problem: If $SHELL contains a space then the default value of 'shell' is incorrect. (Matthew Horan) Solution: Escape spaces in $SHELL. (Christian Brabandt, closes #459)
This commit is contained in:
@@ -6630,14 +6630,21 @@ A jump table for the options with a short description can be found at |Q_op|.
|
|||||||
It is allowed to give an argument to the command, e.g. "csh -f".
|
It is allowed to give an argument to the command, e.g. "csh -f".
|
||||||
See |option-backslash| about including spaces and backslashes.
|
See |option-backslash| about including spaces and backslashes.
|
||||||
Environment variables are expanded |:set_env|.
|
Environment variables are expanded |:set_env|.
|
||||||
|
|
||||||
If the name of the shell contains a space, you might need to enclose
|
If the name of the shell contains a space, you might need to enclose
|
||||||
it in quotes. Example: >
|
it in quotes or escape the space. Example with quotes: >
|
||||||
:set shell=\"c:\program\ files\unix\sh.exe\"\ -f
|
:set shell=\"c:\program\ files\unix\sh.exe\"\ -f
|
||||||
< Note the backslash before each quote (to avoid starting a comment) and
|
< Note the backslash before each quote (to avoid starting a comment) and
|
||||||
each space (to avoid ending the option value). Also note that the
|
each space (to avoid ending the option value). Also note that the
|
||||||
"-f" is not inside the quotes, because it is not part of the command
|
"-f" is not inside the quotes, because it is not part of the command
|
||||||
name. And Vim automagically recognizes the backslashes that are path
|
name. Vim automagically recognizes the backslashes that are path
|
||||||
separators.
|
separators.
|
||||||
|
Example with escaped space (Vim will do this when initializing the
|
||||||
|
option from $SHELL): >
|
||||||
|
:set shell=/bin/with\\\ space/sh
|
||||||
|
< The resulting value of 'shell' is "/bin/with\ space/sh", two
|
||||||
|
backslashes are consumed by `:set`.
|
||||||
|
|
||||||
Under MS-Windows, when the executable ends in ".com" it must be
|
Under MS-Windows, when the executable ends in ".com" it must be
|
||||||
included. Thus setting the shell to "command.com" or "4dos.com"
|
included. Thus setting the shell to "command.com" or "4dos.com"
|
||||||
works, but "command" and "4dos" do not work for all commands (e.g.,
|
works, but "command" and "4dos" do not work for all commands (e.g.,
|
||||||
|
19
src/option.c
19
src/option.c
@@ -3265,6 +3265,7 @@ static char *(p_scl_values[]) = {"yes", "no", "auto", NULL};
|
|||||||
|
|
||||||
static void set_option_default(int, int opt_flags, int compatible);
|
static void set_option_default(int, int opt_flags, int compatible);
|
||||||
static void set_options_default(int opt_flags);
|
static void set_options_default(int opt_flags);
|
||||||
|
static void set_string_default_esc(char *name, char_u *val, int escape);
|
||||||
static char_u *term_bg_default(void);
|
static char_u *term_bg_default(void);
|
||||||
static void did_set_option(int opt_idx, int opt_flags, int new_value);
|
static void did_set_option(int opt_idx, int opt_flags, int new_value);
|
||||||
static char_u *illegal_char(char_u *, int);
|
static char_u *illegal_char(char_u *, int);
|
||||||
@@ -3371,7 +3372,7 @@ set_init_1(void)
|
|||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
)
|
)
|
||||||
set_string_default("sh", p);
|
set_string_default_esc("sh", p, TRUE);
|
||||||
|
|
||||||
#ifdef FEAT_WILDIGN
|
#ifdef FEAT_WILDIGN
|
||||||
/*
|
/*
|
||||||
@@ -3859,14 +3860,18 @@ set_options_default(
|
|||||||
/*
|
/*
|
||||||
* Set the Vi-default value of a string option.
|
* Set the Vi-default value of a string option.
|
||||||
* Used for 'sh', 'backupskip' and 'term'.
|
* Used for 'sh', 'backupskip' and 'term'.
|
||||||
|
* When "escape" is TRUE escape spaces with a backslash.
|
||||||
*/
|
*/
|
||||||
void
|
static void
|
||||||
set_string_default(char *name, char_u *val)
|
set_string_default_esc(char *name, char_u *val, int escape)
|
||||||
{
|
{
|
||||||
char_u *p;
|
char_u *p;
|
||||||
int opt_idx;
|
int opt_idx;
|
||||||
|
|
||||||
p = vim_strsave(val);
|
if (escape && vim_strchr(val, ' ') != NULL)
|
||||||
|
p = vim_strsave_escaped(val, (char_u *)" ");
|
||||||
|
else
|
||||||
|
p = vim_strsave(val);
|
||||||
if (p != NULL) /* we don't want a NULL */
|
if (p != NULL) /* we don't want a NULL */
|
||||||
{
|
{
|
||||||
opt_idx = findoption((char_u *)name);
|
opt_idx = findoption((char_u *)name);
|
||||||
@@ -3880,6 +3885,12 @@ set_string_default(char *name, char_u *val)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
set_string_default(char *name, char_u *val)
|
||||||
|
{
|
||||||
|
set_string_default_esc(name, val, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set the Vi-default value of a number option.
|
* Set the Vi-default value of a number option.
|
||||||
* Used for 'lines' and 'columns'.
|
* Used for 'lines' and 'columns'.
|
||||||
|
@@ -226,6 +226,20 @@ func Test_read_stdin()
|
|||||||
call delete('Xtestout')
|
call delete('Xtestout')
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_set_shell()
|
||||||
|
let after = [
|
||||||
|
\ 'call writefile([&shell], "Xtestout")',
|
||||||
|
\ 'quit!',
|
||||||
|
\ ]
|
||||||
|
let $SHELL = '/bin/with space/sh'
|
||||||
|
if RunVimPiped([], after, '', '')
|
||||||
|
let lines = readfile('Xtestout')
|
||||||
|
" MS-Windows adds a space after the word
|
||||||
|
call assert_equal('/bin/with\ space/sh', lines[0])
|
||||||
|
endif
|
||||||
|
call delete('Xtestout')
|
||||||
|
endfunc
|
||||||
|
|
||||||
func Test_progpath()
|
func Test_progpath()
|
||||||
" Tests normally run with "./vim" or "../vim", these must have been expanded
|
" Tests normally run with "./vim" or "../vim", these must have been expanded
|
||||||
" to a full path.
|
" to a full path.
|
||||||
|
@@ -771,6 +771,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 */
|
||||||
|
/**/
|
||||||
|
1455,
|
||||||
/**/
|
/**/
|
||||||
1454,
|
1454,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user