Entfernen von Bindungen zum ESC-Präfixschlüssel

9

Ich möchte den ESCSchlüssel anstelle von C-gfür verwenden keyboard-quit. Mein naiver Ansatz, es einfach zu tun

(define-key global-map (kbd "ESC") 'keyboard-quit)

funktioniert nicht. ESCist immer noch eine Präfix-Taste und das Drücken dieser Taste ruft nicht auf keyboard-quit.

Geier
quelle
1
Vielleicht interessiert Sie dieser verwandte Thread - Ich habe diese Lösung ungefähr ein Jahr lang verwendet, bis ich mich an Cg und ESC-ESC-ESC gewöhnt habe : Verwendung von <escape> (bedingt) als Modifikatorschlüssel stackoverflow.com/a/20036348/ 2112489 Die Antwort von Stefan in diesem verwandten Thread ist das gleiche Konzept, das von der universal-argumentmit dem verwendet wird universal-argument-map.
Lawlist

Antworten:

7

Das kannst du machen (define-key key-translation-map (kbd "ESC") (kbd "C-g")). Ich habe das vor langer Zeit getan und hatte keine Probleme.

Bearbeiten , um die Antwort gemäß den Kommentaren zu verbessern:

Wenn Sie die ESCSchlüsselfunktionalität beibehalten möchten , können Sie dies tun

(define-key key-translation-map (kbd "C-<escape>") (kbd "ESC"))

Eine Sache zu beachten ist, dass wenn Emacs hängt, Sie den C-gSchlüssel aus irgendeinem Grund immer noch verwenden müssen , aber das passiert selten.

Clemera
quelle
1
@EmacsUser Auch wenn ich bei der Verwendung von Emacs nie ESC gedrückt habe?
Geier
1
@EmacsUser: Also? Ab sofort drücke ich nie mehr ESC, geschweige denn zweimal oder dreimal. Ich werde es nicht vermissen.
Geier
2
@EmacsUser Ich sage nicht, dass dies die richtige Antwort ist und dass ich sie verwenden möchte, ich möchte nur verstehen, was daran falsch ist. Das Ganze "In Zukunft können Sie ESC nicht mehr zweimal drücken" betrifft mich überhaupt nicht. Wenn Sie mir sagen, unter welchen Bedingungen ich damit in eine Endlosschleife geraten könnte und warum, wäre das wirklich aufschlussreich.
Geier
1
@Geier Ich habe diese Neuzuordnung lange verwendet und bin nie auf Probleme damit gestoßen. Das einzige ist, dass, wenn Emacs hängen, Sie drücken müssen, um C-ges aufzuhängen, die ESCNeuzuordnung in diesem Fall nicht funktioniert.
Clemera
1
@EmacsUser Ich hatte nie einen Anwendungsfall dafür, ESCalso hat mich das nicht gestört. Aber wenn Sie es brauchen, können Sie eine andere Übersetzung machen, zum Beispiel(define-key key-translation-map (kbd "C-<escape>") (kbd "ESC"))
Clemera
8

Mein Rat wäre, in ESCRuhe zu lassen , weil es ein besonderer Schlüssel ist.

Standardmäßig verwendet Emacs ESC(ASCII 27) als meta-prefix-key. Aus dem Elisp-Handbuch:

'esc-map' ist die globale Keymap für den Präfixschlüssel. Somit finden sich hier tatsächlich die globalen Definitionen aller Metazeichen. Diese Karte ist auch die Funktionsdefinition des 'ESC-Präfix'.

und

Stattdessen werden Metazeichen zum Zwecke der Schlüsselsuche als Sequenzen von zwei Zeichen betrachtet, von denen das erste ESC ist (oder was auch immer derzeit der Wert von 'Meta-Präfix-Zeichen' ist). Somit wird der Schlüssel 'M-a' intern als 'ESC a' dargestellt, und seine globale Bindung befindet sich am Steckplatz für 'a' in 'esc-map'.

Um ESC für etwas anderes zu verwenden, müssten Sie etwas anderes festlegen meta-pefix-keyund auch einen anderen Schlüssel daran binden ESC-prefix. Möglicherweise sind auch andere Änderungen erforderlich - ich habe dies noch nie versucht.

Weitere Informationen finden meta-prefix-charSie unter Funktionen für die Schlüsselsuche im Elisp-Handbuch.

Glucas
quelle
1
+1. Entfernen Sie nicht die Bindung von ESC. Binden Sie einen anderen Schlüssel an keyboard-quit, wenn Sie möchten. Beachten Sie auch, dass Sie ESC ESC ESCbereits das gewünschte Escape-Verhalten erhalten - siehe Emacs-Handbuch, Knoten Beenden .
Drew
2
Einstellen der meta-prefix-charzu nilauf OSX wird nicht deaktivieren aus einem Präfix Schlüssel zu sein - es wird sie nur von der Meta - Taste trennen. Unter OSX mit einer grafischen Version von Emacs möchte ich, dass der Escape-Schlüssel vom Meta-Schlüssel getrennt wird. Ich habe ihn (setq meta-prefix-char nil)zu Beginn meiner Initialisierung festgelegt, damit alle anschließend geladenen Bibliotheken verstehen, was ich will. Dies gibt mir die Möglichkeit, den Metaschlüssel als Präfixschlüssel und den Escape-Schlüssel als Präfixschlüssel zu verwenden. Das esc-mapwird auf der C-Quellcode-Ebene innerhalb definiert keymap.c. Es soll als Präfixschlüssel verwendet werden.
Lawlist
@lawlist Interessant - ordnen Sie dann Meta als esc-mapPräfix zu, um die Standard-M-Bindungen beizubehalten ?
Glucas
Ich denke, dies ist die relevante Einstellung unter OSX : (setq ns-alternate-modifier 'meta), wodurch Meta zur linken Alt-Taste auf der Apple-Tastatur wird. Ich verwende gerne die rechte Alt-Taste, um Unicode-Zeichen mit den OSX-Standardeinstellungen zu erstellen: (setq ns-right-alternate-modifier 'none)- um spanische Zeichen, Absatzsymbole usw. einzufügen. Beim Erstellen werden --with-nssowohl die linke als auch die rechte Alt-Taste auf Meta gesetzt. Die Standardeinstellung bindet den Escape-Schlüssel unter OSX mit dem Meta-Schlüssel meta-prefix-char, 27wie von Ihnen angegeben.
Lawlist
5
Verwenden Sie Emacs, sagen sie. Es ist erweiterbar, sagen sie. Sie müssen sich nicht darauf einstellen, es passt sich Ihnen an, sagen sie. Das heißt, es passt sich nur an Sie an, wenn Sie einer Situation durch dreimaliges Drücken von ESC entkommen möchten. Weil jemand in der Vergangenheit dachte, dass ESC eine so unerhörte Taste ist (sie befindet sich nur in der oberen linken Ecke jeder Tastatur), dass er sie besser mit der Meta-Taste verknüpft :-(.
Geier
1

Schöne Antwort hier: https://superuser.com/a/945245/624661

Zitat:

Sie können dies in Ihrer Emacs-Init-Datei verwenden:

;;; esc always quits
(define-key minibuffer-local-map [escape] 'minibuffer-keyboard-quit)
(define-key minibuffer-local-ns-map [escape] 'minibuffer-keyboard-quit)
(define-key minibuffer-local-completion-map [escape] 'minibuffer-keyboard-quit)
(define-key minibuffer-local-must-match-map [escape] 'minibuffer-keyboard-quit)
(define-key minibuffer-local-isearch-map [escape] 'minibuffer-keyboard-quit)
(global-set-key [escape] 'keyboard-quit)
Ole
quelle
0

Sie möchten binden [escape], nicht (kbd "ESC"), wie die von Ole referenzierten Bindungen zeigen. Auf Lager funktioniert dies nur, wenn Emacs-Frames in einem Fenstersystem vorhanden sind. Ich denke, das ist eine Erklärung wert.

(kdb "ESC")bedeutet eigentlich das ASCII-Steuerzeichen ESC, und wie Glucas erwähnt hat, möchten Sie dieses sicherlich nicht neu zuordnen. Ist Escaber nicht ASCII ESC: Es ist ein Symbol escape, zumindest in einer grafischen Umgebung. Wie kommt es dann dazu, dass sich die Bindung (kbd "ESC")auswirkt Esc? Dies geschieht, weil emacs übersetzt escape, ESC wenn keine Bindung für verfügbar istescape . Eine Art Fallback, wenn Sie es wünschen (was mithilfe von implementiert wird, local-function-key-mapwenn Sie an solchen Dingen interessiert sind).

Wenn Sie also binden [escape], sind Sie in Sicherheit und müssen sich keine Sorgen machen ESC. Abgesehen von Ihren eigenen Bindungen müssen Sie nur die Keymaps erweitern, die angeben, ESCwann sie bedeuten [escape].

Hmm ... na ja, fast. Warum werden diese Karten nicht [escape]zum ersten Mal verwendet? Weil dies in einem Terminal nicht funktioniert. Wenn Sie Escan einem solchen Gerät arbeiten möchten , müssen Sie Ihr Terminal zumindest vorher anpassen .

Die Geschichte des Terminals wird in einem anderen Beitrag berichtet: Wie bindet man C- [wirklich? . Sie müssen das Terminal anweisen, beim EscDrücken eine benutzerdefinierte Sequenz zu senden , und diese Sequenz dann [escape]zu einem frühen Zeitpunkt in emacs (the input-decode-map) zuordnen .

Hoffe das hilft.

Champignac
quelle