Исключение переменных среды из автозаполнения 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-
позиция:
! теги...
Строка, начинающаяся с восклицательного знака, указывает имена тегов, которые не следует использовать. Эффект такой же, как если бы были перечислены все другие возможные теги контекста.