安装新软件后,已使用 zsh 打开的终端将不知道新命令,并且无法为这些命令生成自动完成。显然打开一个新终端可以解决问题,但是可以重建索引(或您所说的任何名称)以便自动完成功能可以在旧终端上运行吗?
我尝试过,compinit
但这没有帮助。另外,有没有一种不依赖shell的方法?很高兴有一种方法来验证答案(除了卸载某些东西并重新安装它)。
我的意思是在输入命令名称的几个字符后,我可以按Tab,然后zsh
应该执行其余操作以提取完整名称。
答案1
要重建可执行命令的缓存,请使用rehash
或hash -rf
。
确保您没有取消设置该hash_list_all
选项(这会导致更少的磁盘访问,但会降低缓存更新的频率)。
如果您不想键入命令,则可以通过将以下行放入您的~/.zshrc
¹ 中来告诉 zsh 在完成时不要信任其缓存:
zstyle ":completion:*:commands" rehash 1
虽然存在性能成本,但在当今的典型桌面设置中可以忽略不计。 (如果您使用的$PATH
是 NFS 或 RAM 匮乏的系统,则情况并非如此。)
该zstyle
命令本身记录在zshmodule
手册页中。样式值记录在zshcompsys
和zshcompwid
手册页中,或者您可以阅读源代码(此处为_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
命令完成更新后的更改。