Перестройте индекс автозаполнения (или как он там называется) и двоичные файлы в кэше $ PATH в zsh

75

После установки нового программного обеспечения уже открытый терминал с zsh не будет знать о новых командах и не сможет автоматически их заполнить. Видимо, открытие нового терминала решит проблему, но можно ли перестроить индекс (или как вы его называете), чтобы автозаполнение работало на старом терминале?

Я пытался, compinitно это не помогло. Кроме того, есть ли способ, который не зависит от оболочки? Приятно также иметь возможность проверить ответ (кроме удаления чего-либо и переустановки).

Я имею в виду, что после ввода нескольких символов имени команды я могу нажать Tab, а zshостальное нужно сделать, чтобы вывести полное имя.

phunehehe
источник
1
Существует два типа автозаполнения, которые вы можете иметь в виду, когда говорите, что существующая оболочка «не может сгенерировать автозаполнение для [новых команд]»: «завершение команды» - попытка получить оболочку, предлагающую имя новой команды при завершении. в позиции команды и «завершение аргумента» - попытка заставить оболочку предлагать параметры / аргументы для новой команды после того, как вы уже ввели ее имя. Что доставляет вам проблемы?
Крис Джонсен
1
Хороший вопрос! Я всегда просто предполагал, что это не может быть сделано, я не думал проверять
Майкл Мрозек
1
оффтоп - люди так непостоянны 4 человека одобрили, но только 2 возражают ... Я нахожу странным, как мало людей одобряют вещи.
ксенотеррацид
@Chris Я имею в виду, что после ввода нескольких символов имени команды и нажатия клавиши табуляция zsh сделает все остальное и вытащит полное имя.
phunehehe
@xeno Я тоже это заметил; довольно необычно любить что-то, но не высказывать это
Майкл

Ответы:

76

Чтобы восстановить кэш исполняемых команд, используйте rehashили hash -rf.

Убедитесь, что вы не сбросили эту hash_list_allопцию (она вызывает еще меньше обращений к диску, но реже обновляет кэш).

Если вы не хотите вводить команду, вы можете указать zsh не доверять ее кешу при завершении, добавив следующую строку в ваш ~/.zshrc¹:

zstyle ":completion:*:commands" rehash 1

Производительность снижается, но сегодня она незначительна для типичной настольной системы. (Это не так, если у вас $PATHNFS или система с недостатком оперативной памяти.)

Сама zstyleкоманда описана на zshmoduleстранице руководства . Значения стилей задокументированы на страницах zshcompsysand и zshcompwidman, или вы можете прочитать источник (здесь, _command_namesфункции). Если вам нужна читаемая документация ... если найдете, дайте мне знать!

¹ требуется zsh≥4.3.3, спасибо Крис Джонсен

Жиль "ТАК - перестань быть злым"
источник
3
Любое заклинание перефразирования должно включать завершение имени команды для «новых команд» в оболочках, которые ранее были полностью хешированы. Установка PATH (или пути) также вызовет перефразировку; таким образом PATH="$PATH", также сделал бы работу. HASH_LIST_ALLотображается в моей документации по умолчанию.
Крис Джонсен
Это ответ для меня.
BaiJiFeiLong
13

Если у вас возникают проблемы с «завершением аргументов» при работе с новыми командами , возможно, вам нужна команда compinit , однако она имеет механизм кэширования, который может вызывать вашу проблему.

В документации к моей версии (4.3.10) говорится, что compinit использует кэшированный «файл дампа» .zcompdump, чтобы хранить скомпилированные функции завершения для ускорения последующих вызовов. Он делает недействительным файл дампа только тогда, когда он замечает изменение количества файлов завершения ( fpathфайлы элементов, начинающиеся с #compdef …или #autoload …). Предположительно, установка нового программного обеспечения изменит количество таких файлов завершения (при условии, что оно также установит свои файлы автозаполнения zsh в нужном месте), поэтому я ожидаю, что обычный файл будет compinitработать. Если вы находитесь в ситуации, когда это не работает, вам может потребоваться обойти или вручную сделать недействительным файл дампа.

Чтобы пропустить использование файла дампа, используйте compinit -D; это повлияет только на текущую оболочку.

Чтобы восстановить файл дампа, удалите его и запустите снова compinit:

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

Это повлияет на текущую оболочку, существующие оболочки, которые работают в обычном режиме compinit, и любые будущие оболочки.

Крис Джонсен
источник
Некоторые zsh-фреймворки, например, zimпозволяют использовать файлы дампа для каждого хоста. В этом случае также удалите $zcompdump_fileвместе с .zcompdump.
Себастьян