Я нахожусь в процессе переноса некоторых настроек завершения tcsh на zsh, и я немного потерялся в документации. Я хотел бы завершить аргумент одним из двух способов. Если текущее завершаемое слово не содержит /, оно должно быть одной из строк. Если он содержит /, это должен быть каталог.

Этот:

_foo() {
    _arguments -C '1:Name:(Name1 Name2 Name3)' '1:Directory:_path_files -/'
}

Не работает, так как нельзя указывать дважды один и тот же аргумент. Я играл с _regex_arguments, но, кажется, что-то упустил, потому что у меня не было поведения, которое имело бы какой-либо смысл.

1
AProgrammer 12 Дек 2019 в 10:37

1 ответ

Я получил:

#compdef foo

_foo() {
     local curcontext="$curcontext" state line
     typeset -A opt_args
     _arguments -C '-a' '-b' '-c' '-d' '1: :->name'
     case $state in
         name)
             case $words[2] in
                 */*)
                     _arguments '*:directory:_path_files -/'
                     ;;
                 *)
                     _arguments '*:name:(Name1 Name2 Name3)'
                     ;;
             esac
     esac
}

_foo "$@"

Но я не уверен, что это лучшее решение. В частности, я скопировал использование $words из некоторых примеров, но не нашел его в документации.

1
AProgrammer 12 Дек 2019 в 10:40