Bagaimana cara saya membiarkan kartu liar autocomplete?

10

Jika saya memiliki direktori yang berisi file

foo.bar.a.cat
foo.bar.a.hat

dan saya ketik ls f+ TABbash shell autocomplet untuk ls foo.bar.a.. Jika saya mengetik ls *bar*+ TABsaya ingin komplemen otomatis *bar*.a.. Apakah ini mungkin?

Ini mirip dengan pertanyaan

Bagaimana cara mengaktifkan tab wildcard di bash?

tetapi jawaban yang disarankan, "itu bekerja di luar kotak untuk saya", tidak. Saya juga sudah mencoba TAB TAB, tanpa efek. Perintah `` bash --version givesGNU bash, versi 4.2.37 (1) -release (x86_64-pc-linux-gnu) `.

Doyan
sumber

Jawaban:

14

Anda ingin:

masukkan-kelengkapan

ALT* untuk 'masukkan semua penyelesaian'

Dengan ini, direktori yang berisi nama file 'aa ab ac ad'
ls a*diikuti oleh alt + *akan selesails aa ab ac ad

Entri halaman buku tentang penjilidan:

masukkan-kelengkapan (M- *)

Masukkan semua pelengkapan teks sebelum titik yang mungkin dihasilkan oleh pelengkapan yang mungkin.

glob-expand-word

Pada beberapa sistem di atas tidak akan berfungsi dengan wildchars, berikut ini berfungsi pada sistem seperti itu untuk saya:

ctrlx, *(kombo dua langkah)

Contoh: Saya mengisi direktori dengan:

touch {a,b,c,d,e,f}{1,2,3,4,5,6,7,8,9,0}00{a,b,c,d,f,e}

Saya kemudian ls *100*diikuti oleh ctrl + x, *, yang mengubah readline saya menjadi:

ls a100a a100b a100c a100d a100e a100f b100a b100b b100c b100d b100e b100f c100a c100b c100c c100d c100e c100f d100a d100b d100c d100d d100e d100f e100a e100b e100c e100d e100e e100f f100a f100b f100c f100d f100e f100f

Entri halaman manual untuk mengikat:

glob-expand-word (Cx *)

Kata sebelum titik diperlakukan sebagai pola untuk perluasan pathname, dan daftar nama file yang cocok dimasukkan, menggantikan kata. Jika argumen numerik diberikan, '*' ditambahkan sebelum perluasan nama path.

Halaman Manusia

pendiam
sumber
Ini tidak berhasil (setidaknya untuk saya). Membuat file touch aa ab ac addan mengetik ls adiikuti dengan alt+*memberikan daftar, tetapi melakukannya dengan ls a*tidak. Wildcard adalah inti dari pertanyaan itu.
Ketagihan
@Hooked Ini bekerja untuk saya GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)dan GNU bash, version 4.2.0(1)-release (x86_64--netbsd)tetapi tidak GNU bash, version 4.2.45(2)-release (i386-apple-darwin12.2.0). Dan dengan bekerja, maksud saya diajukan dalam teks. Akan memeriksa file conf saya untuk melihat apakah saya memiliki sesuatu yang ekstra.
sopan
Itu aneh, mengapa hal sederhana seperti itu berubah dari versi ke versi? Adakah ide tentang cara mengaktifkannya atau apakah itu bawaan pada waktu kompilasi?
Ketagihan
@Hooked Saya agak bingung juga ... Ini juga gagal pada raspberry pi saya GNU bash, version 4.2.37(1)-release (arm-unknown-linux-gnueabihf)(raspbian)
sopan
@ Hooked Menemukan pengikatan alliterative yang bekerja pada sistem di mana yang pertama tidak, untuk saya.
sopan
8

Coba tambahkan ini ke ~ / .inputrc:

set show-all-if-ambiguous on

show-all-if-ambiguous membuat tab menekan sekali (bukan dua kali) daftar semua penyelesaian. Itu juga membuat tab pertama menyisipkan awalan bersama ekspresi glob.

$ touch 1.0.{1,2}
$ echo *0* # I pressed tab once here
1.0.1  1.0.2
$ echo 1.0.

glob-complete-word (\ eg) juga akan lengkap *0(tanpa *di akhir) untuk 1.0.. Itu juga melengkapi misalnya /System/Library/Launch*/*Findeuntuk /System/Library/LaunchAgents/com.apple.Finder.plist.

Jika Anda ingin mengonversi *ke 1.0.1 1.0.2dalam contoh di atas, gunakan salah satu sisipan-penyelesaian (\ e *) atau glob-expand-word (\ Cx *).

Lri
sumber
4

Masalah ini disebabkan oleh bug dalam paket "bash-completion".

Ketika paket ini tidak diinstal bash apakah itu penyelesaian standar, ini adalah mesin penyelesaian nama file umum yang cukup bagus.

Paket "bash-completion" seharusnya melihat sisa baris dan menjadi "pintar" tentang daftar yang dihasilkannya. Namun, itu tidak berhasil menduplikasi ekspansi "glob".

Secara pribadi, saya pikir paket tersebut mencoba terlalu keras dan akhirnya hanya dapat digunakan oleh "pengguna biasa yang paling bodoh".

Namun, sebelum menghapusnya, Anda mungkin ingin memeriksa bagian atas file "/ usr / share / bash-completion / bash_completion" untuk tambahan berguna pada .bashrc Anda untuk 'penyetelan kotor' dari penyelesaian bash bawaan.

BTW: Ini memiliki lebih dari seratus bug yang tercatat ... https://bugs.debian.org/cgi-bin/pkgreport.cgi?package=bash-completion

pengguna3710044
sumber
$ sudo yum erase bash-completion # memperbaiki masalah ini untuk saya
user2449151