Как вывести список всех автозаполнений zsh?

В zsh я пытаюсь получить представление о том, какие команды имеют существующее завершение, чтобы я мог написать дополнения для команд, которых нет.

Есть ли способ перечислить команды, которые zsh выполнит без поиска файлов завершения? Например, есть ли встроенная команда, которая будет их перечислять?


person tegarri    schedule 13.10.2016    source источник


Ответы (1)


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

Вы можете получить полный список команд с соответствующими дополнениями с помощью следующей команды:

for command completion in ${(kv)_comps:#-*(-|-,*)}
do
    printf "%-32s %s\n" $command $completion
done | sort

Объяснение:

  • for command completion in LIST; COMMAND выполняет итерации по LIST, беря два элемента, command и completion, на каждой итерации и выполняя для них COMMAND. Это также краткая форма цикла for, для которого не требуются do и done.
  • ${(kv)ASSOC_ARRAY} расширяет ассоциативный массив ASSOC_ARRAY до разделенного пробелами списка пар ключ-значение. Таким образом, это чередующийся список «ключ1 значение1 ключ2 значение2 ключ3 значение3…», который используется двумя аргументами цикла for. $ASSOC_ARRAY расширится только до списка значений.
  • ${ASSOC_ARRAY:#PATTERN} отфильтровывает все элементы ASSOC_ARRAY из своего расширения, где ключ соответствует PATTERN.
  • Шаблон -*(-|-,*) соответствует именам всех специальных контекстов, например -math-, -parameter- или -value-,NAME,COMMAND. Он также будет фильтровать любое имя команды, которое соответствует либо -*-, либо -*-,*, если такая команда имеет завершение в вашей системе. (Вы можете просто не использовать фильтр шаблонов, чтобы быть уверенным)
  • printf "%-32s %s\n" $command $completion делает форматированный вывод, так что вы получите красивую таблицу. $command печатается вместо %-32s, дополняется до 32 символов с выравниванием по левому краю (-). $completion печатается вместо %s.
  • | sort: ассоциативные массивы неупорядочены, поэтому вывод цикла необходимо пропустить через sort, чтобы получить упорядоченный список.
person Adaephon    schedule 13.10.2016
comment
Что здесь означают key и value? - person kapad; 03.11.2020