# HG changeset patch # User Bram Moolenaar # Date 1399468221 -7200 # Node ID a6b59ee633a355095e6473ec5e2a7d9088bfb853 # Parent 82fb215489fea1769a0f38f408c0b3fddb3545bb updated for version 7.4.276 Problem: The fish shell is not supported. Solution: Use begin/end instead of () for fish. (Andy Russell) diff --git a/src/ex_cmds.c b/src/ex_cmds.c --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -1551,8 +1551,16 @@ make_filter_cmd(cmd, itmp, otmp) { char_u *buf; long_u len; - - len = (long_u)STRLEN(cmd) + 3; /* "()" + NUL */ + int is_fish_shell; + +#if (defined(UNIX) && !defined(ARCHIE)) || defined(OS2) + /* Account for fish's different syntax for subshells */ + is_fish_shell = (fnamecmp(get_isolated_shell_name(), "fish") == 0); + if (is_fish_shell) + len = (long_u)STRLEN(cmd) + 13; /* "begin; " + "; end" + NUL */ + else +#endif + len = (long_u)STRLEN(cmd) + 3; /* "()" + NUL */ if (itmp != NULL) len += (long_u)STRLEN(itmp) + 9; /* " { < " + " } " */ if (otmp != NULL) @@ -1567,7 +1575,12 @@ make_filter_cmd(cmd, itmp, otmp) * redirecting input and/or output. */ if (itmp != NULL || otmp != NULL) - vim_snprintf((char *)buf, len, "(%s)", (char *)cmd); + { + if (is_fish_shell) + vim_snprintf((char *)buf, len, "begin; %s; end", (char *)cmd); + else + vim_snprintf((char *)buf, len, "(%s)", (char *)cmd); + } else STRCPY(buf, cmd); if (itmp != NULL) @@ -1577,7 +1590,7 @@ make_filter_cmd(cmd, itmp, otmp) } #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); @@ -4315,7 +4328,7 @@ do_sub(eap) pos_T old_cursor = curwin->w_cursor; int start_nsubs; #ifdef FEAT_EVAL - int save_ma = 0; + int save_ma = 0; #endif cmd = eap->arg; @@ -5986,7 +5999,7 @@ find_help_tags(arg, num_matches, matches "/\\\\?", "/\\\\z(\\\\)", "\\\\=", ":s\\\\=", "\\[count]", "\\[quotex]", "\\[range]", "\\[pattern]", "\\\\bar", "/\\\\%\\$", - "s/\\\\\\~", "s/\\\\U", "s/\\\\L", + "s/\\\\\\~", "s/\\\\U", "s/\\\\L", "s/\\\\1", "s/\\\\2", "s/\\\\3", "s/\\\\9"}; int flags; @@ -6026,7 +6039,7 @@ find_help_tags(arg, num_matches, matches /* Replace: * "[:...:]" with "\[:...:]" * "[++...]" with "\[++...]" - * "\{" with "\\{" -- matching "} \}" + * "\{" with "\\{" -- matching "} \}" */ if ((arg[0] == '[' && (arg[1] == ':' || (arg[1] == '+' && arg[2] == '+'))) diff --git a/src/misc1.c b/src/misc1.c --- a/src/misc1.c +++ b/src/misc1.c @@ -1405,7 +1405,7 @@ open_line(dir, flags, second_line_indent #ifdef FEAT_SMARTINDENT if (did_si) { - int sw = (int)get_sw_value(curbuf); + int sw = (int)get_sw_value(curbuf); if (p_sr) newindent -= newindent % sw; @@ -10896,3 +10896,41 @@ goto_im() { return (p_im && stuff_empty() && typebuf_typed()); } + +/* + * Returns the isolated 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. + */ + char_u * +get_isolated_shell_name() +{ + char_u *p; + +#ifdef WIN3264 + p = gettail(p_sh); + p = vim_strnsave(p, (int)(skiptowhite(p) - p)); +#else + p = skiptowhite(p_sh); + if (*p == NUL) + { + /* No white space, use the tail. */ + p = vim_strsave(gettail(p_sh)); + } + else + { + char_u *p1, *p2; + + /* 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)); + } +#endif + return p; +} diff --git a/src/option.c b/src/option.c --- a/src/option.c +++ b/src/option.c @@ -3804,37 +3804,7 @@ set_init_3() else do_sp = !(options[idx_sp].flags & P_WAS_SET); #endif - - /* - * 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. - */ -#ifdef WIN3264 - p = gettail(p_sh); - p = vim_strnsave(p, (int)(skiptowhite(p) - p)); -#else - p = skiptowhite(p_sh); - if (*p == NUL) - { - /* No white space, use the tail. */ - p = vim_strsave(gettail(p_sh)); - } - else - { - char_u *p1, *p2; - - /* 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)); - } -#endif + p = get_isolated_shell_name(); if (p != NULL) { /* @@ -3875,6 +3845,7 @@ set_init_3() || fnamecmp(p, "zsh") == 0 || fnamecmp(p, "zsh-beta") == 0 || fnamecmp(p, "bash") == 0 + || fnamecmp(p, "fish") == 0 # ifdef WIN3264 || fnamecmp(p, "cmd") == 0 || fnamecmp(p, "sh.exe") == 0 @@ -8858,8 +8829,8 @@ get_option_value(name, numval, stringval * opt_type). Uses * * Returned flags: - * 0 hidden or unknown option, also option that does not have requested - * type (see SREQ_* in vim.h) + * 0 hidden or unknown option, also option that does not have requested + * type (see SREQ_* in vim.h) * see SOPT_* in vim.h for other flags * * Possible opt_type values: see SREQ_* in vim.h diff --git a/src/proto/misc1.pro b/src/proto/misc1.pro --- a/src/proto/misc1.pro +++ b/src/proto/misc1.pro @@ -103,4 +103,5 @@ void addfile __ARGS((garray_T *gap, char char_u *get_cmd_output __ARGS((char_u *cmd, char_u *infile, int flags, int *ret_len)); void FreeWild __ARGS((int count, char_u **files)); int goto_im __ARGS((void)); +char_u *get_isolated_shell_name __ARGS((void)); /* vim: set ft=c : */ diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -735,6 +735,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 276, +/**/ 275, /**/ 274,