Dalam bash, cukup mudah untuk mengatur penyelesaian argumen perintah yang disesuaikan menggunakan complete
built-in. Misalnya, jika, untuk perintah hipotetis dengan sinopsis foo --a | --b | --c
, Anda bisa melakukannyacomplete -W '--a --b --c' foo
Anda juga dapat menyesuaikan penyelesaian yang Anda dapatkan ketika Anda menekan Tabpada prompt kosong menggunakan complete -E
, misalnya complete -E -W 'foo bar'
,. Kemudian menekan tab pada prompt kosong hanya akan menyarankan foo
dan bar
.
Bagaimana cara menyesuaikan penyelesaian perintah pada non -empty prompt? Misalnya, jika saya duduk di:
anthony@Zia:~$ f
bagaimana kustomisasi penyelesaian sehingga menekan tab akan selalu selesai foo
?
(Kasus aktual yang saya suka adalah loc
TAB→ localc
. Dan saudara lelaki saya, yang mendorong saya untuk menanyakan hal ini, menginginkannya dengan mplayer).
sumber
loc
untuklocalc
? Saya menyarankan alternatif karena setelah beberapa waktu menggali dan mencari, saya belum menemukan cara untuk menyesuaikan penyelesaian bash dengan cara ini. Itu mungkin tidak mungkin.locate
,locale
,lockfile
atau salah satu ekspansi lainloc
. Mungkin pendekatan yang lebih baik adalah memetakan kunci berbeda untuk penyelesaian spesifik itu.loc<TAB>->localc
)?Jawaban:
Penyelesaian perintah (bersama dengan hal-hal lain) ditangani melalui bash readline completion . Ini beroperasi pada tingkat yang sedikit lebih rendah daripada "penyelesaian terprogram" yang biasa (yang dipanggil hanya ketika perintah diidentifikasi, dan dua kasus khusus yang Anda identifikasi di atas).
Pembaruan: rilis baru bash-5.0 (Jan 2019) menambahkan
complete -I
untuk masalah ini persis.Perintah readline yang relevan adalah:
Dalam cara yang mirip dengan yang lebih umum
complete -F
, beberapa di antaranya dapat diserahkan ke suatu fungsi dengan menggunakanbind -x
.Ini memungkinkan kait per-perintah atau awalan Anda sendiri
~/.complete.d/
. Misalnya, jika Anda membuat executable~/.complete.d/loc
dengan:Ini akan melakukan (secara kasar) apa yang Anda harapkan.
Fungsi di atas bersusah payah untuk meniru perilaku penyelesaian perintah bash normal, meskipun tidak sempurna (khususnya barang yang meragukan
sort | fmt | column
untuk menampilkan daftar kecocokan).Namun , masalah non-sepele dengan ini hanya dapat menggunakan fungsi untuk menggantikan pengikatan ke
complete
fungsi utama (dipanggil dengan TAB secara default).Pendekatan ini akan bekerja dengan baik dengan pengikatan kunci yang berbeda yang digunakan hanya untuk penyelesaian perintah kustom, tetapi itu tidak mengimplementasikan logika penyelesaian penuh setelah itu (misalnya kata-kata selanjutnya di baris perintah). Melakukannya akan membutuhkan penguraian baris perintah, berurusan dengan posisi kursor, dan hal-hal rumit lainnya yang mungkin tidak boleh dipertimbangkan dalam skrip shell ...
sumber
Saya tidak tahu jika saya tidak mengerti kebutuhan Anda untuk ini ...
Ini akan menyiratkan bahwa bash Anda hanya tahu satu perintah yang dimulai dengan
f
.Gagasan dasar penyelesaian adalah: jika ambigu, cetak kemungkinan.
Jadi Anda bisa mengatur Anda
PATH
ke direktori yang hanya berisi perintah ini dan menonaktifkan semua bash builtin untuk mendapatkan pekerjaan ini.Bagaimanapun, saya dapat memberi Anda juga semacam solusi:
Jadi jika Anda mengetiknya
_ <Tab>
akan lengkap_ foo
yang dieksekusifoo
.Tetapi meskipun demikian
alias f='foo'
akan jauh lebih mudah.sumber
Jawaban sederhana untuk Anda adalah
hanya output dasar
cukup tambahkan program yang Anda inginkan untuk otomatis selesai untuk menyelesaikan bash
sumber
Jalankan perintah di bawah ini untuk menemukan di mana mplayer binary diinstal:
ATAU gunakan jalur ke biner mplayer jika Anda tahu, dalam perintah di bawah ini:
Idealnya apa pun yang Anda ketikkan dicari di semua direktori yang ditentukan dalam
$PATH
variabel.sumber
mplayer
sudah di dalam mereka$PATH
dan mereka ingin sesuatu sepertimp<tab>
untuk menghasilkanmplayer
, bukan semua biner yang dimulai denganmp
(misalnya,mpage
mpcd
mpartition
mplayer
dll.)