#542430 [vim] vim try to expand files or directories that contain ~ (when using tcsh shell)

Package:
vim
Source:
vim
Description:
Vi IMproved - enhanced vi editor
Submitter:
gregory hainaut
Date:
2021-03-28 12:30:29 UTC
Severity:
normal
Tags:
#542430#5
Date:
2009-08-19 15:55:54 UTC
From:
To:
--- Please enter the report below this line. ---

Hi,

To reproduce the bug. Just create a directory with a ~ (mkdir
-p /tmp/bad~dir). Then when you do a ":chdir /tmp/bad~dir", an error
is raised "E79: Cannot expand wildcards".
As a side effect it is not possible to use a tags file in the bad~dir
or below (/tmp/bad~dir/tags) because it will no be seen by vim.

Note I have not tested all shell but the bug appears with the tsch
shell (and not zsh for example). So you must use this option "set
shell=/bin/tcsh\ -f".

Please find attached a patch that seems solve the problem not sure it
is the good solution (and works in all situations). Maybe a solution
will be to escaped ~ like '\~' before sending to the tcsh shell.

Note: Tcsh debian version is 6.14.00-7

Best Regards,
Gregory


Debian Release: squeeze/sid
  500 unstable        ftp.fr.debian.org
    1 experimental    ftp.fr.debian.org
--- Package information. ---
Depends                   (Version) | Installed
===================================-+-====================
vim-common        (= 2:7.2.245-2)   | 2:7.2.245-2
vim-runtime       (= 2:7.2.245-2)   | 2:7.2.245-2
libacl1               (>= 2.2.11-1) | 2.2.47-3
libc6                    (>= 2.3.4) | 2.9-25
libgpm2                 (>= 1.20.4) | 1.20.4-3.2
libncurses5     (>= 5.6+20071006-3) | 5.7+20090803-1+b1
libselinux1             (>= 2.0.85) | 2.0.85-1


Package's Recommends field is empty.

Suggests         (Version) | Installed
==========================-+-===========
ctags                      |
vim-doc                    |
vim-scripts                | 20090211-1

#542430#10
Date:
2009-08-20 14:28:23 UTC
From:
To:
This looks good to me.  I'll forward it upstream and see what he thinks.
Thanks for the patch. :)

#542430#15
Date:
2009-11-03 20:52:44 UTC
From:
To:
Looking into this further, this isn't actually a problem with using tcsh
or the expansion of '~'.  The problem is what that Vim isn't properly
detecting which shell you're using because you've set 'shell' to
"/bin/tcsh -f" instead of simply "/bin/tcsh".

In src/os_unix.c

5354     else if ((len = STRLEN(p_sh)) >= 3)
5355     {
5356         if (STRCMP(p_sh + len - 3, "csh") == 0)
5357             shell_style = STYLE_GLOB;

Vim checks whether the last 3 characters of 'shell' are "csh".  Since
that fails with your setting, Vim then uses an sh-compatible method for
expansion.  This obviously fails with tcsh.

So, the simple workaround for now is to simply "set shell=/bin/tcsh".
I'll send this information to Bram so he knows about it.

#542430#20
Date:
2009-11-03 21:12:43 UTC
From:
To:
Bram,

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.

#542430#23
Date:
2009-11-03 21:12:43 UTC
From:
To:
Bram,

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.

#542430#28
Date:
2009-11-03 21:52:28 UTC
From:
To:
James -

Well, theoretically there could be a space in the path.  I think
searching for the last slash, using gettail(), can comparing from that
position should work in most cases.  To catch "tcsh" as well as "csh" we
can use "strstr" on gettail().  That only fails for "sh -csh", but
that's unlikely to be used :-).

#542430#29
Date:
2009-11-03 21:52:28 UTC
From:
To:
James -

Well, theoretically there could be a space in the path.  I think
searching for the last slash, using gettail(), can comparing from that
position should work in most cases.  To catch "tcsh" as well as "csh" we
can use "strstr" on gettail().  That only fails for "sh -csh", but
that's unlikely to be used :-).

#542430#34
Date:
2009-11-03 22:44:22 UTC
From:
To:
I thought of that, but I figured that was quite unlikely to happen on
unix systems.

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.

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.

#542430#39
Date:
2014-08-19 20:10:51 UTC
From:
To:
Date: Wed, 19 Aug 2009 17:55:54 +0200
#542430#44
Date:
2021-03-28 12:29:49 UTC
From:
To:
Hello Please
I am Mr. Jerry Kloubarly Ngessan, I stopped at your email from our
international business directory in my research for a reliable person
to partner with, I have a business that will profit us both that I
want us to discuss. You can contact me for more details for convenient
business discussion if you are interested.
My email is   (jerrykloubarlyngessan@gmail.com)  I will be glad to
hear from you soon for more  details
Thanks for your time and waiting for your response
Mr.Jerry Kloubarly Ngessan

#542430#45
Date:
2021-03-28 12:29:49 UTC
From:
To:
Hello Please
I am Mr. Jerry Kloubarly Ngessan, I stopped at your email from our
international business directory in my research for a reliable person
to partner with, I have a business that will profit us both that I
want us to discuss. You can contact me for more details for convenient
business discussion if you are interested.
My email is   (jerrykloubarlyngessan@gmail.com)  I will be glad to
hear from you soon for more  details
Thanks for your time and waiting for your response
Mr.Jerry Kloubarly Ngessan