zsh-дополнение для пользовательского скрипта: URL + необязательные параметры

zsh-дополнение для пользовательского скрипта: URL + необязательные параметры

У меня есть автодополнение 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 --ATabzsh пытается завершить либо опциональный, либо не опциональный аргумент номер 1. Действие для аргумента 1 пустое, что попадает в то, чторуководствоописано в разделе «(одиночный пробел без кавычек)» (этот случай фактически срабатывает, если действие состоит исключительно из нуля или более символов пробела):

Это полезно, когда требуется аргумент, но невозможно или нежелательно генерировать для него совпадения. Сообщение будет отображено, но не будет перечислено завершений.

Нет сообщения для отображения: ввод сообщения представляет собой один пробел, поэтому действие «отобразить» не имеет визуального эффекта. Однако внутренние действия отображения сообщения (в_message) выполняются, и в частностиcompstate[insert]установлено как пустое. Это сигнализирует пользовательскому интерфейсу завершения, что завершение неоднозначно, даже если оказывается, что есть единственное допустимое завершение.

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

_arguments … '1: :()'
_arguments … '1: :{}'
_arguments … '1: : true'

Обратите внимание, если аргумент — URL, вам, вероятно, следует использовать _urls. Это все равно приведет только к дополнениям для опций после ввода -(при условии, что ни один URL не начинается с , -или у вас есть очень агрессивные настройки дополнения подстрок).

Связанный контент