Verwenden Sie Super in Emacs -nw in Linux

15

Ich hatte Mühe, eine einfache und direkte Frage zur Antwort zu finden, und deshalb habe ich mich entschlossen, hier eine Frage zu stellen.

F: Gibt es eine Möglichkeit, Super in Emacs zu verwenden, das in einem Terminal unter Linux gestartet wurde?

PS : Ich habe eine Menge Informationen darüber gelesen, xmodmapaber ich denke, der Schlüssel ist, dass der Terminalemulator den Superschlüssel nicht darstellen kann. Allerdings (kbd "s-SPC")kehrt etwas , und ich dachte an die Übersetzungsfunktion verwenden .Xdefaults/X. Bin ich auf dem richtigen Weg? kbdWas muss ich angesichts des Ergebnisses von als XTerm.VT100.translations einfügen?

Andrea Richiardi
quelle

Antworten:

21

Sie werden sich in einem X11 Emacs wohler fühlen, der Tastatureingaben empfangen und Text anzeigen kann, ohne das Terminal zu codieren und zu decodieren . Der Hauptgrund für die Verwendung eines Textmodus-Editors besteht darin, ihn in screen oder tmux auf einem Remote-Computer auszuführen. Dank Tramp ist es jedoch in der Regel einfacher, die Remote-Datei in Ihrem lokalen Emacs zu bearbeiten. Abgesehen davon können Sie tun, was Sie wollen, solange Ihr Terminal-Emulator zusammenarbeitet, was bei Xterm der Fall ist.

