Завершения файлов ZSH из 2-го пути

У меня есть 2 папки, содержащие папки

/me/foo/: 
  a/
  b/
  c/

/me/bar/:
  c/
  d/
  e/

Я хочу создать функцию завершения для команды baz, чтобы

$ baz [tab]

дает аргументы завершения следующим образом

a b c d e

обратите внимание на дубликат c, написанный только один раз, и он не включает завершающую косую черту.

Я знаю, как выполнить завершение с помощью _files, но это дает мне файл только из одного каталога.

Как я могу это сделать?


person ahmy    schedule 07.04.2016    source источник


Ответы (1)


Я обнаружил, что это работает для меня

local services
services=$(ls -d /me/foo/*/ /me/bar/*/ | xargs basename| uniq)
_alternative "dirs:some directories:($services)"
person ahmy    schedule 07.04.2016
comment
Это не похоже на то, что services будет содержать каждое имя только один раз. Это также зависит от реализации basename, не все из которых допускают несколько аргументов по умолчанию. Я бы предложил использовать local -U services=((foo|bar)/*(/:t)). С -U массив сохраняет только первое вхождение идентичных значений. (foo|bar)/* соответствует любому потомку каталогов foo и bar. Квалификатор (/) ограничивает это только каталогами, а (:t) удаляет все ведущие компоненты пути, также известные как basename. Это также устраняет необходимость в какой-либо внешней команде. - person Adaephon; 08.04.2016
comment
Хм, я получаю неправильный шаблон при попытке local -U services((foo|bar)/*(/:t) и echo $service ошибка была a.zsh:1: bad pattern: services((foo|bar)/*(/:t)\necho \n где я могу найти документацию по этому шаблону? - person ahmy; 08.04.2016
comment
Похоже, что = отсутствует. Но я получаю то же сообщение об ошибке (даже с =) при попытке запустить это на более старой версии zsh с версией 5.0.6. Сейчас использую 5.2. Кажется, в 5.1 была добавлена ​​возможность верстки и назначения массивов одной командой . Разделение на local -U services и services=(…) должно работать. Что касается документации: посмотрите раздел Генерация имени файла в руководстве ЗШ. - person Adaephon; 08.04.2016