更新:

更新:

在 中zsh,ssh 和 scp 使用来自 的主机完成/etc/hosts。但是,即使我使用大写字母并且当我明显指的是文件而不是主机时,它们也会尝试匹配主机名:

$ scp -rp F<tab>
FOO.txt foo.mydomain.com

我想禁用此功能。我已经更改了以下行/usr/share/zsh/functions/Completion/Unix/_ssh

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

compadd  "$@" $config_hosts

现在,当我开始输入 ssh 命令并使用选项卡自动完成主机名时,ssh foo<tab>我收到错误:

_all_labels:39: command not found: -J

这是什么意思,我该如何解决它?

第二个问题是,在对 Unix/_ssh 进行更改后,我无法重新编译完成文件:

zcompile Unix/ Unix.zwc
zcompile: can't open file: Unix.zwc

这是我按Ctrl+ X+时得到的结果?

$ scp -rp TE
Trace output left in /tmp/zsh10048scp3 (up-history to view)
TESTING.txt
testing          testing.mydomain.com

其中 TESTING.txt 是文件, 和testingtesting.mydomain.com主机名

更新:

我注意到,_all_labels:39只有主机出现上述错误,其中包含ProxyCommand~/.ssh/config即:

Host testing        testing.mydomain.com
    Hostname        testing.mydomain.com
    User            root    
    PubkeyAuthentication    yes
    StrictHostKeyChecking   yes
    UserKnownHostsFile  ~/.ssh/known_hosts
    ProxyCommand        ssh server2.mydomain.com nc %h %p

答案1

请确保您没有删除上一行中的“\”/usr/share/zsh/functions/Completion/Unix/_ssh,同时进行更改:

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

我这样做了(删除了连续字符“\”通缉行),并得到与您完全相同的错误:

_all_labels:39: command not found: -J

另一种可能性是您可能不小心在“\”后面添加了一些额外的空格,从而禁用了它。

关于您问题的第二部分,我相信使用的正确语法是:

zcompile Unix.zwc Unix/*

(将 Unix/ 中的所有内容编译为 Unix.zwc)

相关内容