Wenn Sie eine Taste oder Tastenkombination in einem Terminal drücken, wird diese als Folge von einem oder mehreren Zeichen an die im Terminal ausgeführte Anwendung übertragen. Wenn Sie beispielsweise drücken a, empfängt die Anwendung a. Wenn Sie auf drücken Enter, erhält die Anwendung das Zeichen CR(aka ^M(ausgesprochen „control-emm“), aka Zeichen Nummer 13, aka \roder \015). Tastenkombinationen mit Altwerden normalerweise als Zeichen ESC(a.ka. ^[aka \eoder \033) übertragen, gefolgt von der Sequenz für die Taste oder Tastenkombination ohne Alt. Funktionstasten und andere Tastenkombinationen werden als Escape-Sequenzen beginnend mit \e[oder übertragen \eO.

Die Escape-Sequenzen sind nicht vollständig standardisiert, und Terminals ignorieren normalerweise bestimmte Attribute für bestimmte Schlüssel. Beispielsweise werden die Modifikatoren hyper und super normalerweise ignoriert. Sie können sehen, was Ihr Terminal für eine Tastenkombination sendet, indem Sie Ctrl+ Vgefolgt von dieser Tastenkombination in einer Shell-Eingabeaufforderung C-qoder C-h cgefolgt von der Tastenkombination in Emacs drücken.

Mit Xterm können Sie die Escape-Sequenzen für jeden Schlüssel über X-Ressourcen konfigurieren . Die meisten Setups lesen Ressourcen ab dem ~/.XresourcesZeitpunkt, an dem X gestartet wird, und Sie können die Datei manuell mit laden xrdb -merge ~/.Xresources.

XTerm.VT100.translations:       #override \n\
    Ctrl ~Shift ~Meta <Key> Return: string("\033[73;5~") \n\
    Ctrl Shift ~Meta <Key> percent: string("\033[37;6~")

Eine übliche Konvention verwendet Escape-Sequenzen der Form ESC [ number1 ; number2 ~für Funktionstasten mit Modifikatoren. number1gibt die Funktionstaste an ( 15bis 24für F5bis F12- aus historischen Gründen haben F1 bis F4unterschiedliche Escape-Sequenzen) und number2gibt den Modifikator an ( 2für Shift, 5für Ctrl, 3für Meta, 8für Ctrl+ Metaund addiere 1 für + Shift- nein, es ist nicht sehr konsistent).

Sie müssen die Hyper- und Super-Modifikatoren durch ihre Nummer wie Mod1durch angeben Mod5. Führen xmodmap -pmSie den Befehl aus, um die Zuordnung von Keysyms zu Modifikatoren anzuzeigen. Wenn zum Beispiel Super_Lan Mod5 gebunden ist, definiert die folgende Zeile (genau in diesem Fall) eine Bindung für Super+ Space:

    ~Ctrl ~Meta Mod5 <Key> space: string("\033[32;16~") \n\

Emacs übersetzt Escape-Sequenzen durch input-decode-mapoderlocal-function-key-map (oder function-key-mapvor Emacs 23) in ihre interne Tastendarstellung.

(define-key local-function-key-map "\033[32;16~" [(super ?\ )])

Dieser Pfosten besteht zu 80% aus recyceltem Material von Gibt es Linux-Terminals, die alle Tastenkombinationen verarbeiten können?

Gilles 'SO - hör auf böse zu sein'
quelle
Dies ist eine großartige Antwort, die all das Wissen umfasst, das ich ein wenig verstreut gefunden habe. Nur eine Frage: Wo haben Sie 32; 16 ~ gefunden / wie haben Sie sie ausgewählt und warum passt sie nicht zu den unten stehenden Emacs-Bindungen? Ich habe die Herkunft der Zahlen verstanden, aber ich möchte Sie fragen, ob Sie irgendwo eine Verknüpfung zu einer Zuordnungstabelle für Nummer1 und Nummer2 herstellen können .
Andrea Richiardi
@AndreaRichiardi Ich habe 32 ausgewählt, weil es der ASCII / Unicode-Wert für das Leerzeichen ist, und 16, weil Standardbindungen Werte bis zu 8 für Strg, Meta und Umschalt verwenden. Die 33 unten war ein Tippfehler. Sie können alles auswählen, solange es nicht mit anderen Schlüsseln in Konflikt steht.
Gilles 'SO- hör auf böse zu sein'
Ich musste die Sequenz an eine Funktion binden, damit ich sie für einen Moment löste (global-set-key "\033[32;16~" 'set-rectangular-region-anchor). Aber um vollständig zu sein, habe ich Ihr define-keyoben versucht , aber ich konnte dann nicht auslösen (global-set-key (kbd "s-SPC") 'set-rectangular-region-anchor). Es wurde gerade gedruckt, 16 ~ im Puffer. Es wäre schön gewesen, diese Sequenz an (kbd "s-SPC") zu binden, damit ich die Tastenfolge gebunden habe und sie anderen Befehlen zuweisen kann.
Andrea Richiardi
C-h lgibt beim Drücken von s-SPC jetzt Folgendes zurück: ESC [ 3 2 ; 1 6 ~Aber Emacs beklagt sich immer noch darüberM-[ 32 is undefined
Andrea Richiardi,
@AndreaRichiardi Nachdem Sie weitere Tippfehler im xterm-Teil behoben haben (was Sie anscheinend behoben haben, da Emacs die beabsichtigte Zeichenfolge empfängt), funktioniert es für mich. Funktioniert es, wenn Sie function-key-mapanstelle von verwenden local-function-key-map? Es kann eine Frage der Einstellung sein local-function-key-map, da es terminalabhängig ist.
Gilles 'SO- hör auf böse zu sein'
0

Wenn Sie bereit sind, ein Emacs-Paket zu installieren und Ihr Terminal zu konfigurieren, habe ich ein Emacs-Paket geschrieben, mit dem Sie Emacs und Terminals beibringen können, wie alle PC-Tastatur- und Modifikatortastenkombinationen richtig erkannt werden:

https://github.com/CyberShadow/term-keys

Das Kodieren des Super-Modifikators ist standardmäßig nicht aktiviert, aber das Paket ist anpassbar und ermöglicht die Konfiguration, welche Modifikatortastenkombinationen kodiert werden. Um die Codierung von Tastenkombinationen zu aktivieren, die den Modifizierer Super enthalten term-keys/want-key-p-func, müssen Sie eine Funktion festlegen , die zurückgibt, twenn (elt mods 3)der Wert nicht null ist ( eine Erläuterung finden Sie in der Standardimplementierung ).

Vladimir Panteleev
quelle
0

In meinen Init-Dateien ist Folgendes enthalten:

(global-set-key [f7] nil)
(global-set-key [f8] nil)
(define-key function-key-map [(f7)] 'event-apply-super-modifier)
(define-key function-key-map [(f8)] 'event-apply-hyper-modifier)

Dadurch kann ich Super- und Hypertasten mit den Funktionstasten senden.

Realraptor
quelle
-1

Kurze Antwort: verwenden Konsole.

Erläuterung:

  • Emacs ' local-function-key-maphat eine Eintragszuordnung C-x @ szu event-apply-super-modifier.
  • Konsoleordnet Superder Escape-Sequenz ^X@s(die nirgendwo dokumentiert zu sein scheint, ich habe sie zufällig entdeckt) (die Windows-Logo-Taste) zu . Sie können dies versuchen, indem KonsoleSie zB öffnen und drücken Ctrl-v Win-o.
Ubolonton
quelle
Vielen Dank für die Antwort, aber das Ändern des Begriffs ist nicht die Lösung, die ich suche.
Andrea Richiardi