Ich habe die folgende Zeile in init.el
:
(global-set-key [(control \;)] 'comment-region)
Es funktioniert sehr gut in GUI-Fenstern, aber wenn emacs
es mit der -nw
Option aufgerufen C-;wird, kommentiert es keinen Bereich, sondern fügt nur ;
Zeichen ein. M-x comment-region RETfunktioniert jedoch gut.
Ich habe versucht, dieser Antwort auf ein ähnliches Problem zu folgen , C-q C-;kehre aber gerade zurück ;
und möchte offensichtlich nicht nackt binden ;
.
Wie erreicht man den gewünschten Effekt?
key-bindings
terminal
WeSenseASoulInSearchOfAnswers
quelle
quelle
C-;
Combo und verwenden Sie dann, umM-x view-lossage
zu sehen, ob es überhaupt zu Emacs kommt.gnome-terminal
undM-x view-lossage
kehre zurück:ESC [ > 1 ; 2 8 0 2 ; 0 c ; ESC x v i e w - l o s s a g e RET
C-;
eher so aussehen alsc ;
(oder zumindest soC-;
).Antworten:
Erstens das allgemeinere Problem: Terminalemulatoren sind häufig in den Steuerungs- und Escape-Sequenzen beschränkt, die sie senden können. Also: Es kann vorkommen, dass das Terminal Ihre Sonderzeichen verschluckt, bevor sie Emacs erreichen. Als allgemeine Diagnose können Sie mit
C-h l
(oderM-x view-lossage
) feststellen , ob Ihre Tastenkombinationen es in Emacs schaffen.Weitere Informationen zu diesem Problem finden Sie in diesem Stapelüberlauf-Thread und den darin enthaltenen Links.
Um das Hin und Her in den Kommentaren zusammenzufassen, deutet Ihr spezifisches Problem darauf hin, dass das Terminal und nicht Emacs das Problem ist. Als du es versucht hast
C-;
und dannM-x view-lossage
hast dublah blah blah c ; ESC v i e w - l o s s a g e RET
. Das sieht nach einem Terminalproblem aus: Wenn die Tastenkombination Emacs erreichen würde, würde dasc ;
Teil so aussehenC-;
.quelle
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:
@[\]^_
verwandelt sich in Bytes 0–31 (ASCII- Steuerzeichen ).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 Variablelocal-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.Wenn die
TERM
Umgebungsvariable nicht aufxterm
oder eine Variante wie festgelegt istxterm-256color
, aktiviert Emacs diese Sequenzen nicht. Wenn Emacs bereits Unterstützung für Ihren Wert von hatTERM
, 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 Stelleterm
in Ihrem Verzeichnis aufgerufen wirdload-path
, und eine Lisp-Datei mit dem Namenterm/$TERM.el
where$TERM
is the value of erstellen und eine aufgerufeneTERM
Funktion definierenterminal-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.
quelle
M-C-%
erkannt werdenESC 5
modifyOtherKeys
Funktion nicht aktiv ist. Beachten Sie, dass es nur in ausreichend aktuellen Versionen von xterm unterstützt wird und erst seit Emacs 24.4 automatisch aktiviert wird. Ich weiß nicht, ob OSX mit den neuesten Versionen ausgeliefert wird. Wenn dies nicht der Fall ist und es bei Ihnen nicht funktioniert, empfehle ich Ihnen, eine neue Frage zu stellen. Erwähnen Sie die Versionen, die Sie verwenden.Gilles 'Antwort lautete:
On OSX, you can configure iTerm2 by selecting an escape sequence for each key combination, one by one.
Ich hatte ein kleines Problem, also hier eine ausführliche Erklärung, falls Sie wie ich sind, verwirrt.Wenn Emacs in einem Terminal (z. B. Macs Standard-Terminal.app)
C-x C-;
nicht ausgeführtcomment-line
wird und Sie diese Funktionalität wünschen, müssen Sie zu iTerm2 wechseln (Terminal.app verfügt nicht über die Fähigkeit) und eine Tastenzuordnung erstellen unter Profile ... Tasten wie folgt:Klicken Sie dazu auf die
+
Schaltfläche. Daraufhin wird ein kleines Fenster mit dem Namen "Tastaturkürzel" angezeigt. Dieses Fenster hat anfangs zwei Felder. Das obere Feld hat den Wert "Zum Festlegen klicken" und das untere Feld den Wert "Ignorieren". Klicken Sie auf die obere Schaltfläche und geben Sie einC-;
. Hiermit wird die Tastenkombination festgelegt, mit der die Aktion und der Code ausgeführt werden. Klicken Sie auf das untere Feld "Aktion" und suchen Sie "Escape-Sequenz senden", das sich etwas mehr als auf halber Strecke befindet. Nachdem Sie darauf geklickt haben, wird ein drittes Feld mit dem Namen "Esc +" angezeigt. Geben Sie in dieses Feld Folgendes ein:Der
59
dezimale ASCII-Code des Kommas und5
der Code fürCtrl
. Drücken Sie dann "OK", um den Vorgang abzuschließen. Die richtige Tastenkombination für die Tastenfolge ist jetzt in den Einstellungen von iTerm2 enthalten. Wenn Sie Emacs in iTerm starten, haben Sie jetzt Zugriff aufC-x C-;
Funktionen.quelle