zsh completion para ssh confunde nomes de hosts com arquivos locais

4

suponha que eu tenha a seguinte entrada no meu /etc/hosts

192.168.1.10      server1.mydomain.com

e eu tenho um diretório SERVER-FILES no diretório atual. Eu quero scp o diretório SERVER-FILES em algum lugar. Eu digito SE e uso autocompletar para completar o nome do diretório:

$ scp -rp SE<TAB>

Esta conclusão deve ser totalmente inequívoca. Mas o autocomplletion zsh tenta ser muito inteligente e trata nomes de host insensíveis a maiúsculas e minúsculas e, portanto, tenta corresponder SE a nomes de host:

$ scp -rp SE<TAB>
SERVER-FILES/
server1.mydomain.com

Como posso desativar esse recurso irritante, em que o zsh está tentando corresponder nomes de host sem distinção entre maiúsculas e minúsculas e, portanto, conclui SE<TAB> to server1.mydomain.com '?

Alterei a seguinte linha no arquivo de conclusão do ssh Unix/_ssh :

- compadd -M 'm:{a-zA-Z}={A-Za-z} r:|.=* r:|=*' "$@" $config_hosts
+ compadd "$@" $config_hosts

mas isso não ajudou.

    
por 400 the Cat 13.11.2016 / 11:38

1 resposta

2

Acredito que você está editando uma linha errada.

AFAIK config_hosts em Unix / _ssh refere-se às entradas do host em seu ~. / ssh / config , não / etc / hosts .

As regras de conclusão para / etc / hosts são definidas um pouco antes, no seguinte bloco:

# If users-hosts matches, we shouldn't complete anything else.
if [[ "$IPREFIX" == *@ ]]; then
  _combination -s '[:@]' my-accounts users-hosts "users=${IPREFIX/@}" hosts "$@" && return
else
  _combination -s '[:@]' my-accounts users-hosts \
    ${opt_args[-l]:+"users=${opt_args[-l]:q}"} hosts "$@" && return
fi

mas isso, por sua vez, apenas reutiliza o estilo hosts definido em Unix / _hosts

Então, se você editar a definição compadd no final do arquivo Unix / _hosts desta forma:

#_wanted hosts expl host \
#    compadd -M 'm:{a-zA-Z}={A-Za-z} r:|.=* r:|=*' -a "$@" - _hosts
_wanted hosts expl host \
     compadd -a "$@" - _hosts

você deve obter o comportamento desejado.

P.S.

Por favor, note que a edição de arquivos de conclusão de todo o sistema geralmente não é uma prática muito boa, então você pode querer apenas redefinir hosts em sua configuração local do ZSH, por exemplo. adicionando uma função como essa ao seu ~. / zsh:

_hosts() { compadd $(getent hosts | tr -s ' ' '\t' | cut -f2) }
    
por 21.11.2016 / 21:39