suppose I have following entry in my /etc/hosts
192.168.1.10 server1.mydomain.com
and I have a directory SERVER-FILES
in current dir. I want to scp
the directory SERVER-FILES
somewhere. I type SE
and use autocompletion to complete the directory name:
$ scp -rp SE<TAB>
This completion should be totally unambiguous. But zsh autocomplletion tries to be too smart, and treats hostnames case-insensitive, and thus attempts to match SE
to hostnames:
$ scp -rp SE<TAB>
SERVER-FILES/
server1.mydomain.com
How can I disable this annoying feature, where zsh is trying to match hostnames case-insensitive, and therefore completes SE<TAB> to
server1.mydomain.com` ?
UPDATE:
Based on suggestions from @zeppelin
, I have changed the following line in the ssh completion file Unix/_ssh
:
- compadd -M 'm:{a-zA-Z}={A-Za-z} r:|.=* r:|=*' "$@" $config_hosts
+ compadd "$@" $config_hosts
but that did not help. It has absolutely no effect.
And I don't understand the answer from @Tomasz Pala
. My zsh completion is not case-insensitive.
Please sopmebody just tell me what I need to change in /usr/share/zsh/functions/Completion/Unix/_foo
to change this behaviour.
UPDATE 2
I have finally narrowed the problem down, and found out why the solution from @Tomasz Pala
did work for him, but not for me:
When I change the Unix/_hosts
file on a newly setup machine/user account, the solution works.
scp -r SE<TAB>
The above command ignores server1.mydomain.com
in /etc/hosts
, and only offers local directory SERVER-FILES
for completion.
But this does not work for me on my existing user account, because I have
server.mydomain.com
in my ~/.ssh/config
. When I remove the entry, then everything works as desired.
But how can I make this hack work even with my current ~/.ssh/config
?
Best Answer
Second answer tries to explain that you need to do two things:
1_ make sure your general matching rules are not case-insensitive (
matcher-list
) - from the updated question it's not,2_ change Unix/(Type/)_hosts (the actual location might vary, but not the Unix/_ssh - this one handles
~/.ssh/config
hosts, see below) last 2 lines to:All of this was already summarized in my answer, so simply try doing this without reading all the rationale before. Also, since your global config is not case-insensitive, the @zeppelin's answer should also work, although it doesn't use $fpath and removes also small->CAPS matching of the hosts.
I did test this with your settings from the update and it works as expected.
Update: remember that
zsh
keeps it's functions loaded, so after modifying the_hosts
you need to reload it either by logging in fresh, or:Also remember that
zsh
can have the scripts 'compiled' inzwc
form (zcompile [file]
) and if such file exists and is newer than the source it would be used instead.Ad. update 2:
Handling the
~/.ssh/config
defined hosts is actually pretty much the same as for_hosts
- depending on your zsh version in either Unix/(Command/)_ssh or Unix/(Type/)_ssh_hosts change thecompadd -M 'm:{a-zA-Z}={A-Za-z} r:|.=* r:|=*' "$@" $config_hosts
line to
compadd -M 'm:{a-z}={A-Z} r:|.=* r:|=*' "$@" $config_hosts