summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2018-02-03 15:14:46 +0100
committerBram Moolenaar <Bram@vim.org>2018-02-03 15:14:46 +0100
commit4bfa8af14142e54f509048239f4e8596911f56aa (patch)
tree42d136ae2e49c5444802af12493c5c63c5197a28
parent42b23fad1d9cdd6266f52d1ed7e0f3f17ce2d04b (diff)
downloadvim-git-8.0.1455.tar.gz
patch 8.0.1455: if $SHELL contains a space then 'shell' is incorrectv8.0.1455
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)
-rw-r--r--runtime/doc/options.txt11
-rw-r--r--src/option.c19
-rw-r--r--src/testdir/test_startup.vim14
-rw-r--r--src/version.c2
4 files changed, 40 insertions, 6 deletions
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
index 75e4f9741..e584b3dbf 100644
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -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".
See |option-backslash| about including spaces and backslashes.
Environment variables are expanded |:set_env|.
+
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
< Note the backslash before each quote (to avoid starting a comment) and
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
- name. And Vim automagically recognizes the backslashes that are path
+ name. Vim automagically recognizes the backslashes that are path
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
included. Thus setting the shell to "command.com" or "4dos.com"
works, but "command" and "4dos" do not work for all commands (e.g.,
diff --git a/src/option.c b/src/option.c
index ce5436996..4898e694c 100644
--- a/src/option.c
+++ b/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_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 void did_set_option(int opt_idx, int opt_flags, int new_value);
static char_u *illegal_char(char_u *, int);
@@ -3371,7 +3372,7 @@ set_init_1(void)
# endif
#endif
)
- set_string_default("sh", p);
+ set_string_default_esc("sh", p, TRUE);
#ifdef FEAT_WILDIGN
/*
@@ -3859,14 +3860,18 @@ set_options_default(
/*
* Set the Vi-default value of a string option.
* Used for 'sh', 'backupskip' and 'term'.
+ * When "escape" is TRUE escape spaces with a backslash.
*/
- void
-set_string_default(char *name, char_u *val)
+ static void
+set_string_default_esc(char *name, char_u *val, int escape)
{
char_u *p;
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 */
{
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.
* Used for 'lines' and 'columns'.
diff --git a/src/testdir/test_startup.vim b/src/testdir/test_startup.vim
index 6f67bfc11..42e489618 100644
--- a/src/testdir/test_startup.vim
+++ b/src/testdir/test_startup.vim
@@ -226,6 +226,20 @@ func Test_read_stdin()
call delete('Xtestout')
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()
" Tests normally run with "./vim" or "../vim", these must have been expanded
" to a full path.
diff --git a/src/version.c b/src/version.c
index 57040747f..69ba3f505 100644
--- a/src/version.c
+++ b/src/version.c
@@ -772,6 +772,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1455,
+/**/
1454,
/**/
1453,