ZSH 自动补全配置
我最喜欢的 shell 是 zsh,它的自动补全功能非常强大,但是经过长期的使用我也感受到一些问题。为了解决这些问题,我查找资料并按自己的喜好配置了它的自动补全系统。本文记录了我的配置。
遇到的问题
incr 的不恰当补全
incr 是 @y-fujii 编写的一个增量自动补全脚本,对我来说非常有用。但是在使用 ffmpeg
时,它很喜欢把极其常用的 -i
(指定输入文件)补全成 -ignore_unknown
(使用频率低得多)。由于 incr 缺少文档,我不知道如何配置,我只能在 ffmpeg
上彻底禁用 incr。
观察 incr 的源码,可以看到作者(可能是出于类似的原因?)已经禁用了一些命令的补全:
1 |
|
模仿作者的做法,我们只需在 ~/.zshrc
中 source ~/.oh-my-zsh/plugins/incr/incr*.zsh
后加入一行 compdef -d ffmpeg
即可。不建议直接更改 incr 的源码,因为如果 incr 更新你还得合并更改。
禁用对 host 的补全
对于较大的 /etc/hosts
文件,zsh 的补全会变得非常缓慢,且在补全过程中占用 100% 的 CPU 时间。由于我启用了 zsh-autosuggestions 插件,即使不按 tab 也会计算自动补全选项,这有时会完全卡死我的终端。我不需要对主机名的补全,所以我禁用了它。只需在 ~/.zshrc
中加入一行 zstyle ':completion:*' hosts off
即可。
禁用对远程路径的补全
当使用 rsync
或 scp
等命令时,zsh 会对远程路径进行补全,这需要对远程服务器进行 SSH 访问。这是一个非常有用的功能,但是我的 SSH 私钥储存在 Yubikey 里,每次打开 SSH 连接都要触摸 Yubikey,zsh 在进行补全时会因为等待 Yubikey 而卡死。因此我禁用了对远程路径的补全。只需在 ~/.zshrc
中加入一行 zstyle ':completion:*' remote-access no
即可。
References
- Fixing slow Zsh command completion
- GitHub Discussions - How do I disable path completion on remote hosts?
关于更详细(也更难看懂)的配置,你可以参考 zshmodules
和 zshcompsys
的 man page,尤其是其中对 zstyle
的解释。