安装新软件后,已经打开的带有zsh的终端将不知道新命令,并且无法为这些命令生成自动完成功能。显然打开一个新终端可以解决此问题,但是可以重建索引(或您所谓的索引),以便自动完成功能可以在旧终端上运行吗?
我尝试过,compinit但是没有帮助。另外,有一种不依赖于shell的方法吗?最好也有一种方法来验证答案(除了卸载并重新安装之外)。
我的意思是在输入命令名称的几个字符后,我可以按Tab,zsh其余的操作应提取全名。
安装新软件后,已经打开的带有zsh的终端将不知道新命令,并且无法为这些命令生成自动完成功能。显然打开一个新终端可以解决此问题,但是可以重建索引(或您所谓的索引),以便自动完成功能可以在旧终端上运行吗?
我尝试过,compinit但是没有帮助。另外,有一种不依赖于shell的方法吗?最好也有一种方法来验证答案(除了卸载并重新安装之外)。
我的意思是在输入命令名称的几个字符后,我可以按Tab,zsh其余的操作应提取全名。
Answers:
要重建可执行命令的缓存,请使用rehash或hash -rf。
确保您没有取消设置该hash_list_all选项(它导致更少的磁盘访问,但使缓存更新的频率降低)。
如果您不想键入命令,则可以通过在~/.zshrc¹中放置以下行来告诉zsh在完成时不信任其缓存:
zstyle ":completion:*:commands" rehash 1
有性能成本,但是在今天的典型台式机设置中可以忽略不计。(如果您使用的$PATH是NFS或内存不足的系统,则不是这样。)
该zstyle命令本身记录在zshmodule手册页中。样式值记录在zshcompsys和zshcompwid手册页中,或者您可以阅读源代码(此处为_command_names函数)。如果您需要一些可读的文档…如果找到一些,请告诉我!
¹ 要求zsh≥4.3.3,谢谢Chris Johnsen
PATH="$PATH"也可以完成这项工作。 HASH_LIST_ALL在我的文档中显示为默认值。
如果在使用新命令的“参数完成”时遇到问题,则compinit可能是您所需的命令,但是它具有一种可能会导致问题的缓存机制。
我的版本(4.3.10)的文档说,compinit使用缓存的“转储文件” .zcompdump来存储编译的完成函数,以加快后续调用的速度。仅当发现完成文件(fpath以#compdef …或开头的元素文件#autoload …)的数量发生变化时,它才会使转储文件无效。大概安装新软件会更改此类完成文件的数量(假设它还在正确的位置安装了zsh自动完成文件),因此我希望它能compinit正常工作。如果您无法使用转储文件,则可能需要绕过转储文件或使其无效。
要跳过使用转储文件,请使用compinit -D;这只会影响当前的shell。
要重建转储文件,请将其删除并重新运行compinit:
rm -i ${ZDOTDIR:-${HOME:?No ZDOTDIR or HOME}}/.zcompdump &&
compinit
这将影响当前的shell,运行plain的现有shell compinit以及任何将来的shell。
zim允许使用每个主机的转储文件。在这种情况下,还请$zcompdump_file与一起删除.zcompdump。