安装新软件后,已经打开的带有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
。