Dalam Shift + Up tidak dikenali oleh Emacs di terminal saya menjelaskan bagaimana terminal menerjemahkan sebagian besar tombol fungsi ke dalam urutan escape, karena antarmuka antara aplikasi dan terminal mentransmisikan karakter (atau lebih tepatnya byte), bukan kunci. Hanya beberapa pengubah + kombinasi karakter yang memiliki karakternya sendiri:
- Ctrlditambah satu huruf atau satu
@[\]^_
belokan menjadi byte 0–31 ( karakter kontrol ASCII ).
- Seringkali Ctrl+ ?berubah menjadi byte 127 dan Ctrl+ Spacesama dengan Ctrl+ @(byte 0).
- Beberapa tombol fungsi setara dengan karakter kontrol: Tab= Ctrl+ I, Return= Ctrl+ M, Esc= Ctrl+ [.
- Dan Backspace= Ctrl+ Hatau Ctrl+ ?tergantung pada konfigurasi. Ctrl+ ?lebih nyaman untuk Emacs, karena Ctrl+ Hadalah bantuan.
- Meta+ characterDikirim sebagai Escdiikuti oleh karakter .
Jadi, bagaimana dengan kombinasi lain seperti Ctrl+ ;atau Ctrl+ Shift+ letter? Karena tidak ada karakter yang sesuai, terminal harus menggunakan kembali karakter atau mengirim urutan pelarian. Banyak terminal mengabaikan pengubah ketika tidak ada karakter yang sesuai, sehingga Anda berakhir dengan Ctrl+ ;pengiriman ;
, Ctrl+ Shift+ lettersetara dengan Ctrl+ letter, dll.
Vendor terminal terus melakukan hal sederhana untuk waktu yang lama. Tidak ada standar untuk sekuens melarikan diri, yang bersifat swadaya - vendor terminal tidak mengimplementasikannya, aplikasi tidak mendukungnya, pengguna tidak mengharapkannya. Beberapa emulator terminal dapat dikonfigurasikan untuk mengirim urutan pelarian yang sewenang-wenang, jadi jika Anda bisa, Anda dapat mengonfigurasinya dan mendeklarasikan urutan pelepasan ke Emacs (lebih lanjut tentang ini nanti).
Akhir-akhir ini, situasinya berubah, karena telah ada dua proposal untuk distandarisasi pada urutan pelarian. Salah satunya adalah libtermkey LeoNerd dengan sintaks . Lain adalah xterm Thomas Dickey dengan sintaks . Versi xterm saat ini (≥216) dapat dikonfigurasikan untuk sintaksis dengan mengatur sumber daya; fitur harus diaktifkan dengan menyetel ke nilai bukan nol.ESC [ codepoint ; modifier u
ESC [ 2 7 ; modifier ; codepoint ~
formatOtherKeys
modifyOtherKeys
Jika emulator terminal Anda tidak mendukung sintaks ini tetapi dapat dikonfigurasi, pilih salah satunya.
Sejak Emacs 24.4, Emacs secara otomatis menyalakan modifyOtherKeys
fitur ketika mendeteksi bahwa terminal adalah versi xterm ≥216. Deteksi Emacs tentang urutan sekuensi untuk menyandikan kunci berfungsi melalui variabel local-function-key-map
. Pada Emacs 24.4, tidak semua urutan pelarian didukung. Anda dapat menggunakan kode berikut dalam file init Anda untuk menyelesaikan pekerjaan.
;; xterm with the resource ?.VT100.modifyOtherKeys: 1
;; GNU Emacs >=24.4 sets xterm in this mode and define
;; some of the escape sequences but not all of them.
(defun character-apply-modifiers (c &rest modifiers)
"Apply modifiers to the character C.
MODIFIERS must be a list of symbols amongst (meta control shift).
Return an event vector."
(if (memq 'control modifiers) (setq c (if (or (and (<= ?@ c) (<= c ?_))
(and (<= ?a c) (<= c ?z)))
(logand c ?\x1f)
(logior (lsh 1 26) c))))
(if (memq 'meta modifiers) (setq c (logior (lsh 1 27) c)))
(if (memq 'shift modifiers) (setq c (logior (lsh 1 25) c)))
(vector c))
(defun my-eval-after-load-xterm ()
(when (and (boundp 'xterm-extra-capabilities) (boundp 'xterm-function-map))
(let ((c 32))
(while (<= c 126)
(mapc (lambda (x)
(define-key xterm-function-map (format (car x) c)
(apply 'character-apply-modifiers c (cdr x))))
'(;; with ?.VT100.formatOtherKeys: 0
("\e\[27;3;%d~" meta)
("\e\[27;5;%d~" control)
("\e\[27;6;%d~" control shift)
("\e\[27;7;%d~" control meta)
("\e\[27;8;%d~" control meta shift)
;; with ?.VT100.formatOtherKeys: 1
("\e\[%d;3u" meta)
("\e\[%d;5u" control)
("\e\[%d;6u" control shift)
("\e\[%d;7u" control meta)
("\e\[%d;8u" control meta shift)))
(setq c (1+ c))))))
(eval-after-load "xterm" '(my-eval-after-load-xterm))
Jika TERM
variabel lingkungan tidak disetel ke xterm
atau varian seperti itu xterm-256color
, Emacs tidak akan mengaktifkan urutan itu. Jika Emacs sudah memiliki dukungan untuk nilai TERM
Anda, Anda dapat menambahkan dukungan dengan mendefinisikan fungsi yang mirip dengan yang di atas, yang akan dieksekusi setelah memuat file Lisp yang namanya bernilaiTERM
. Jika Emacs tidak memiliki dukungan seperti itu, Anda dapat menambahkannya dengan membuat subdirektori yang dipanggil term
di suatu tempat di Anda load-path
, dan membuat file Lisp yang disebut dengan nilai di term/$TERM.el
mana , mendefinisikan fungsi yang disebut .$TERM
TERM
terminal-init-$TERM
Saat saya menulis, tampaknya beberapa emulator terminal selain xterm telah mengadopsi urutan pelarian ini. Pada OSX, Anda dapat mengkonfigurasi iTerm2 dengan memilih urutan keluar untuk setiap kombinasi tombol, satu per satu.
C-;
kombo dan kemudian gunakanM-x view-lossage
untuk melihat apakah itu bahkan sampai ke Emacs.