Как перечислить все автозаполнения zsh?

#shell #autocomplete #zsh #tab-completion #zsh-completion

#оболочка #автозаполнение #zsh #вкладка-завершение #zsh-завершение

Вопрос:

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

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

Ответ №1:

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

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

 for command completion in ${(kv)_comps:#-*(-|-,*)}
do
    printf "%-32s %sn" $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 %sn" $command $completion выполняет форматированный вывод, чтобы вы получили красивую таблицу. $command печатается вместо %-32s , дополняется до 32 символов с выравниванием по левому краю ( - ). $completion печатается вместо %s .
  • | sort : ассоциативные массивы неупорядочены, поэтому вывод цикла необходимо выполнить, sort чтобы получить упорядоченный список.

Комментарии:

1. Что key value здесь означают и?

2. @Adaephon как вы называете ${(kv)ASSOC_ARRAY} этот тип синтаксиса, в котором у вас есть круглые скобки и несколько букв внутри него (kv) ? у вас есть хорошая ссылка на это, которую я могу прочитать? Спасибо