ZSH 自动补全配置

我最喜欢的 shell 是 zsh,它的自动补全功能非常强大,但是经过长期的使用我也感受到一些问题。为了解决这些问题,我查找资料并按自己的喜好配置了它的自动补全系统。本文记录了我的配置。

遇到的问题

incr 的不恰当补全

incr@y-fujii 编写的一个增量自动补全脚本,对我来说非常有用。但是在使用 ffmpeg 时,它很喜欢把极其常用的 -i (指定输入文件)补全成 -ignore_unknown (使用频率低得多)。由于 incr 缺少文档,我不知道如何配置,我只能在 ffmpeg 上彻底禁用 incr。

观察 incr 的源码,可以看到作者(可能是出于类似的原因?)已经禁用了一些命令的补全:

1
2
3
4
5
6
compdef -d scp
compdef -d tar
compdef -d make
compdef -d java
compdef -d svn
compdef -d cvs

模仿作者的做法,我们只需在 ~/.zshrcsource ~/.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 即可。

禁用对远程路径的补全

当使用 rsyncscp 等命令时,zsh 会对远程路径进行补全,这需要对远程服务器进行 SSH 访问。这是一个非常有用的功能,但是我的 SSH 私钥储存在 Yubikey 里,每次打开 SSH 连接都要触摸 Yubikey,zsh 在进行补全时会因为等待 Yubikey 而卡死。因此我禁用了对远程路径的补全。只需在 ~/.zshrc 中加入一行 zstyle ':completion:*' remote-access no 即可。

References

  1. Fixing slow Zsh command completion
  2. GitHub Discussions - How do I disable path completion on remote hosts?

关于更详细(也更难看懂)的配置,你可以参考 zshmoduleszshcompsys 的 man page,尤其是其中对 zstyle 的解释。

作者

Cao Mingjun

发布于

2023-08-08

更新于

2023-08-08

许可协议

评论