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 bindkey
saya 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 ^[[A
dalam bindkey-at-CLI, bicara adalah hal yang sama seperti \e[A
dalam 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 scancode
program - 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.
sumber
stty -a
dikatakanlnext
adalah) lalu kuncinya.Jawaban:
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
\e
alias\033
aka 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 untukecho
atauprint
(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.^[OF
dan^[[F
(yaitu\eOF
dan\e[F
) adalah dua urutan pelarian umum yang dikirim oleh End.^E
(Yaitu\005
) adalah pengikatan kunci Emacs ( Ctrl+ E) untukend-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
terminfo
array asosiatif. Hati-hati saat mencetak nilai yang mengandung urutan pelarian yang juga ditafsirkan oleh terminal saat ditampilkan, jadi cetaklah dalam bentuk yang dikutip.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.
sumber
(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.
sumber
zsh
topik kunci, Anda mungkin ingin mencobazkbd
fungsi yang akan membuat Anda seluruh pemetaan kunci disimpan dalam file. Saya percaya ituautoload
bisa, tetapi, jika tidak, cari di/usr/share/zsh/functions/Misc
. Ada beberapa hal aneh di sana, jugatetris
.Ada banyak alat yang Anda inginkan di Unix / Linux sehingga bisa sedikit membingungkan dan membingungkan. Sebagai permulaan saya akan menggunakan
showkey
:Dari halaman manual tentang
-a
:Anda dapat menggunakan
xmodmap
untuk mendapatkan beberapa pemetaan: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
sumber
Ada
infocmp
utilitas untuk menjelaskanterminfo
entri. Ini sangat berguna dengan-L
opsi alias nama variabel C panjang :Membandingkan ini dengan
bindkey
outputorang dapat melihat bahwa mereka menggunakan notasi yang berbeda untuk melarikan diri , tetapi pada dasarnya relatif mudah untuk menulis skrip yang menghubungkan kolom kedua
infocmp
dengan yang pertamabindkey
.Dalam hal ada keraguan apa arti string tertentu (seperti yang dicetak dalam
infocmp
output) yang selalu dapat dilihatterminfo
manual di mana deskripsi lengkap diberikan, misalnyasumber
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
.sumber