завершение zsh: получение имен файлов из определенного каталога

10

Хорошо, немного предыстории: я использую 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 нажатий клавиш.

Маршалл Юбэнкс
источник

Ответы:

12
_files -W /Volumes

Смотрите документацию _path_files.

Жиль "ТАК - перестань быть злым"
источник
Отлично! Я знал, что это должно быть встроено. Большое спасибо!
Маршалл Юбэнкс
Итак, как мне получить его для автозагрузки этой функции завершения? Я попытался поместить compdefстроку в файл, _ejectрасположенный в моем fpath. Я пробовал с и без линии автозагрузки. Я посмотрел несколько руководств по функциям завершения, и никто не рассказал, как сделать настоящий простой пример, подобный этому, и ничего из того, что я пробовал, основываясь на любом из их примеров, не сработало.
Маршалл Юбэнкс
@marshaul В #compdef ejectкачестве первой строки файла необходимо указать реальный код. См. В разделе « Автозагрузка файлов» в руководстве. Если вы сначала не добавили строку, вам может потребоваться удалить кэш ~/.zcompdumpи перезапустить zsh.
Жиль "ТАК - перестань быть злым"
AH! Удаление ~/.zcompdumpсделал свое дело. Еще раз спасибо!
Маршалл Юбэнкс