tabel binding kunci?

18

Apakah kita memiliki tabel ikatan utama yang menerjemahkan semua berbagai cara untuk merujuk ke penekanan tombol? Saya menggunakan zsh, tetapi saya menganggap bahwa jika ada meja seperti itu akan bekerja untuk shell apa pun.

Alasan saya bertanya adalah bahwa saya ingin menetapkan beberapa keybindings dan saya tidak memiliki cara untuk mengetahui bagaimana merujuk kepada mereka (kecuali saya akan mencuri yang sudah ditentukan).

Misalnya, dalam 'zbindkey' kita memiliki hal semacam ini:

[[ "$terminfo[kend]"  == " O"* ]] && \
    bindkey -M emacs "${terminfo[kend]/O/[}"  end-of-line

... dan saya dapat menebak bahwa "kend" berarti bahwa ini mengacu pada End kunci.

Pemeriksaan silang dengan bindkeysaya melihat baris-baris ini:

"^E" end-of-line
"^[OF" end-of-line
"^[[F" end-of-line

... jadi saya percaya bahwa salah satu dari kalimat itu merujuk ke End kuncinya. Yang mana?

Kami juga memiliki ini di file "bindkey":

bindkey "\e[A" history-beginning-search-backward

Sekarang, saya kebetulan tahu bahwa itulah Up Arrowkuncinya, tetapi bagaimana saya bisa mengetahui jika saya tidak tahu?

$ bindkey (at CLI)

... memberi kami bahasa yang berbeda untuk kunci yang sama:

"^[[A" history-beginning-search-backward

