在 zsh 的 $PATH 缓存中重建自动完成索引(或任何名称)和二进制文件

在 zsh 的 $PATH 缓存中重建自动完成索引(或任何名称)和二进制文件

安装新软件后,已使用 zsh 打开的终端将不知道新命令,并且无法为这些命令生成自动完成。显然打开一个新终端可以解决问题,但是可以重建索引(或您所说的任何名称)以便自动完成功能可以在旧终端上运行吗?

我尝试过,compinit但这没有帮助。另外,有没有一种不依赖shell的方法?很高兴有一种方法来验证答案(除了卸载某些东西并重新安装它)。

我的意思是在输入命令名称的几个字符后,我可以按Tab,然后zsh应该执行其余操作以提取完整名称。

答案1

要重建可执行命令的缓存,请使用rehashhash -rf

确保您没有取消设置该hash_list_all选项(这会导致更少的磁盘访问,但会降低缓存更新的频率)。

如果您不想键入命令,则可以通过将以下行放入您的~/.zshrc¹ 中来告诉 zsh 在完成时不要信任其缓存:

zstyle ":completion:*:commands" rehash 1

虽然存在性能成本,但在当今的典型桌面设置中可以忽略不计。 (如果您使用的$PATH是 NFS 或 RAM 匮乏的系统,则情况并非如此。)

zstyle命令本身记录在zshmodule手册页中。样式值记录在zshcompsyszshcompwid手册页中,或者您可以阅读源代码(此处为_command_names函数的源代码)。如果您想要一些可读的文档……如果您找到了一些,请告诉我!

¹需要 zsh≥4.3.3,谢谢克里斯·约翰森

答案2

如果您在新命令的“参数完成”工作中遇到问题,那么编译可能是您需要的命令,但是它的缓存机制可能会导致您的问题。

我的版本(4.3.10)的文档说编译使用缓存的“转储文件”.zcompdump来存储编译完成函数以加速后续调用。仅当它注意到完成文件(以或fpath开头的元素文件)数量发生变化时,它才会使转储文件失效。据推测,安装新软件会改变此类完成文件的数量(假设它还安装了其#compdef …#autoload …桀骜在正确的位置自动完成文件),所以我希望一个简单的compinit工作。如果您遇到它不起作用的情况,您可能需要绕过转储文件或手动使转储文件失效。

要跳过使用转储文件,请使用compinit -D;这只会影响当前的 shell。

要重建转储文件,请将其删除并重新运行compinit

rm -i ${ZDOTDIR:-${HOME:?No ZDOTDIR or HOME}}/.zcompdump &&
compinit

这将影响当前 shell、运行 plain 的现有 shellcompinit以及任何未来的 shell。

答案3

我发现,在处理/开发存在于文件中的完成时,#compdef _foo foo我需要在每次编辑时使用:

unfunction _foo && compinit

以查看更新后的foo命令完成更新后的更改。

相关内容