Команда лечения, как другая для целей завершения

Вы ищете что-то вроде

grep -q '+1' file && echo  found

Или, возможно,

[[ $foo =~ '+1' ]] && echo found
3
25.01.2019, 23:20
2 ответа

Следующий фрагмент приводит к завершению mcdкакmkdir:

compdefas () {
  if (($+_comps[$1])); then
    compdef $_comps[$1] ${^@[2,-1]}=$1
  fi
}
compdefas mkdir mcd

Это работает, чтобы найти текущую настройку завершения для mkdir. Код завершения для функции (обычно имя функции завершения )хранится в ассоциативном массиве _comps. Таким образом, compdef $_comps[mkdir] mcdобъявляет, что mcdдолжно быть завершено так же, как mkdirзавершено прямо сейчас.

Функция выше добавляет несколько тонкостей:

  • Проверка для (($+_comps[$1]))гарантирует, что если $1не имеет указанного метода завершения, то для других аргументов метод завершения не задан.
  • ${@[2,-1]}— это список аргументов функции, начиная со второго, поэтому вы можете указать более одного имени команды для определения завершения. На самом деле это ${^@[a,-1]}, так что текст вокруг расширения массива реплицируется для каждого элемента массива .
  • =$1устанавливает имя службы для использования . Это имеет значение только для нескольких команд, функция завершения которых обрабатывает несколько тесно -связанных команд. Например, функция завершения _gzipобрабатывает как gzipи gunzip, так и pigzи unpigz; compdef _gzip fooзаставляет fooиспользовать поведение _gzipпо умолчанию, а compdef _gzip foo=pigzзаставляет fooиспользовать поведение _gzipпосле завершения для pigz.

Обращаясь к вашему конкретному случаю, завершение по умолчанию для mkdirпредлагает не только каталоги, но и опции, которые ваша функция не поддерживает. Так что на самом деле вам лучше определить mcdкак просто заполнение существующих каталогов. Zsh поставляется со вспомогательной функцией для (недокументированной оболочки вокруг_files).

compdef _directories mcd

Причина, по которой вы получали эти причудливые -варианты завершения для mcd, заключается в том, что это имя команды из когда-то умеренно распространенного набора команд mtools .

2
27.01.2020, 21:21

compdef использует следующую форму:

compdef [ -ane ] function name

, поэтому одной из идей было бы указать nameиз mcdна функцию _mkdirс помощью следующей команды:

compdef _mkdir mcd

однако это немного неверно, так как mkdirдополняет различные флаги, которые, вероятно, не следует также указывать для cd. Более прямым было бы завершение каталогов:

compdef _directories mcd
2
27.01.2020, 21:21

Теги

Похожие вопросы