我最喜欢的 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