... tapi setidaknya sekarang saya tahu bahwa ^[[Adalam bindkey-at-CLI, bicara adalah hal yang sama seperti \e[Adalam bindkey-in-zbindkey. Itu mudah. Di masa lalu di DOS, Up Arrow itu0;72 - Anda dapat menemukan kode pemindaian setiap penekanan tombol hukum dan hanya ada satu bahasa.

Apakah ada meja? Atau cara lain untuk bisa memilih keystroke dan tahu cara merujuknyaterminfo[] ... di "bindkey-in-zbindkey" ... di "bindkey-at-CLI" dan / atau dalam bahasa apa pun yang mungkin ada kebetulan?

Sekali lagi, di DOS ada scancodeprogram - ketik keystroke, dan Anda mendapatkan kode kunci. Itu mudah dan berdosa.


Dari jawaban saya kira maka tidak ada cara untuk mencetak tabel dari semua kemungkinan binding? Pokoknya 'bindkey' melakukan hampir apa yang saya inginkan:

pts/2 HP-y5-10-Debian1 root /aWorking/Docs $ bindkey -L
bindkey "^@" set-mark-command
bindkey "^A" beginning-of-line
bindkey "^B" backward-char
bindkey "^D" delete-char-or-list
bindkey "^E" end-of-line
...

setidaknya saya bisa melihat semua binding yang ada, bahkan jika tidak semua binding mungkin . Sekarang, jika hanya ada beberapa cara menerjemahkan mesin terbang utama ke dalam istilah 'biasa':

bindkey "Home" beginning-of-line

... maka saya akan senang.

Ray Andrews
sumber
3
Tekan Ctrl + V (atau apa pun yang stty -adikatakan lnextadalah) lalu kuncinya.
Mikel

Jawaban:

16

Antarmuka antara aplikasi terminal dan terminal emulator (atau terminal perangkat keras) mentransmisikan byte, bukan kunci. Tombol fungsi seperti tombol gerakan kursor diterjemahkan ke dalam urutan escape (dimulai dengan karakter escape ESC \ealias \033aka 0x1b alias ^ [). Hal yang sama berlaku untuk kombinasi tombol fungsi atau tombol karakter dengan pengubah, meskipun tidak semua terminal mengirim urutan berbeda untuk semua kombinasi pengubah yang berbeda. Beberapa kunci dikirim dikodekan sebagai karakter kontrol (mis. Tab→ Ctrl-I = \t= \011).

Seperti yang Anda lihat, ada banyak cara untuk menggambarkan karakter kontrol. Beberapa memiliki nama, sesuai dengan fungsi tradisionalnya (misalnya Tab, Umpan baris); mereka cenderung memiliki kombinasi huruf backslash + yang dapat Anda gunakan di dalam $'…'atau dalam argumen untuk echoatau print(serta dalam ekspresi reguler dan string literal dalam bahasa awk, C dan lainnya (perhatikan bahwa alat yang berbeda mungkin memiliki set yang sedikit berbeda dari urutan pelarian)). Anda dapat menggunakan backslash + oktal (misal \033) dalam konteks ini juga.

Ada beberapa variasi yang lolos terminal urutan mengirim untuk setiap kunci. Untungnya, hampir tidak ada tumpang tindih: ada sangat sedikit urutan karakter yang berarti kunci yang berbeda pada terminal yang berbeda. Masalah utama adalah karakter 127 = \177= 0x7f yang paling sering Backspacesaat ini tetapi kadang-kadang Delete.

^[OFdan ^[[F(yaitu \eOFdan \e[F) adalah dua urutan pelarian umum yang dikirim oleh End. ^E(Yaitu \005) adalah pengikatan kunci Emacs ( Ctrl+ E) untuk end-of-line.

Untuk melihat apa yang dikirimkan emulator terminal Anda untuk kunci atau kombinasi tombol tertentu, tekan Ctrl+ Vlalu kunci yang dimaksud. Ini menyisipkan karakter pertama dari urutan pelarian secara harfiah. Urutan escape biasanya terdiri dari karakter escape diikuti oleh karakter yang dapat dicetak, sehingga sisa urutan escape dimasukkan secara harfiah juga.

Basis data Terminfo berisi urutan pelarian untuk beberapa kunci. Anda akan menemukan daftar kemampuan Terminfo di halaman manual terminfo (5) di sistem Anda. Di zsh, Anda dapat membuat daftar nilai dalam database melalui terminfoarray asosiatif. Hati-hati saat mencetak nilai yang mengandung urutan pelarian yang juga ditafsirkan oleh terminal saat ditampilkan, jadi cetaklah dalam bentuk yang dikutip.

% print -lr ${(q)terminfo[kend]}
$'\033'OF

Lihat Bagaimana cara kerja input keyboard dan output teks? untuk gambaran umum yang lebih lengkap tentang apa yang terjadi ketika Anda menekan tombol. Tidak perlu memahami ikatan utama di zsh.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
11
    BEGINNER'S GUIDE TO ZSH KEYBOARD ASSIGNMENTS, AKA 'KEYBOARD BINDINGS'.

(komentar, penyempurnaan, sambutan pahit diterima: rayandrews di eastlink dot ca)

Kombinasi tombol 'Tersedia' pada keyboard PC '101' yang terpasang pada PC yang menjalankan 'zsh' di bawah xfce4 di bawah Debian Linux (saya tidak tahu siapa yang 'bertanggung jawab'). Semua kombinasi yang menghasilkan kode duplikat dalam kunci 'abu-abu' telah dihapus kecuali untuk avatar paling sederhana yang ditampilkan. Catatan, beberapa kunci abu-abu / kombinasi memiliki duplikat '^ letter', seperti 'Enter' == '^ M', ini belum dihapus. Kombinasi aktif lainnya tidak 'tersedia' sejak digunakan oleh sistem, bahkan dari konsol, mis. Tombol 'Alt + Function' mengganti terminal. Mungkin kunci 'Meta' akan berbuat lebih banyak, tetapi ini dengan 101 KB. Menarik bahwa ada lebih banyak kombinasi yang tersedia di DOS, seperti Ctrl + Function - semua tersedia di DOS, tidak ada yang tersedia di Linux, jadi sepertinya. Tidak ada kombinasi tombol tripple (mis. 'Ctrl + Alt + Up') yang menghasilkan kode unik di dalam tombol abu-abu, tetapi tidak menghasilkan kode dalam tombol putih. Anomali menarik: '^ [[22' '^ [[27' '^ [[30' adalah 'hilang', Anda harus bertanya-tanya mengapa angka-angka itu dilewati. (Artinya Anda mungkin mengharapkan 'F11' menjadi '^ [[22' bukan '^ [[23'.)

Kode kunci yang ditampilkan adalah karena akan ditampilkan oleh 'showkeys -a' atau 'bindkey' di CLI. Namun, untuk beberapa alasan jika Anda menggunakan 'bindkey' di dalam skrip (seperti dalam '.zshrc') '^ [' harus diganti dengan '\ e', dengan demikian di CLI:

bindkey -s '^ [[[A' 'my-command \ Cm'

... ikat 'F1' ke 'my-command' dan jalankan ('\ Cm' mensimulasikan kunci 'Enter').

di '.zshrc':

bindkey -s '\ e [25' 'my-command1; my command2 \ Cm '

... ikat 'Shift-F1' ke 'my-command1' diikuti oleh 'my-command2' dan jalankan keduanya.

KOMBINASI MENGGUNAKAN KUNCI 'GREY' :

key [ F1 ] = '^ [[[A' key [ F2 ] = ' ^ [[[ Tombol B ] [ F3 ] = '^ [[ Tombol C' [ F4 ] = '^ [[ Tombol D' [ F5 ] = '^ [[ Tombol E' [ F6 ] = '^ [[17 ~' kunci [ F7 ] = '^ [[18 ~' kunci [ F8 ] = '^ [[19 ~' tombol [ F9 ] = '^ [[20 ~' kunci [F10 ] = '^ [[21 ~' kunci [ F11 ] = '^ [[23 ~' kunci [ F12 ] = '^ [[24 ~'

kunci [ Shift - F1 ] = '^ [[25 ~' key [ Shift - F2 ] = '^ [[26 ~' key [ Shift - F3 ] = '^ [[28 ~' key [ Shift - F4 ] = ' ^ [[29 ~ ' tombol [ Shift - F5 ] = ' ^ [[31 ~ ' kunci [ Shift - F6 ] = ' ^ [[32 ~ ' kunci [ Shift - F7 ] = '^ [[33 ~' tombol [ Shift - F8 ] = '^ [[34 ~'

kunci [ Sisipkan ] = '^ [[2 ~' tombol [ Hapus ] = '^ [[3 ~' key [ Home ] = '^ [[1 ~' key [ End ] = '^ [[4 ~' key [ PageUp ] = '^ [[5 ~' key [ PageDown ] = '^ [[6 ~' key [ Up ] = '^ [[A' key [ Down ] = '^ [[B' key [ Kanan ] = '^[[C' key[Left] = '^[[D'

key[Bksp] = '^?' key[Bksp-Alt] = '^[^?' key[Bksp-Ctrl] = '^H' console only.

key[Esc] = '^[' key[Esc-Alt] = '^[^['

key[Enter] = '^M' key[Enter-Alt] = '^[^M'

key[Tab] = '^I' or '\t' unique form! can be bound, but does not 'showkey -a'. key[Tab-Alt] = '^[\t'

COMBINATIONS USING THE WHITE KEYS:

Anomali : 'Ctrl + `' == 'Ctrl+2', and 'Ctrl+1' == '1' in xterm. Several 'Ctrl+number' combinations are void at console, but return codes in xterm. OTOH Ctrl+Bksp returns '^H' at console, but is identical to plain 'Bksp' in xterm. There are no doubt more of these little glitches however, in the main:

White key codes are easy to undertand, each of these 'normal' printing keys has six forms:

A = 'a' ( duhhh ) A - Shift = 'A' ( siapa yang akan menebak ?) A - Alt = '^[a'
A-Ctrl = '^A' A-Alt-Ctrl = '^[^A' A-Alt-Shift = '^[A' A-Ctrl-Shift = '^A' (Shift has no effect)

Don't forget that:

/-Shift-Ctrl = Bksp = '^?' [-Ctrl = Esc = '^[' M-Ctrl = Enter = '^M'

And, we can 'stack' keybindings:

bindkey -s '^Xm' "My mistress\' eyes are nothing like the sun."

... Bind 'Ctrl-X' followed by 'm' to a nice line of poetry.

And we can flirt with madness:

bindkey -s '^Pletmenot' 'Let me not, to the marriage of true minds'

... but you hafta start something like that with a 'modifier' character. Try it, if you like keyboard shortcuts, you can really go to town.

QUESTIONS:

Where is it written that 'Ctrl-Bksp' means one thing at console, another thing in xterm?

Are these assignments changable?

Who designed all this, and what were they thinking at the time?

Why is it 'Alt-Function' to change terminals at a terminal, but 'Alt-Ctrl-Function' to change to a terminal from GUI?

Bagaimana / di mana ' Alt - Ctrl - Delete ' didefinisikan?

enter code here
Ray Andrews
sumber
Saya hampir ingin mengirim email ...
mikeserv
Dengan segala cara, lakukan mike: [email protected]
Ray Andrews
itu hanya lelucon, ray - Anda hanya tidak sering melihat pelacur, keluhan, keluhan? email saya ... secara online di sini. Saya menghargainya, itu saja. Lagi pula, sebagai tambahan, pada zshtopik kunci, Anda mungkin ingin mencoba zkbdfungsi yang akan membuat Anda seluruh pemetaan kunci disimpan dalam file. Saya percaya itu autoloadbisa, tetapi, jika tidak, cari di /usr/share/zsh/functions/Misc. Ada beberapa hal aneh di sana, juga tetris.
mikeserv
Itu salah satu alat yang saya gunakan untuk membuat meja saya, tetapi bagaimana Anda membuatnya untuk mengumpulkan 'semuanya' sekaligus?
Ray Andrews
menarik - kurasa tidak. Saya tidak pernah benar-benar menjalankannya sebelum sekarang - hanya membaca file sumbernya - dan itu beberapa bulan yang lalu. Saya kira itu memang melakukan serangkaian tes input untuk menghasilkan file save-nya. tapi itu menyimpan semuanya ke file, kan?
mikeserv
6

Ada banyak alat yang Anda inginkan di Unix / Linux sehingga bisa sedikit membingungkan dan membingungkan. Sebagai permulaan saya akan menggunakan showkey:

$ showkey -a

Press any keys - Ctrl-D will terminate this program

a    97 0141 0x61
b    98 0142 0x62
c    99 0143 0x63
d   100 0144 0x64
e   101 0145 0x65
f   102 0146 0x66
g   103 0147 0x67

Dari halaman manual tentang -a:

   When  in  `ascii' dump mode, showkey prints to the standard output the 
   decimal, octal, and hexadecimal value(s) of the key pressed,
   according to he present keymap.

Anda dapat menggunakan xmodmapuntuk mendapatkan beberapa pemetaan:

$ xmodmap
xmodmap:  up to 4 keys per modifier, (keycodes in parentheses):

shift       Shift_L (0x32),  Shift_R (0x3e)
lock        Caps_Lock (0x42)
control     Control_L (0x25),  Control_R (0x69)
mod1        Alt_L (0x40),  Alt_R (0x6c),  Meta_L (0xcd)
mod2        Num_Lock (0x4d)
mod3      
mod4        Super_L (0x85),  Super_R (0x86),  Super_L (0xce),  Hyper_L (0xcf)
mod5        ISO_Level3_Shift (0x5c),  Mode_switch (0xcb)

Di atas tidak semua bagian dari teka-teki tetapi beberapa info tambahan yang mungkin dapat membantu Anda menemukan peta pamungkas antara keybindings dan scancode. Ada lebih banyak info dalam U&L T&J berjudul: pemetaan kunci di Linux .

Referensi

slm
sumber
1
Meskipun ini semua benar, itu tidak relevan untuk memahami ikatan utama di terminal.
Gilles 'SO- stop being evil'
@Gilles - ya saya kira, saya hanya berusaha memberikan arahan, sekarang saya sudah membaca AI Anda mengerti bagaimana antarmuka itu bekerja, terima kasih!
slm
"showkey -a" tidak tidak relevan.
skagedal
2

jika ada beberapa cara untuk menerjemahkan mesin terbang utama ke dalam istilah 'biasa':

bindkey "Home" beginning-of-line

... maka saya akan senang.

Ada infocmputilitas untuk menjelaskan terminfoentri. Ini sangat berguna dengan -Lopsi alias nama variabel C panjang :

$ infocmp -cL
...
key_home= '\EOH'.
key_up= '\EOA'.
key_down= '\EOB'.
key_right= '\EOC'.
key_left= '\EOD'.
key_backspace= '^H'.
key_end= '\EOF'.
...

Membandingkan ini dengan bindkeyoutput

"^[OH" beginning-of-line
"^[OA" up-line-or-history
"^[OB" down-line-or-history
"^[OC" forward-char
"^[OD" backward-char
"^H" backward-delete-char
"^[OE" end-of-line

orang dapat melihat bahwa mereka menggunakan notasi yang berbeda untuk melarikan diri , tetapi pada dasarnya relatif mudah untuk menulis skrip yang menghubungkan kolom kedua infocmpdengan yang pertama bindkey.

Dalam hal ada keraguan apa arti string tertentu (seperti yang dicetak dalam infocmpoutput) yang selalu dapat dilihatterminfo manual di mana deskripsi lengkap diberikan, misalnya

key_send  ->  shifted end key
key_sic   ->  shifted insert-character key
key_dc    ->  delete-character key
jimmij
sumber
0

Saya menggunakan emulator terminal URxvt. Ada kunci yang berguna mengikat untuk menampilkan kode tersebut: Ctrl+Shift+V. Setelah menekannya masukkan urutan tombol yang Anda inginkan dan itu akan mencetak kodenya. Sebagai contoh, Ctrl+ saya memiliki kode ^[Oa.

poulix
sumber