In Shift + Up wird von Emacs in einem Terminal nicht erkannt. Ich erkläre, wie Terminals die meisten Funktionstasten in Escape-Sequenzen übersetzen, da die Schnittstelle zwischen Anwendungen und Terminals Zeichen (oder vielmehr Bytes) und keine Tasten überträgt. Nur wenige Kombinationen aus Modifikator und Zeichen haben einen eigenen Charakter:
- CtrlPlus ein Buchstabe oder einer von
@[\]^_
verwandelt sich in Bytes 0–31 (ASCII- Steuerzeichen ).
- Oft wird Ctrl+ ?zu Byte 127 und Ctrl+ Spaceentspricht Ctrl+ @(Byte 0).
- Einige Funktionstasten entsprechen Steuerzeichen: Tab= Ctrl+ I, Return= Ctrl+ M, Esc= Ctrl+ [.
- Und Backspace= Ctrl+ Hoder Ctrl+ ?je nach Konfiguration. Ctrl+ ?ist für Emacs praktischer, da Ctrl+ HHilfe ist.
- Meta+ characterwird gesendet, Escgefolgt von einem Zeichen .
Was ist also mit anderen Kombinationen wie Ctrl+ ;oder Ctrl+ Shift+ letter? Da es kein entsprechendes Zeichen gibt, muss das Terminal entweder ein Zeichen wiederverwenden oder eine Escape-Sequenz senden. Viele Terminals ignorieren Modifikatoren, wenn kein entsprechendes Zeichen vorhanden ist. Daher erhalten Sie Ctrl+ ;Senden ;
, Ctrl+ Shift+ letterEntsprechung zu Ctrl+ letterusw.
Terminalanbieter machten das lange Zeit so einfach. Es gab keinen Standard für Escape-Sequenzen, der sich selbst aufrechterhielt - Terminalanbieter implementieren ihn nicht, Anwendungen unterstützen ihn nicht, Benutzer erwarten ihn nicht. Einige Terminal-Emulatoren können so konfiguriert werden, dass sie beliebige Escape-Sequenzen senden. Wenn dies möglich ist, können Sie sie konfigurieren und die Escape-Sequenzen an Emacs deklarieren (dazu später mehr).
In letzter Zeit ändert sich die Situation, da es zwei Vorschläge zur Standardisierung von Fluchtsequenzen gab. Eines ist LeoNerds libtermkey mit der Syntax . Ein weiteres Beispiel ist Thomas Dickeys xterm mit der Syntax . Aktuelle Versionen von xterm (≥216) können für beide Syntaxarten durch Festlegen der Ressource konfiguriert werden . Die Funktion muss durch Setzen des Werts ungleich Null aktiviert werden .ESC [ codepoint ; modifier u
ESC [ 2 7 ; modifier ; codepoint ~
formatOtherKeys
modifyOtherKeys
Wenn Ihr Terminal-Emulator diese Syntax nicht unterstützt, aber konfiguriert werden kann, wählen Sie eine der beiden Optionen aus.
Seit Emacs 24.4 schaltet Emacs die Funktion automatisch ein, modifyOtherKeys
wenn festgestellt wird, dass das Terminal eine xterm-Version ≥216 hat. Die Erkennung von Escape-Sequenzen zum Codieren von Schlüsseln durch Emacs funktioniert über die Variable local-function-key-map
. Ab Emacs 24.4 werden nicht alle Escape-Sequenzen unterstützt. Sie können den folgenden Code in Ihrer Init-Datei verwenden, um den Auftrag abzuschließen.
;; 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))
Wenn die TERM
Umgebungsvariable nicht auf xterm
oder eine Variante wie festgelegt ist xterm-256color
, aktiviert Emacs diese Sequenzen nicht. Wenn Emacs bereits Unterstützung für Ihren Wert von hat TERM
, können Sie Unterstützung hinzufügen, indem Sie eine Funktion ähnlich der oben genannten definieren, die nach dem Laden der Lisp-Datei ausgeführt wird, deren Name den Wert von hatTERM
. Wenn Emacs keine solche Unterstützung hat, können Sie es hinzufügen, indem Sie ein Unterverzeichnis erstellen, das an einer beliebigen Stelle term
in Ihrem Verzeichnis aufgerufen wird load-path
, und eine Lisp-Datei mit dem Namen term/$TERM.el
where $TERM
is the value of erstellen und eine aufgerufene TERM
Funktion definieren terminal-init-$TERM
.
Während ich schreibe, scheinen nur wenige Terminalemulatoren außer xterm diese Escape-Sequenzen übernommen zu haben. Unter OSX können Sie iTerm2 konfigurieren, indem Sie eine Escape-Sequenz für jede Tastenkombination einzeln auswählen.
C-;
Combo und verwenden Sie dann, umM-x view-lossage
zu sehen, ob es überhaupt zu Emacs kommt.