Исключение переменных среды из автозаполнения ZSH

Быстрый пример:

~ $ wor<TAB>
~ $ WORDCHARS=                                                                                                                                                                                                             
WORDCHARS    WORKON_HOME  WORKON_HOME  workon 

workon это желаемая команда. Есть ли способ исключить переменные окружения из автозаполнения в ZSH?

3 ответа

Решение

Я не нашел такой возможности, но, возможно, вам помогут, если ваше заполнение будет чувствительным к регистру. Вы можете установить это в своем ~/.zshrc:

# Set to this to use case-sensitive completion
CASE_SENSITIVE="true" 

TL;DR

Добавьте это в свой ~/.zshrc

function _parameters() {}

Пояснение:

В системе завершения zsh каждый завершаемый шаблон сопоставляется с некоторой функцией завершения. В случае, когда завершение вызывается в позиции команды (на языке zsh lingo), zsh вызывает функцию, связанную со специальным шаблоном -command-.

Все шаблоны завершения и функции хранятся в _comps_переменная как ассоциативный массив. Итак, вы можете увидеть, какая функция вызывается для выполнения таких команд:

echo ${_comps[-command-]}

В моем случае функция _command_names. Если мы посмотрим на исходный код этой функции,

whence -f _command_names

тогда вы увидите все источники, из которых собраны возможные завершения. Это могут быть встроенные программы, исполняемые файлы по пути, локальные исполняемые файлы, если префикс завершения содержит косую черту, псевдонимы, функции, задания, зарезервированные слова и, что особенно важно, параметры, которые включают переменные среды. Глядя на код _command_names Я вижу, что нужно ли предлагать параметры или нет, не было сделано настраиваемым - _parametersфункция вызывается всегда. В _parameters функция также не кажется достаточно настраиваемой.

На данный момент мы знаем достаточно, чтобы рассмотреть несколько решений. Можно было бы изменить _command_names и удалите parameters:_parametersисточники. Другой - сделать _parametersне работать. Второй вариант выглядит менее подверженным ошибкам, поэтому я рекомендую его.


Обратите внимание, что переопределение _parameters функция также отключает переменные среды завершения в других местах (например, ввод $а затем нажмите Tab). Чтобы разрешить заполнение переменных среды в других местах, исправление _parametersвместо переопределения это возможное решение. Вот пример:

autoload +X _parameters # load it for patching latter
functions[_parameters]="
[[ \$curcontext = -command- ]] && return
$functions[_parameters]"

Он пропускает обработку переменных среды, если $curcontext, контекст для вызываемой функции завершения находится в имени программы. Спасаясь от него нужно сделать расширение $curcontext происходит до тех пор, пока исправленная функция не будет выполнена.

Вам нужно скрыть параметры в позиции команды, поэтому используйтеtag-order:

      zstyle ':completion:*:-command-:*' tag-order '!parameters'

The !parametersчасть говорит, что нужно скрыть параметры, когда завершено-command-позиция:

! теги...

Строка, начинающаяся с восклицательного знака, указывает имена тегов, которые не следует использовать. Эффект такой же, как если бы были перечислены все другие возможные теги контекста.

Другие вопросы по тегам