Хорошо, немного предыстории: я использую Mac, и я делаю как можно больше в CLI.
В частности, я часто вставляю флешку cp
или mv
файл поверх, а затем сразу же желаю извлечь (отключить и отключить) ее. Обычно это можно сделать несколькими нажатиями клавиш, за исключением размонтирования, которое требует (в 10.7) перехода к пустому месту на рабочем столе (обычно, как минимум, в два пробела), выбора диска и нажатия «command-e». Откровенно говоря, эта размонтированная процедура, на несколько порядков, является самой трудоемкой и утомительной частью процесса.
Было бы гораздо более естественным и эффективным просто набирать текст, скажем:
ej<tab> J<tab>
Скажи, что моя флешка монтируется в / Volumes / Jefferson. То, что я ожидал бы получить от моих 6 нажатий клавиш, является следующим:
eject /Volumes/Jefferson
Это должно запустить команду:
diskutil unmount /Volumes/Jefferson
Итак, я написал миленькую функцию:
eject() {
diskutil unmount /Volumes/$1
}
И функция завершения, чтобы пойти с этим:
compdef '_files -g "/Volumes/*"' eject
Однако с этим есть проблема. _files
Функция генерирует полные пути. Теперь я могу изменить строку в моей функции «извлечения» на diskutil unmount $1
, и все будет работать, но тогда я не смогу набрать первую букву имени точки монтирования, поскольку путь начинается с / Volumes /. Например, если я наберу J<tab
, я получу автозаполнение для файлов в PWD. Я должен был бы напечатать, /Volumes/J<tab>
чтобы получить желаемое завершение.
Итак, есть ли функция завершения, которая захватывает имена файлов из предопределенного определенного места, а не генерирует полные пути?
Я действительно хотел бы уменьшить это до 6 нажатий клавиш.
источник
compdef
строку в файл,_eject
расположенный в моем fpath. Я пробовал с и без линии автозагрузки. Я посмотрел несколько руководств по функциям завершения, и никто не рассказал, как сделать настоящий простой пример, подобный этому, и ничего из того, что я пробовал, основываясь на любом из их примеров, не сработало.#compdef eject
качестве первой строки файла необходимо указать реальный код. См. В разделе « Автозагрузка файлов» в руководстве. Если вы сначала не добавили строку, вам может потребоваться удалить кэш~/.zcompdump
и перезапустить zsh.~/.zcompdump
сделал свое дело. Еще раз спасибо!