zsh penyelesaian: mendapatkan nama file dari direktori tertentu

10

OK, sedikit latar belakang: Saya menggunakan Mac, dan saya melakukan sebanyak mungkin di CLI.

Secara khusus, saya sering memasukkan USB stick, cpatau mvfile lebih, dan kemudian segera ingin mengeluarkan (unmount dan lepaskan) itu. Ini biasanya dapat dilakukan dalam beberapa penekanan tombol, kecuali untuk unmount, yang mengharuskan (dalam 10.7) pergi ke ruang desktop yang kosong (biasanya setidaknya dua ruang jauhnya), memilih disk, dan menekan "command-e". Sejujurnya, prosedur unmount ini, dengan beberapa urutan besarnya, bagian proses yang paling memakan waktu dan melelahkan.

Akan jauh lebih alami dan efisien untuk hanya bisa mengetik, katakan:

ej<tab> J<tab>

Ucapkan stik USB stick saya di / Volume / Jefferson. Apa yang saya harapkan dari 6 penekanan tombol adalah sebagai berikut:

eject /Volumes/Jefferson

Ini harus menjalankan perintah:

diskutil unmount /Volumes/Jefferson

Jadi, saya menulis fungsi kecil yang menyenangkan:

eject() {
    diskutil unmount /Volumes/$1
}

Dan fungsi penyelesaian untuk menyertainya:

compdef '_files -g "/Volumes/*"' eject  

Namun, ada masalah dengan ini. The _filesFungsi menghasilkan jalur lengkap. Sekarang, saya dapat mengubah baris dalam fungsi "eject" saya diskutil unmount $1, dan semuanya akan berfungsi, tetapi kemudian saya tidak memiliki kemampuan untuk mengetik huruf pertama dari nama titik mount, karena jalur dimulai dengan / Volume /. Misalnya, jika saya mengetik J<tab, saya akan mendapatkan pelengkapan otomatis untuk file di PWD. Saya harus mengetik /Volumes/J<tab>untuk mendapatkan penyelesaian yang diinginkan.

Jadi, apakah ada fungsi penyelesaian yang mengambil nama file dari lokasi yang telah ditentukan, spesifik, daripada menghasilkan jalur lengkap?

Saya benar-benar ingin mendapatkan ini hingga 6 penekanan tombol.

Marshall Eubanks
sumber

Jawaban:

12
_files -W /Volumes

Lihat dokumentasi _path_files.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Sempurna! Saya tahu itu harus dibangun. Terima kasih banyak!
Marshall Eubanks
Jadi, bagaimana saya mendapatkannya memuat fungsi penyelesaian otomatis ini? Saya mencoba meletakkan compdefbaris di file yang _ejectterletak di fpath saya. Saya mencobanya dengan dan tanpa saluran pengisian otomatis. Saya melihat beberapa panduan tentang fungsi penyelesaian dan tidak ada yang membahas bagaimana melakukan contoh sederhana yang nyata seperti ini, dan tidak ada yang saya coba berdasarkan salah satu contoh mereka yang berhasil.
Marshall Eubanks
@marshaul Anda harus memiliki #compdef ejectbaris pertama file, lalu kode asli. Lihat di bawah file yang dimuat secara otomatis di manual. Jika Anda tidak menambahkan baris pada awalnya, Anda mungkin perlu menghapus cache ~/.zcompdumpdan memulai kembali zsh.
Gilles 'SO- stop being evil'
AH! Menghapus ~/.zcompdumpberhasil. Terima kasih lagi!
Marshall Eubanks