Saya ingin menginstruksikan bash untuk menggunakan metode khusus untuk melakukan penyelesaian pada nama direktori tertentu. Misalnya, bash akan memanggil program saya untuk melakukan penyelesaian jika jalur dimulai dengan "$$", dan melakukan penyelesaian secara normal sebaliknya.
Apakah ini mungkin? Bagaimana Anda mengimplementasikannya?
Bounty : Saya sangat menghargai jawaban untuk pertanyaan itu. Tujuannya adalah untuk memungkinkan autojump untuk menyelesaikan jalur untuk semua perintah ketika pengguna memulai dengan awalan tertentu. Jadi misalnya saat menyalin file dari direktori jauh, Anda dapat mengetik:
cp $$patern + <Tab>
dan autojump akan selesai
cp /home/user/CompliCatedDireCTOry/long/path/bla/bla
dan Anda hanya perlu menambahkan di mana Anda ingin meletakkan file. Tentu saja saya dapat menggunakan komentar ott untuk menambahkannya ke beberapa perintah tertentu, tetapi jika ada yang punya ide yang lebih baik, saya akan sangat berterima kasih.
sumber
Jawaban:
Anda dapat melakukan ini dengan mengganti pengikatan default untuk TAB (^ i). Pertama Anda perlu mengganti TAB mengikat, maka Anda perlu membangun fungsi yang memanggil perintah Anda, terakhir Anda perlu mengambil output dari perintah itu dan memperbarui variabel yang berisi baris perintah saat ini.
Fungsi ini mengambil baris perintah saat ini dan mengubah dua karakter terakhir menjadi 'pelukan'.
Sebagai contoh Anda, Anda mungkin ingin mengubah baris new_argument agar terlihat seperti ini:
Sekarang timpa ikatan ^ i:
Sekarang uji apakah itu berfungsi:
jadi penyelesaian normal masih berfungsi, Anda dapat menguji bagian $$ dengan melakukan cd $$ ... dll
Jika Anda mengalami masalah, nyalakan mode verbose:
Ini akan mencetak semua fungsi yang sedang dilakukan.
Saya menguji ini pada Ubuntu 11 menggunakan bash 4.2.8 (1) -release (default).
sumber
Rutin penyelesaian bash dapat diprogram sebagai skrip shell.
Berikut adalah contoh skrip shell yang akan menggantikan parameter apa pun
$$[Tab]
denganmy replacement string
, tetapi hanya untuk perintah tertentumycommand
dan hanya jika parameternya persis "$$":Anda harus sumber skrip untuk mem-bash melalui
source <file-name>
(atau perintah dot) untuk mulai bekerja, dan kemudian:Agar selalu berfungsi untuk sebagian atau semua pengguna, sertakan ini di salah satu rutinitas profil bash .
Masalah dengan
complete
perintah, adalah bahwa itu hanya akan berfungsi untuk satu atau lebih nama perintah, yang ditentukan sebagai parameter. Seseorang dapat dengan mudah memberikan daftar semua perintah yang mungkin dapat digunakan oleh pengguna, atau dalam kasus putus asa berkembang/bin/* /usr/bin/* ~/bin/*
.Diuji pada CentOS 5.5.
Skrip sederhana ini didasarkan pada sumber yang telah saya daftarkan dalam jawaban saya yang lain - yang telah dihapus oleh moderator studiohack. Jika tertarik, minta saja dia untuk membatalkan penghapusan.
sumber