
У меня есть автодополнение zsh для пользовательского скрипта, где одним параметром должен быть URL (т. е. строка), а затем есть несколько необязательных параметров: --AAA --BBB --CCC:
_arguments -S : \
'--AAA' \
'--BBB' \
'--CCC' \
'1: :'
Однако автодополнение работает только после предоставления параметра URL, то есть:
myscript URL --A<TAB>
это будет автоматически заполнено--AAA
Но когда у меня есть:
myscript --A<TAB>
то он выведет единственный подходящий вариант --AAA, но он не будет автоматически дополнять его, даже если я это сделаю --AA<TAB>
. Мне придется вводить его вручную.
Когда я меняю свой сценарий завершения на:
_arguments -S : \
'--AAA' \
'--BBB' \
'--CCC'
автодополнение параметров работает, но как только я ввожу URL, никакие другие параметры не заполняются.
Так как же мне сообщить zsh, что мой скрипт ожидает один URL (т. е. один строковый аргумент — я не хочу, чтобы zsh начинал завершать имена файлов в текущем местоположении), а необязательные параметры могут быть завершены либо до, либо после этого URL?
Примечание: Я не пытаюсь сделать автодополнение URL. Я просто пытаюсь сделать автодополнение как до, так и после этой строки URL.
решение1
С кодом, как указано, после myscript --A
Tabzsh пытается завершить либо опциональный, либо не опциональный аргумент номер 1. Действие для аргумента 1 пустое, что попадает в то, чторуководствоописано в разделе «(одиночный пробел без кавычек)» (этот случай фактически срабатывает, если действие состоит исключительно из нуля или более символов пробела):
Это полезно, когда требуется аргумент, но невозможно или нежелательно генерировать для него совпадения. Сообщение будет отображено, но не будет перечислено завершений.
Нет сообщения для отображения: ввод сообщения представляет собой один пробел, поэтому действие «отобразить» не имеет визуального эффекта. Однако внутренние действия отображения сообщения (в_message
) выполняются, и в частностиcompstate[insert]
установлено как пустое. Это сигнализирует пользовательскому интерфейсу завершения, что завершение неоднозначно, даже если оказывается, что есть единственное допустимое завершение.
Исправление заключается в том, чтобы явно заставить zsh думать, чтонет завершений, вместо того, чтобы позволить ему думать, чтоесть завершения, но они не могут быть сгенерированы. Подойдет любой из следующих вариантов:
_arguments … '1: :()'
_arguments … '1: :{}'
_arguments … '1: : true'
Обратите внимание, если аргумент — URL, вам, вероятно, следует использовать _urls
. Это все равно приведет только к дополнениям для опций после ввода -
(при условии, что ни один URL не начинается с , -
или у вас есть очень агрессивные настройки дополнения подстрок).