diff options
-rw-r--r-- | src/nvim/ex_cmds.c | 26 | ||||
-rw-r--r-- | src/nvim/option.c | 26 | ||||
-rw-r--r-- | src/nvim/version.c | 2 |
3 files changed, 25 insertions, 29 deletions
diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c index 009688f03d..48e75190aa 100644 --- a/src/nvim/ex_cmds.c +++ b/src/nvim/ex_cmds.c @@ -1316,8 +1316,18 @@ do_shell ( /// @returns an allocated string with the shell command. char_u *make_filter_cmd(char_u *cmd, char_u *itmp, char_u *otmp) { + bool is_fish_shell = +#if defined(UNIX) + STRNCMP(invocation_path_tail(p_sh, NULL), "fish", 4) == 0; +#else + false; +#endif + size_t len = STRLEN(cmd) + 1; // At least enough space for cmd + NULL. - len += sizeof("("")") - 1; + + len += is_fish_shell ? sizeof("begin; ""; end") - 1 + : sizeof("("")") - 1; + if (itmp != NULL) len += STRLEN(itmp) + sizeof(" { "" < "" } ") - 1; if (otmp != NULL) @@ -1325,18 +1335,22 @@ char_u *make_filter_cmd(char_u *cmd, char_u *itmp, char_u *otmp) char_u *buf = xmalloc(len); #if defined(UNIX) - // Put braces around the command (for concatenated commands) when + // Put delimiters around the command (for concatenated commands) when // redirecting input and/or output. - if (itmp != NULL || otmp != NULL) - vim_snprintf((char *)buf, len, "(%s)", (char *)cmd); - else + if (itmp != NULL || otmp != NULL) { + char *fmt = is_fish_shell ? "begin; %s; end" + : "(%s)"; + vim_snprintf((char *)buf, len, fmt, (char *)cmd); + } else { STRCPY(buf, cmd); + } + if (itmp != NULL) { STRCAT(buf, " < "); STRCAT(buf, itmp); } #else - // for shells that don't understand braces around commands, at least allow + // For shells that don't understand braces around commands, at least allow // the use of commands in a pipe. STRCPY(buf, cmd); if (itmp != NULL) { diff --git a/src/nvim/option.c b/src/nvim/option.c index ebbba28b9d..6dc3234dea 100644 --- a/src/nvim/option.c +++ b/src/nvim/option.c @@ -2359,7 +2359,6 @@ void set_init_3(void) * This is done after other initializations, where 'shell' might have been * set, but only if they have not been set before. */ - char_u *p; int idx_srr; int do_srr; int idx_sp; @@ -2376,28 +2375,10 @@ void set_init_3(void) else do_sp = !(options[idx_sp].flags & P_WAS_SET); - /* - * Isolate the name of the shell: - * - Skip beyond any path. E.g., "/usr/bin/csh -f" -> "csh -f". - * - Remove any argument. E.g., "csh -f" -> "csh". - * But don't allow a space in the path, so that this works: - * "/usr/bin/csh --rcfile ~/.cshrc" - * But don't do that for Windows, it's common to have a space in the path. - */ - p = skiptowhite(p_sh); - if (*p == NUL) { - /* No white space, use the tail. */ - p = vim_strsave(path_tail(p_sh)); - } else { - char_u *p1, *p2; + size_t len = 0; + char_u *p = (char_u *)invocation_path_tail(p_sh, &len); + p = vim_strnsave(p, len); - /* Find the last path separator before the space. */ - p1 = p_sh; - for (p2 = p_sh; p2 < p; mb_ptr_adv(p2)) - if (vim_ispathsep(*p2)) - p1 = p2 + 1; - p = vim_strnsave(p1, (int)(p - p1)); - } { /* * Default for p_sp is "| tee", for p_srr is ">". @@ -2421,6 +2402,7 @@ void set_init_3(void) || fnamecmp(p, "zsh") == 0 || fnamecmp(p, "zsh-beta") == 0 || fnamecmp(p, "bash") == 0 + || fnamecmp(p, "fish") == 0 ) { if (do_sp) { p_sp = (char_u *)"2>&1| tee"; diff --git a/src/nvim/version.c b/src/nvim/version.c index a92a5e9f82..052248a719 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -319,7 +319,7 @@ static int included_patches[] = { //279, //278, 277, - //276, + 276, 275, 274, //273 NA |