On Tue, Nov 03, 2009 at 10:52:28PM +0100, Bram Moolenaar wrote:
>
> James -
>
> > The code in src/os_unix.c:mch_expand_wildcards which detects what shell
> > is being used doesn't work properly if 'shell' has been set to a shell
> > and arguments (e.g., "/bin/tcsh -f").
> >
> > 5354 else if ((len = STRLEN(p_sh)) >= 3)
> > 5355 {
> > 5356 if (STRCMP(p_sh + len - 3, "csh") == 0)
> > 5357 shell_style = STYLE_GLOB;
> > 5358 else if (STRCMP(p_sh + len - 3, "zsh") == 0)
> > 5359 shell_style = STYLE_PRINT;
> > 5360 }
> > 5361 if (shell_style == STYLE_ECHO && strstr((char *)gettail(p_sh),
> > 5362
> > "sh") != NULL)
> > 5363 shell_style = STYLE_VIMGLOB;
> >
> > Vim checks whether the last 3 characters of 'shell' are "csh". Since
> > the last 3 characters of p_sh in this case are " -f", Vim then checks
> > whether "sh" is in gettail(p_sh) and uses sh-compatible shell expansion.
> >
> > It looks like a safer approach would be to grab p_sh up to the first
> > whitespace and then use gettail() on that to get the shell name. That
> > should reduce the false-positive rate for setting STYLE_VIMGLOB in line
> > 5363.
> >
> > Although, it'll still fail with shells like fish which will pass the
> > strstr(..., "sh") check but not work with STYLE_VIMGLOB. fish does work
> > with STYLE_ECHO, so we could add that to the special-case list.
>
> Well, theoretically there could be a space in the path.I thought of that, but I figured that was quite unlikely to happen on unix systems. > I think > searching for the last slash, using gettail(), can comparing from that > position should work in most cases. That was my original idea, but that fails if the arguments after the shell contain slashes. Then again, that may be just as uncommon as having spaces in the path. > To catch "tcsh" as well as "csh" we can use "strstr" on gettail(). The current method of detecting (t)csh works fine. It's just that the string being used to do the detection contains too much information. -- James GPG Key: 1024D/61326D40 2003-09-02 James Vega <[email protected]>
signature.asc
Description: Digital signature

