Ketika Anda menekan tombol atau kombinasi tombol di terminal, itu dikirim ke aplikasi yang berjalan di terminal sebagai urutan satu atau lebih karakter. Misalnya, ketika Anda menekan a, aplikasi menerima a
. Ketika Anda menekan Enter, aplikasi menerima karakter CR
(alias ^M
(diucapkan "control-emm"), alias nomor 13, alias \r
atau \015
). Kombinasi kunci yang terlibat Altbiasanya ditransmisikan sebagai karakter ESC
( ^[
alias \e
atau atau \033
) diikuti oleh urutan untuk kombinasi tombol atau kunci tanpa Alt. Tombol fungsi dan kombinasi tombol lainnya dikirimkan sebagai urutan keluar yang dimulai dengan \e[
atau \eO
.
Urutan lolos tidak sepenuhnya standar, dan terminal biasanya mengabaikan atribut tertentu untuk kunci tertentu. Sebagai contoh, Ctrl+ Shift+ lettersering dikirimkan persis seperti Ctrl+ lettersecara default.
Anda dapat melihat apa yang dikirim terminal Anda untuk kombinasi tombol dengan menekan Ctrl+ Vdiikuti oleh kombinasi tombol tersebut di prompt shell, atau C-q
atau C-h c
diikuti oleh kombinasi tombol di Emacs.
Dengan beberapa emulator terminal, Anda dapat mengonfigurasi urutan pelepasan untuk setiap tombol. Pada Xterm, ini dilakukan melalui sumber X . Sebagian besar pengaturan membaca sumber daya dari ~/.Xresources
saat X dimulai, dan Anda dapat memuat file secara manual xrdb -merge ~/.Xresources
.
Term.VT100.translations: #override \n\
Ctrl ~Shift ~Meta <key>Return: string("\033[73;5~") \n\
Ctrl Shift ~Meta <key>percent: string("\033[37;6~")
Sebuah konvensi umum menggunakan urutan melarikan diri dari formulir ESC [ number1 ; number2 ~
untuk tombol fungsi dengan pengubah. number1
menunjukkan tombol fungsi ( 15
untuk 24
untuk F5ke F12- untuk alasan historis, F1 melalui F4memiliki escape sequence yang berbeda) dan number2
menunjukkan modifikator ( 2
untuk Shift, 3
untuk Meta, 5
untuk Ctrl, 7
untuk Ctrl+ Meta, dan menambahkan 1 untuk Shiftdengan setidaknya satu dari Ctrlatau Meta).
Emacs menerjemahkan urutan pelarian ke dalam representasi kunci internal melalui input-decode-map
ataulocal-function-key-map
(atau function-key-map
sebelum Emacs 23).
(define-key local-function-key-map "\033[73;5~" [(control return)])
(define-key local-function-key-map "\033[37;6~" [(control ?L)])
infocmp $TERM
?ESC
(kecuali jika Anda ingin mencoba beberapa karakter ≥128, tetapi itu akan membatasi kemungkinan penyandian input) dan karakter kedua harus menjadi sesuatu yang Anda tidak inginESC foo
mengikat.local-set-key
demikiandefine-key
? Yang pertama memberikan kesalahan (jumlah argumen yang salah), sementara yang terakhir berfungsi, setidaknya untuk <kbd> C-Enter </kbd>. Tampaknya konsole masih mengalami masalah dalam mengirim <kbd> CM-% </kbd>.define-key
. Saya tidak tahu apakah kunci pelarian Konsole dapat dikonfigurasi, xterm mungkin lebih dapat disesuaikan daripada alternatif lainnya.XTerm*modifyOtherKeys: 2
sumber daya itu akan menghasilkan urutan unik bahkan untukC-M-
kombinasi, tetapi dengan pengaturan itu Anda harus memberikan banyak pemetaan khusus (XTerm*modifyOtherKeys: 1
kurang mampu tetapi jauh lebih fungsional di luar kotak). Untuk contoh (meskipun satu yang tidak bekerja untuk saya) melihatxterm-extras.el
perpustakaan dan terkait.Xresources
dan.inputrc
file dalam easymacs -download.Untuk rangkaian kunci yang terbatas namun signifikan, dengan asumsi konsole KDE, orang dapat melakukan hal berikut untuk membuat ikatan kunci yang kompleks dan bekerja di emacs -nw:
Saya akan menggunakan implementasi saya untuk mulai
S-<RET>
bekerja sebagai contoh:Return+Shift
dan berikan urutan kunci yang berguna (saya memilih\E[27;3
yang saya pikir adalah urutan kunci yang dikirim oleh X ketika saya mencari-cari dengan xev, tapi itu mungkin salah - yang penting untuk dilakukan adalah membuat yakin bahwa ia memiliki jalan keluar yang tepat dan tidak bertentangan dengan hal lain).Mulai
emacs -nw
dan di evaluasi buffer awal:(read-key-sequence-vector "Type your new key:")
lalu ketik kombinasi tombol baru Anda.
Itu harus memuntahkan urutan kunci yang dapat Anda ikat.
(Ia kembali
[27 91 50 55 59 51]
kepada saya sebagai lawan dari membosankan lama[13]
sebelum saya mengacaukan dengan pengikat tombol konsole.)Tambahkan ke konfigurasi emacs Anda:
Saya mengujinya
emacs -nw
dalam sesi layar menggunakan:sumber
Jawaban singkatnya adalah itu adalah batasan mendasar dari semua terminal.
Jawaban yang sedikit lebih lama adalah bahwa bahkan jika seseorang menciptakan terminal yang melakukan apa yang Anda inginkan, Emacs sendiri akan memerlukan perubahan besar untuk bekerja dengan terminal hipotetis ini.
sumber
Ada beberapa upaya memperluas protokol VT dengan cara memungkinkan input keyboard lossless (di antara fitur-fitur lain, seperti grafik).
Salah satu contohnya notty: https://github.com/withoutboats/notty
sumber