Bash: menekan escape 4 kali

11

Ketika saya menekan tombol escape 4 kali di terminal bash, ia menampilkan sesuatu seperti ini:

-bash-4.1$
Display all 2837 possibilities? (y or n)
:
!
./
[
[[
]]
{
}
411toppm
a2p
ac
accept
accton
aclocal
aclocal-1.11
acpi_listen

Apa fitur ini, dan bagaimana entri ini ditemukan? (Pada esc tekan kedua, terminal memberikan peringatan terdengar.)

flow2k
sumber

Jawaban:

11
$ bind -p | grep 'complete$'
"\C-i": complete
"\M-\e": complete

Ini menunjukkan bahwa pengikatan kunci default Meta+Esc(dan Ctrl+i) dalam mode pengeditan baris perintah Emacs adalah fungsi Readline complete. The Metakey biasanya Escpada keyboard tanpa eksplisit Metakunci. Dokumentasi Readline untuk fungsi ini mengatakan

Mencoba melakukan penyelesaian pada teks sebelum titik. Penyelesaian aktual yang dilakukan adalah khusus aplikasi. Bash, misalnya, mencoba menyelesaikan memperlakukan teks sebagai variabel (jika teks dimulai dengan $), nama pengguna (jika teks dimulai dengan ~), nama host (jika teks dimulai dengan @), atau perintah (termasuk alias dan fungsi) pada gilirannya. Jika tidak ada yang menghasilkan kecocokan, nama file selesai dicoba. Gdb, di sisi lain, memungkinkan penyelesaian fungsi dan variabel program, dan hanya mencoba penyelesaian nama file dalam keadaan tertentu.


Mengenai komentar Anda untuk jawaban Anthon : Tidak, menekan Escdua kali tidak sama dengan menekan pada Tabumumnya (kecuali jika ada di program yang memetakan keduanya ke tindakan yang sama, seperti yang dilakukan Readline secara default). Namun Ctrl+i adalah sama dengan Tab, seperti Ctrl+[sama dengan Esc. Ini berarti bahwa Anda dapat melakukan penyelesaian dengan Ctrl+[ Ctrl+[in bashjika Anda mau, asalkan dobel Escterikat pada completefungsi Readline . Ini berguna jika Anda bekerja di terminal VT220, misalnya, yang tidak memiliki tombol Escape:

Keyboard VT220 Jerman

Kusalananda
sumber
Kusalananda, terima kasih atas jawaban mendalam ini. Tentang poin terakhir Anda: mengapa menekan Escdua kali (atau \M-\e) tidak sama dengan Tabdi bash, jika keduanya selesai?
flow2k
1
@ flow2k Adalah sama jika kedua Esc-Esc dan Tab terikat ke completefungsi, yang secara default, tetapi tidak secara umum (yaitu penekanan tombol tidak "sama"). Anda tidak dapat mengganti Tab dengan Esc-Esc di mana saja, hanya di program yang mampu membaca. Namun, Anda dapat mengganti Tab dengan Ctrl-i atau Esc dengan Ctrl- [di mana saja.
Kusalananda
Tindak lanjut jika saya boleh: Saya tidak melihat Tabdi output dari bind -p. Mengapa demikian? Mungkin karena Tab"hardcoded" dan tidak dapat diikat?
flow2k
1
@ flow2k Tidak, Tab identik dengan Ctrl-i. Carilah \C-i. Ini adalah kesetaraan pada tingkat perangkat keras.
Kusalananda
8

Itu disebut penyelesaian file, dan jika Anda tidak memiliki perintah sebelumnya pada commandline, bash akan menawarkan Anda untuk menyelesaikan semua 2837 perintah yang diketahuinya, baik yang terpasang maupun yang ditemukan di Anda PATH

Disajikan dalam urutan

Anthon
sumber
1
Menarik - jadi ini sama dengan menekan tab dua kali. Mungkin 2 lolos = 1 tab?
flow2k