zsh 自动完成网络上的通配符

zsh 自动完成网络上的通配符

我最喜欢的 zsh 功能之一是自动完成,尤其是当我在联网的机器上完成文件名时。但是如何包含通配符(如 *)并让它从远程机器自动完成?

例如,假设我在服务器上有文件 1、文件 2 和文件 3;我想将所有这些文件复制到本地机器,因此我输入

scp server:~/fi<tab>

zsh 然后正确地自动完成到

scp server:~/file

但当我尝试通配符时

scp server:~/file*<tab>

它所做的只是向我发出哔哔声(如果文件路径是本地的,它就可以正常工作)。是否有一组 zsh 选项可以使其工作?

答案1

认为设置 GLOB_COMPLETE 应该可以改变这一点。

setopt GLOB_COMPLETE

man zshoptions

全局完成

当当前单词具有 glob 模式时,不要插入扩展产生的所有单词,而是像 MENU_COMPLETE 一样生成匹配项以进行补全并循环遍历它们。生成匹配项就像在单词末尾添加了“*”一样,或者在设置 COMPLETE_IN_WORD 时插入到光标处。这实际上使用了模式匹配,而不是 glob,因此它不仅适用于文件,还适用于任何补全,例如选项、用户名等。

请注意,使用模式匹配器时,不能使用匹配控制(例如,不区分大小写或锚定匹配)。此限制仅在当前单词包含模式时适用;简单地打开 GLOB_COMPLETE 选项不会产生此效果。

答案2

无论出于什么原因,在 scp/ssh 中的远程路径中使用时,都必须转义 glob 字符。

scp server:~/file\*<tab>

如果你想使用 glob 来 scp 一堆文件(而不是使用 glob 补全),这也是正确的,例如

scp server:~/files/project.\* ~/localdir

相关内容