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


75

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

我尝试过,compinit但是没有帮助。另外,有一种不依赖于shell的方法吗?最好也有一种方法来验证答案(除了卸载并重新安装之外)。

我的意思是在输入命令名称的几个字符后,我可以按Tabzsh其余的操作应提取全名。


1
当您说现有的外壳程序“无法为[新命令]生成自动完成功能”时,您可能会想到两种类型的自动完成功能:“命令完成功能” —尝试让外壳程序在完成时建议新命令的名称在命令位置,然后是“参数完成” —在键入新命令的名称后,尝试让外壳为新命令建议选项/参数。哪个给您带来了问题?
克里斯·约翰森

1
好问题!我一直以为做不到,我也没想去检查
迈克尔·莫罗泽克

1
题外话-人们是如此善变,有4个人喜欢,但只有2个人赞成。。。
xenoterracide

@Chris,我的意思是在输入命令名称的几个字符并按tab后,zsh应该做剩下的事情并提取全名。
phunehehe

@xeno我也注意到了;偏爱某些东西却
不赞成却很

Answers:


76

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

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

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

zstyle ":completion:*:commands" rehash 1

有性能成本,但是在今天的典型台式机设置中可以忽略不计。(如果您使用的$PATH是NFS或内存不足的系统,则不是这样。)

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

¹ 要求zsh≥4.3.3,谢谢Chris Johnsen


3
无论是哪种重新散列咒语,都应在以前已完全散列的shell中启用“新命令”的命令名完成。设置PATH(或路径)也将导致重新哈希;因此 PATH="$PATH"也可以完成这项工作。 HASH_LIST_ALL在我的文档中显示为默认值。
克里斯·约翰森

那就是我的答案。
BaiJiFeiLong:

13

如果在使用新命令的“参数完成”时遇到问题,则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。


某些zsh框架(例如)zim允许使用每个主机的转储文件。在这种情况下,还请$zcompdump_file与一起删除.zcompdump
sebastian
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.