Sebagai contoh:
"\e[1;5C"
"\e[Z"
"\e-1\C-i"
Saya hanya tahu sedikit \e
demi 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?
bind -p
.Jawaban:
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
readline
untuk 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^I
karakter yang juga dikenal sebagaiTAB
atau\t
(0x9). Sebagian besar tombol fungsi dan navigasi umumnya mengirim urutan karakter yang dimulai dengan^[
(control- [), juga dikenal sebagaiESC
atau\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 l
dan untuk mengetiknya diikuti dengan Enterdi keyboard. Maka Anda akan melihat sesuatu seperti:Baris pertama disebabkan oleh terminal lokal yang
echo
dilakukan 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
,;
,5
danA
(0x1b 0x5b 0x31 0x3b 0x35 0x41)Basis
terminfo
data mencatat sejumlah urutan untuk sejumlah kunci umum untuk sejumlah terminal (berdasarkan$TERM
nilai).Contohnya:
Akan memberi tahu Anda apa urutan pengiriman yang dikirim dengan
rxvt
menekan Deletetombol.Anda dapat mencari kunci yang sesuai dengan urutan yang diberikan dengan terminal Anda saat ini dengan
infocmp
(di sini dengan asumsincurses
infocmp):Kombinasi kunci seperti Ctrl-Uptidak memiliki entri yang sesuai dalam
terminfo
database, jadi untuk mengetahui apa yang mereka kirim, baca sumber atau dokumentasi untuk terminal yang sesuai atau coba dengansed -n l
metode yang dijelaskan di atas.sumber
\e-1\C-i
adalah tab mundur, karenacontrol
dani
menyisipkan tab danescape
diikuti oleh-1
kata bash untuk melakukannya mundur sekali (saya goggled ini dan menemukan beberapa hal tentangdigit-arguments
).$ sed -n 1
sed: -e expression #1, char 1: missing command
tput smkx
, terminal Anda mengirim\e[OD
(kcub1
) dan setelahtput rmkx
,\e[D
(cub1
, kode yang sama dengan urutan yang menggerakkan kursor ke kiri, sehingga gema dari tombol-tombol itu menggerakkan kursor. Cobastty -echoctl; tput rmkx; sleep inf
dan Anda akan melihat tombol panah tidak menggerakkan kursor ketika tidak dalam mode keypad ).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 .sumber
\[A
ada di tabel "kode CSI" di dalam baris: "CSI n A"[Z
,[1;5C
atau-1
?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.
sumber
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
^[Oa
dan Anda harus menerjemahkan^[
ke\e
atau\033
atau\x1b
atau representasi apa pun yang diharapkan oleh sistem pengikat kunci Anda untuk karakter escape.Itu dimulai sebagai fungsi Emacs bernama
quoted-insert
dan, karena keybinds default untuk Bash dan Zsh meniru Emacs, mereka juga menyalinnya.Bash mendapatkannya melalui pustaka input GNU Readline yang
import rlcompleter
juga digunakan oleh perangkat tambahan Python .Berikut deskripsi dari manual Readline :
Itu harus bekerja dalam apa pun berdasarkan GNU Readline.
Adapun Zsh, yang menggunakan alternatifnya sendiri bernama ZLE, itu hanya menghormati
C-q
ikatan Emacs asli ketika dalam mode Vi, cukup ironisnya, tetapiC-v
masih bekerja dalam mode input standar seperti Emacs. (Cariquoted-insert
dizshzle
halaman manual atau zshall` dan pasangan hasil kedua harus mencantumkan ikatan kunci default.)Untuk mnemonik, saya menyarankan berpikir Ctrl+ vsebagai meminta v erbatim.
sumber