#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)
? у вас есть хорошая ссылка на это, которую я могу прочитать? Спасибо