ในShift + Up Emacs ไม่รู้จักในเทอร์มินัลฉันอธิบายว่าเทอร์มินัลแปลปุ่มฟังก์ชั่นส่วนใหญ่เป็นลำดับการหลบหนีได้อย่างไรเนื่องจากอินเตอร์เฟสระหว่างแอปพลิเคชันและเทอร์มินัลส่งอักขระ (หรือค่อนข้างไบต์) การรวมตัวดัดแปลง + ชุดอักขระเพียงไม่กี่ตัวมีตัวละครของตัวเอง:
- Ctrlบวกตัวอักษรหรือหนึ่งใน
@[\]^_
ผลัดกันเป็นไบต์ 0–31 (อักขระควบคุม ASCII )
- บ่อยครั้งที่Ctrl+ ?กลายเป็นไบต์ 127 และCtrl+ Spaceเท่ากับCtrl+ @(ไบต์ 0)
- บางปุ่มฟังก์ชันเทียบเท่ากับการควบคุมตัวอักษร: Tab= Ctrl+ I, Return= Ctrl+ M, Esc= +Ctrl[
- และBackspace= Ctrl+ HหรือCtrl+ ?ขึ้นอยู่กับการกำหนดค่า Ctrl+ ?สะดวกยิ่งขึ้นสำหรับ Emacs เนื่องจากCtrl+ Hเป็นความช่วยเหลือ
- Meta+ characterจะถูกส่งเป็นEscตามด้วยตัวอักษร
ดังนั้นสิ่งที่เกี่ยวกับชุดอื่น ๆ เช่นCtrl+ ;หรือCtrl+ Shift+ letter? เนื่องจากไม่มีอักขระที่สอดคล้องกันเทอร์มินัลจึงต้องนำอักขระมาใช้ซ้ำหรือส่งลำดับการหลีกเลี่ยง เทอร์มินัลจำนวนมากเพิกเฉยต่อตัวดัดแปลงเมื่อไม่มีตัวอักษรที่สอดคล้องกันดังนั้นคุณจะได้Ctrl+ ;ส่ง;
, Ctrl+ Shift+ letterเทียบเท่ากับCtrl+ letterฯลฯ
ผู้ขายเทอร์มินัลยังคงทำสิ่งที่ง่ายมาเป็นเวลานาน ไม่มีมาตรฐานสำหรับ escape sequences ซึ่งเป็นแบบถาวรด้วยตนเอง - ผู้จำหน่ายเทอร์มินัลไม่ใช้มันแอปพลิเคชันไม่รองรับผู้ใช้ไม่คาดหวัง เทอร์มินัลอีมูเลเตอร์บางตัวสามารถกำหนดค่าให้ส่งลำดับ escape ตามอำเภอใจดังนั้นหากคุณทำได้คุณสามารถกำหนดค่าและประกาศลำดับเอสเคปไปที่ Emacs (เพิ่มเติมในภายหลัง)
เมื่อเร็ว ๆ นี้สถานการณ์กำลังเปลี่ยนแปลงไปเนื่องจากมีข้อเสนอสองรายการที่จะสร้างมาตรฐานในลำดับการยกเว้น หนึ่งคือlibtermkey LeoNerd ของกับไวยากรณ์ อีกประการหนึ่งคือxterm โทมัสผ้ากันเปื้อนกับไวยากรณ์ เวอร์ชันปัจจุบันของ xterm (≥216) สามารถกำหนดค่าสำหรับไวยากรณ์ใดก็ได้โดยการตั้งค่าทรัพยากร ต้องเปิดใช้งานคุณสมบัตินี้โดยตั้งค่าเป็นค่าที่ไม่ใช่ศูนย์ESC [ codepoint ; modifier u
ESC [ 2 7 ; modifier ; codepoint ~
formatOtherKeys
modifyOtherKeys
หากเทอร์มินัลอีมูเลเตอร์ของคุณไม่สนับสนุนไวยากรณ์เหล่านี้ แต่สามารถกำหนดค่าได้ให้เลือกอย่างใดอย่างหนึ่ง
ตั้งแต่ Emacs 24.4 Emacs จะเปิดmodifyOtherKeys
คุณสมบัติโดยอัตโนมัติเมื่อตรวจพบว่าเทอร์มินัลคือ xterm เวอร์ชั่น≥216 การตรวจสอบ Emacs local-function-key-map
ของลำดับหนีคีย์การเข้ารหัสทำงานผ่านตัวแปร ในฐานะของ Emacs 24.4 ไม่สนับสนุนลำดับการยกเว้นทั้งหมด คุณสามารถใช้รหัสต่อไปนี้ในไฟล์ init เพื่อทำงานให้เสร็จสมบูรณ์
;; 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))
หากTERM
ไม่ได้ตั้งค่าตัวแปรสภาพแวดล้อมเป็นxterm
หรือตัวแปรเช่นxterm-256color
Emacs จะไม่เปิดใช้งานลำดับเหล่านั้น หาก Emacs แล้วมีการสนับสนุนค่าของคุณTERM
คุณสามารถเพิ่มการสนับสนุนด้วยการกำหนดฟังก์ชั่นเดียวกับที่ดังกล่าวข้างต้นจะได้รับการดำเนินการหลังจากการโหลดไฟล์เสียงกระเพื่อมที่มีชื่อคือค่าของ TERM
หาก Emacs ไม่มีการสนับสนุนดังกล่าวคุณสามารถเพิ่มได้โดยการสร้างไดเรกทอรีย่อยที่เรียกว่าterm
หนึ่งในของคุณload-path
และสร้างไฟล์เสียงกระเพื่อมเรียกว่าterm/$TERM.el
ที่$TERM
คุ้มค่าของการกำหนดฟังก์ชั่นที่เรียกว่าTERM
terminal-init-$TERM
ขณะที่ฉันเขียนดูเหมือนว่าเทอร์มินัลอีมูเลเตอร์อื่นที่ไม่ใช่ xterm ได้นำลำดับการหลีกเลี่ยงเหล่านี้มาใช้ บน OSX คุณสามารถกำหนดค่าiTerm2 ได้โดยเลือกลำดับการยกเว้นสำหรับการรวมคีย์แต่ละชุดโดยละชุด
C-;
คอมโบแล้วใช้M-x view-lossage
ดูว่ามันถึง Emacs หรือไม่