赏金更新

赏金更新

比方说,我在当前目录中有一个文件,test.txt我想将其传输scp到远程服务器。

当我使用完成时,即:

scp -rp test<TAB>

zsh 补全提供了以下功能,而不是为我补全文件名的其余部分:

scp -rp test<TAB>
test.txt
testuser

testuser恰好是我系统上的本地用户。当我连接到远程服务器时,为什么 zsh 完成会完成本地用户?

这似乎是一个无用且愚蠢的规则。

scp使用与 ssh 相同的完成文件/usr/share/zsh/functions/Completion/Unix/_ssh,并且ssh命令具有相同的行为,尽管在ssh这种情况下不那么烦人,因为 ssh 不应该完成本地文件名。

如何修改完成规则,scp使其仅提供本地文件名,而不提供本地用户?

赏金更新

接受的解决方案适用于scp,但问题仍然存在ssh。当我想连接myserver.domain.org并使用完成时:

ssh m<TAB>

完成系统提供myserver.domain.org(这是期望的),但也提供本地用户manmessagebus,这是愚蠢的。

如何更改完成系统,以便我可以指定(硬编码)我想要完成的用户列表,ssh/scp而不是完成所有本地用户?/etc/passwd

因此,换句话说:我不想禁用 的用户完成ssh,就像已接受的答案一样scp。但我想提供我自己的将完成的用户列表,而不是使用来自/etc/passwd

答案1

zstyle ':completion:*:scp:*' tag-order '! users'

这告诉补全系统,对于scp,不要尝试补全,users除非找不到其他补全。 (看http://zsh.sourceforge.net/Doc/Release/Completion-System.html#index-tag_002dorder_002c-completion-style


要指定使用时应填写的唯一用户名列表ssh

zstyle ':completion:*:ssh:*' users alice bob carol

(看http://zsh.sourceforge.net/Doc/Release/Completion-System.html#index-users_002c-completion-style

相关内容