比方说,我在当前目录中有一个文件,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
(这是期望的),但也提供本地用户man
和messagebus
,这是愚蠢的。
如何更改完成系统,以便我可以指定(硬编码)我想要完成的用户列表,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)