Перебудуйте автоматично заповнений індекс (або як його ще називають) та двійкові файли в кеші $ PATH в zsh


75

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

Я намагався, compinitале це не допомогло. Також, чи існує спосіб, який не залежить від оболонки? Приємно мати спосіб перевірити відповідь також (за винятком деінсталяції та перевстановлення).

Що я маю на увазі, після введення декількох символів імені команди я можу натиснути Tab, а мені zshслід зробити все, щоб підняти повне ім’я.


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сторінці man. Значення стилів задокументовано на сторінках man zshcompsysі zshcompwidman, або ви можете прочитати джерело (тут, _command_namesфункції). Якщо ви хотіли читати документацію… якщо ви знайдете її, дайте мені знати!

¹ вимагає zsh≥4.3.3, спасибі Chris Johnsen


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.
себастьян
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.