Добре, трохи тла: я використовую Mac, і я максимально роблю в CLI.
Зокрема, я часто вписую USB-накопичувач cp
або mv
файл, а потім негайно хочу вийняти (відключити та відключити) його. Зазвичай це може бути досягнуто за допомогою декількох натискань клавіш, за винятком їх відключення, що вимагає (у 10.7) переходу до порожнього простору робочого столу (як правило, на відстань не менше двох пробілів), вибору диска та натискання «команда-е». Відверто кажучи, ця необмежена процедура є на кілька порядків найбільш трудомісткою і набридливою частиною процесу.
Набагато природніше та ефективніше було б просто ввести, скажімо:
ej<tab> J<tab>
Скажіть, мої кріплення USB-накопичувача в / 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 натискань клавіш.