zsh завершення: отримання імен файлів із конкретного каталогу


10

Добре, трохи тла: я використовую 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 натискань клавіш.

Відповіді:


12
_files -W /Volumes

Дивіться документацію про _path_files.


Ідеально! Я знав, що це потрібно було збудувати. Дякую!
Маршалл Юбанкс

Отже, як змусити його автоматично завантажити цю функцію завершення? Я спробував помістити compdefрядок у файл, _ejectрозташований на моєму шляху. Я спробував це з і без лінії автозавантаження. Я переглянув декілька посібників щодо функцій завершення, і ніхто не пояснював, як зробити справжній простий приклад, як це, і я нічого не намагався, спираючись на будь-який їхній приклад, що працював.
Маршалл Юбанкс

@marshaul Вам потрібно мати #compdef ejectяк перший рядок файлу, так і реальний код. Дивіться під автозавантаженими файлами в посібнику. Якщо ви спочатку не додали рядок, можливо, вам доведеться видалити кеш-пам'ять ~/.zcompdumpі перезапустити zsh.
Жил "ТАК - перестань бути злим"

А-а! Видалення ~/.zcompdumpзробило трюк. Знову дякую!
Маршалл Еубанкс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.