Trong Shift + Up không được Emacs nhận ra trong một thiết bị đầu cuối, tôi giải thích cách các thiết bị đầu cuối chuyển hầu hết các phím chức năng thành các chuỗi thoát, bởi vì giao diện giữa các ứng dụng và thiết bị đầu cuối truyền các ký tự (hay đúng hơn là byte), chứ không phải các khóa. Chỉ có một vài kết hợp sửa đổi + ký tự có ký tự riêng của chúng:
- Ctrlcộng với một chữ cái hoặc một trong số các
@[\]^_
biến thành byte 0 Biệt31 (ký tự điều khiển ASCII ).
- Thường thì Ctrl+ ?biến thành byte 127 và Ctrl+ Spacetương đương với Ctrl+ @(byte 0).
- Một số phím chức năng tương đương với các ký tự điều khiển: Tab= Ctrl+ I, Return= Ctrl+ M, Esc= Ctrl+ [.
- Và Backspace= Ctrl+ Hhoặc Ctrl+ ?tùy thuộc vào cấu hình. Ctrl+ ?thuận tiện hơn cho Emacs, vì Ctrl+ Hlà trợ giúp.
- Meta+ characterđược gửi Esctheo sau bởi ký tự .
Vậy những kết hợp khác như Ctrl+ ;hoặc Ctrl+ Shift+ letterthì sao? Vì không có ký tự tương ứng, thiết bị đầu cuối phải sử dụng lại một ký tự hoặc gửi một chuỗi thoát. Nhiều thiết bị đầu cuối bỏ qua các sửa đổi khi không có ký tự tương ứng, vì vậy bạn kết thúc bằng Ctrl+ ;gửi ;
, Ctrl+ Shift+ lettertương đương với Ctrl+ letter, v.v.
Các nhà cung cấp thiết bị đầu cuối tiếp tục làm điều đơn giản trong một thời gian dài. Không có tiêu chuẩn nào cho các chuỗi thoát, đó là tự tồn tại - các nhà cung cấp thiết bị đầu cuối không thực hiện nó, các ứng dụng không hỗ trợ nó, người dùng không mong đợi nó. Một số trình giả lập thiết bị đầu cuối có thể được cấu hình để gửi các chuỗi thoát tùy ý, vì vậy nếu bạn có thể, bạn có thể định cấu hình nó và khai báo các chuỗi thoát cho Emacs (sẽ nói thêm về điều này sau).
Gần đây, tình hình đang thay đổi, vì đã có hai đề xuất để chuẩn hóa các chuỗi thoát. Một là libtermkey của LeoNerd với cú pháp . Một cái khác là xterm của Thomas Dickey với cú pháp . Các phiên bản hiện tại của xterm (≥216) có thể được cấu hình cho một trong hai cú pháp bằng cách đặt tài nguyên; tính năng phải được kích hoạt bằng cách đặt giá trị khác không.ESC [ codepoint ; modifier u
ESC [ 2 7 ; modifier ; codepoint ~
formatOtherKeys
modifyOtherKeys
Nếu trình giả lập thiết bị đầu cuối của bạn không hỗ trợ các cú pháp này nhưng có thể được định cấu hình, hãy chọn một trong hai.
Kể từ Emacs 24.4, Emacs tự động bật modifyOtherKeys
tính năng khi phát hiện thiết bị đầu cuối là phiên bản xterm ≥216. Phát hiện các chuỗi thoát của Emacs để mã hóa khóa hoạt động thông qua biến local-function-key-map
. Kể từ Emacs 24.4, không phải tất cả các chuỗi thoát đều được hỗ trợ. Bạn có thể sử dụng đoạn mã sau trong tệp init của mình để hoàn thành công việc.
;; 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))
Nếu TERM
biến môi trường không được đặt thành xterm
hoặc một biến thể như xterm-256color
, Emacs sẽ không kích hoạt các chuỗi đó. Nếu Emacs đã hỗ trợ cho giá trị của TERM
bạn, bạn có thể thêm hỗ trợ bằng cách xác định hàm tương tự như hàm trên, để được thực thi sau khi tải tệp Lisp có tên là giá trị củaTERM
. Nếu Emacs không có sự ủng hộ như vậy, bạn có thể thêm nó bằng cách tạo ra một thư mục con gọi là term
đâu đó trong bạn load-path
, và tạo ra một tập tin gọi là Lisp term/$TERM.el
nơi $TERM
là giá trị của TERM
định một hàm gọi terminal-init-$TERM
.
Khi tôi viết, có vẻ như rất ít trình giả lập thiết bị đầu cuối khác ngoài xterm đã áp dụng các chuỗi thoát này. Trên OSX, bạn có thể định cấu hình iTerm2 bằng cách chọn một chuỗi thoát cho từng tổ hợp phím, từng cái một.
C-;
kết hợp và sau đó sử dụngM-x view-lossage
để xem liệu nó có đến Emacs hay không.