zsh文件名Tab补全对自定义脚本./import无效,但对ls等系统命令正常
zsh文件名Tab补全对自定义脚本./import无效,但对ls等系统命令正常
哦,这个问题我碰到过!核心原因是zsh的补全系统把你当前目录的./import脚本和系统里自带的import命令(来自ImageMagick工具集)搞混了,用了错误的补全规则。
你看你贴的调试输出里,tags in context :completion::complete:import::下面关联的是_imagemagick——这个是系统import命令的补全配置,而那个命令是用来截图、处理图片的,它的补全逻辑根本不需要普通文件名的补全,所以你按Tab的时候zsh就只会哔哔,不会给你补全文件名。而ls、zip这些命令的补全规则本来就是针对文件路径的,所以完全正常。
给你几个解决办法,按需选择:
最简单的临时方案:改脚本名
把你的import脚本改个名字,比如myimport或者import-data,这样zsh就不会和系统的import命令混淆,补全自然就恢复正常了,不需要改任何配置。永久方案:给自定义脚本加专属补全规则
如果你不想改名字,可以给./import写个专属的补全函数:- 先在终端里(或者加到你的
~/.zshrc里)定义补全函数:_import() { # 这里替换成你的脚本实际支持的命令列表 local -a supported_commands=(capitalone) _arguments \ ':操作命令:->cmd' \ ':目标文件:_files' case "$state" in cmd) _describe '支持的命令' supported_commands ;; esac } - 把这个函数和你的脚本关联起来:
如果只在当前目录用,直接运行compdef _import ./import;如果经常用,把上面的函数加到~/.zshrc,然后再加上compdef _import import(这样会覆盖系统import的补全,如果你不用系统的那个命令的话完全没问题)。
- 先在终端里(或者加到你的
应急小技巧:强制文件补全
如果只是偶尔用,不想改名字也不想写配置,按Tab之前先按Ctrl+X /,这是zsh的「强制文件补全」快捷键,会忽略当前命令的默认补全规则,直接给你补全文件名。
备注:内容来源于stack exchange,提问作者Rick
相关产品推荐
相关产品推荐

