Di mana saya menemukan daftar kode kunci terminal untuk memetakan ulang pintasan di bash?

42

Sebagai contoh:

"\e[1;5C"
"\e[Z"
"\e-1\C-i"

Saya hanya tahu sedikit \edemi sedikit , seperti singkatan untuk melarikan diri dan C-untuk Ctrl, tetapi apa angka-angka ini ( 1) dan huruf ( Z)? Untuk apa ;, [dan -tanda untuk?

Apakah hanya ada coba-coba, atau ada daftar lengkap kode kunci bash dan penjelasan sintaksisnya?

bug
sumber
2
Tip tambahan untuk daftar binding readline aktual dari shell adalah bind -p.
1
Sebagian besar kode seperti itu ditafsirkan oleh terminal Anda; baca tentang kode pelarian ANSI di Wikipedia untuk daftar besar.
chepner
stty -a menampilkan pengaturan saluran terminal
bug

Jawaban:

52

Itu adalah urutan karakter yang dikirim oleh terminal Anda ketika Anda menekan tombol yang diberikan. Tidak ada hubungannya dengan bash atau readline per se, tetapi Anda akan ingin tahu urutan karakter apa yang diberikan kunci atau kombinasi tombol jika Anda ingin mengonfigurasi readlineuntuk melakukan sesuatu dengan menekan tombol yang diberikan.

Saat Anda menekan Atombol, umumnya terminal mengirim karakter a(0x61). Jika Anda menekan <Ctrl-I>atau <Tab>, maka umumnya mengirim ^Ikarakter yang juga dikenal sebagai TABatau \t(0x9). Sebagian besar tombol fungsi dan navigasi umumnya mengirim urutan karakter yang dimulai dengan ^[(control- [), juga dikenal sebagai ESCatau \e(0x1b, 033 oktal), tetapi urutan yang tepat bervariasi dari terminal ke terminal.

Cara terbaik untuk mengetahui apa yang dikirim kunci atau kombinasi tombol untuk terminal Anda, dijalankan sed -n ldan untuk mengetiknya diikuti dengan Enterdi keyboard. Maka Anda akan melihat sesuatu seperti:

$ sed -n l
^[[1;5A
\033[1;5A$

Baris pertama disebabkan oleh terminal lokal yang echodilakukan oleh perangkat terminal (itu mungkin tidak dapat diandalkan karena pengaturan perangkat terminal akan mempengaruhinya).

Baris kedua adalah keluaran oleh sed. Ini $tidak untuk dimasukkan, itu hanya untuk menunjukkan di mana akhir baris.

Di atas berarti bahwa Ctrl-Up(yang saya sudah ditekan) mengirim 6 karakter ESC, [, 1, ;, 5dan A(0x1b 0x5b 0x31 0x3b 0x35 0x41)

Basis terminfodata mencatat sejumlah urutan untuk sejumlah kunci umum untuk sejumlah terminal (berdasarkan $TERMnilai).

Contohnya:

TERM=rxvt tput kdch1 | sed -n l

Akan memberi tahu Anda apa urutan pengiriman yang dikirim dengan rxvtmenekan Deletetombol.

Anda dapat mencari kunci yang sesuai dengan urutan yang diberikan dengan terminal Anda saat ini dengan infocmp(di sini dengan asumsi ncursesinfocmp):

$ infocmp -L1 | grep -F '=\E[Z'
    back_tab=\E[Z,
    key_btab=\E[Z,

Kombinasi kunci seperti Ctrl-Uptidak memiliki entri yang sesuai dalam terminfodatabase, jadi untuk mengetahui apa yang mereka kirim, baca sumber atau dokumentasi untuk terminal yang sesuai atau coba dengan sed -n lmetode yang dijelaskan di atas.

Stéphane Chazelas
sumber
Ini penjelasan yang bagus, terima kasih! Sekarang semuanya jatuh ke tempatnya, \e-1\C-iadalah tab mundur, karena controldan imenyisipkan tab dan escapediikuti oleh -1kata bash untuk melakukannya mundur sekali (saya goggled ini dan menemukan beberapa hal tentang digit-arguments).
bug
$ sed -n 1 sed: -e expression #1, char 1: missing command
cnvzmxcvmcx
3
@ vib. Itu huruf kecil L bukan angka 1
Stéphane Chazelas
1
@ user367890, itu ke mode keypad . Anda mungkin akan menemukan bahwa setelah tput smkx, terminal Anda mengirim \e[OD( kcub1) dan setelah tput rmkx, \e[D( cub1, kode yang sama dengan urutan yang menggerakkan kursor ke kiri, sehingga gema dari tombol-tombol itu menggerakkan kursor. Coba stty -echoctl; tput rmkx; sleep infdan Anda akan melihat tombol panah tidak menggerakkan kursor ketika tidak dalam mode keypad ).
Stéphane Chazelas
1
@ user367890, dari apa yang dikatakan Thomas (pengelola ncurses dan xterm) dalam jawaban yang Anda tautkan, ya, itu seharusnya berhasil. Mode keypad atau mode aplikasi merujuk pada hal yang sama, jadi (sekali lagi, menurut Thomas) spesifikasi kunci dalam basis data terminfo adalah untuk saat smkx diaktifkan.
Stéphane Chazelas
4

Ini disediakan melalui perpustakaan readline gnu. Anda harus membaca man 3 readline untuk mengetahui deskripsinya.

Sepertinya Anda juga memerlukan informasi tentang apa yang dimaksud dengan kode escspe \[A. Anda dapat menemukan informasi ini di artikel kode esacape ANSI wikipedia .

buru-buru
sumber
Ini tidak menjelaskan contoh saya.
bug
Sepertinya itu disalahpahami kecil. Silakan lihat pembaruan jawabannya.
buru
Tidak ada informasi tentang contoh spesifik saya di artikel. Pencarian halaman untuk "[A" tidak menghasilkan apa-apa juga.
bug
1
@bug tolong baca artikelnya dengan seksama. \[Aada di tabel "kode CSI" di dalam baris: "CSI n A"
buru
Terima kasih terburu-buru, tapi di mana saya menemukan penjelasan pada [Z, [1;5Catau -1?
bug
3

Apakah kode-kode ini berasal dari sumber yang sama? Yang terakhir terlihat seperti GNU readline binding. Itulah yang dikirim pengguna ke bash (lihat jawaban terburu-buru). Namun, dua yang pertama lebih mirip dengan urutan kontrol terminal (meskipun yang pertama akan menjadi yang buruk). Itulah yang dikirimkan bash atau program lain ke emulator terminal untuk mengontrol gerakan kursor, warna teks, dan sejenisnya.

Uwe
sumber
Saya menemukan "\ e [1; 5C" yang akan digunakan untuk gerakan kata maju ctrl-panah, dan "\ e [Z" dan "\ e-1 \ Ci" untuk menu-lengkap-mundur dalam tutorial lainnya. Semuanya telah digunakan di dalam file .inputrc.
bug
OK, jika mereka ditafsirkan oleh readline maka harus ada emulator terminal di mana urutan kontrol ini terikat pada beberapa kombinasi ctrl, alt, dan / atau bergeser dengan tombol fungsi atau panah. (Saya tidak tahu yang mana.)
Uwe
0

Cara termudah yang saya temukan untuk memeriksa urutan keluar yang dihasilkan oleh kunci atau kombo kunci adalah dengan menekan Ctrl+ vdi terminal dan kemudian tekan tombol / kombo yang ingin Anda ketahui.

Anda akan mendapatkan urutan seperti ^[Oadan Anda harus menerjemahkan ^[ke \eatau \033atau \x1batau representasi apa pun yang diharapkan oleh sistem pengikat kunci Anda untuk karakter escape.

Itu dimulai sebagai fungsi Emacs bernama quoted-insertdan, karena keybinds default untuk Bash dan Zsh meniru Emacs, mereka juga menyalinnya.

Bash mendapatkannya melalui pustaka input GNU Readline yang import rlcompleterjuga digunakan oleh perangkat tambahan Python .

Berikut deskripsi dari manual Readline :

quoted-insert( C-qatau C-v)

Tambahkan karakter berikutnya yang diketik ke baris kata demi kata. Ini adalah cara memasukkan urutan kunci seperti C-q, misalnya.

Itu harus bekerja dalam apa pun berdasarkan GNU Readline.

Adapun Zsh, yang menggunakan alternatifnya sendiri bernama ZLE, itu hanya menghormati C-qikatan Emacs asli ketika dalam mode Vi, cukup ironisnya, tetapi C-vmasih bekerja dalam mode input standar seperti Emacs. (Cari quoted-insertdi zshzlehalaman manual atau zshall` dan pasangan hasil kedua harus mencantumkan ikatan kunci default.)

Untuk mnemonik, saya menyarankan berpikir Ctrl+ vsebagai meminta v erbatim.

ssokolow
sumber