Gibt es Linux-Terminals, die alle Tastenkombinationen verarbeiten können?

11

Ich verwende Emacs gerne im Terminalmodus ( -nw), aber es scheint, dass die meisten (alle?) Terminals einige Tastenkombinationen nicht verarbeiten können - zum Beispiel C-<RET>oder C-M-%. Ich weiß, das liegt daran, dass die meisten Terminals einen VT-100 emulieren, der diese Kombinationen nicht hatte. Gibt es Linux-Terminals (vorzugsweise KDE), die diese Tastenkombinationen verarbeiten können, oder ist dies eine grundlegende Einschränkung aller Terminals?

Yossarian
quelle

Antworten:

15

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, wird die Anwendung empfangen a. Wenn Sie drücken Enter, erhält die Anwendung das Zeichen CR(aka ^M(ausgesprochen "control-emm"), aka Zeichen Nummer 13, aka \roder \015). Tastenkombinationen 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 übertragen, die mit \e[oder beginnen \eO.

Die Escape-Sequenzen sind nicht vollständig standardisiert, und Terminals ignorieren normalerweise bestimmte Attribute für bestimmte Schlüssel. Beispielsweise wird Ctrl+ Shift+ letterhäufig standardmäßig genau wie Ctrl+ übertragen letter.

Sie können sehen, was Ihr Terminal für eine Tastenkombination sendet, indem Sie Ctrl+ Vgefolgt von dieser Tastenkombination in einer Shell-Eingabeaufforderung oder C-qoder C-h cgefolgt von der Tastenkombination in Emacs drücken.

Mit einigen Terminalemulatoren können Sie die Escape-Sequenzen für jeden Schlüssel konfigurieren. Unter Xterm erfolgt dies über X-Ressourcen . Die meisten Setups lesen Ressourcen ab ~/.Xresourcesdem Start von X, und Sie können die Datei manuell mit laden xrdb -merge ~/.Xresources.

Term.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 des Formulars ESC [ number1 ; number2 ~für Funktionstasten mit Modifikatoren. number1gibt die Funktionstaste ( 15auf 24für F5zu F12- aus historischen Gründen F1 durch F4verschiedene Escape - Sequenzen haben) und number2gibt den Modifikator ( 2für Shift, 5für Ctrl, 3für Meta, 8für Ctrl+ Meta, und fügen Sie 1 für + Shift- nein, ist es nicht sehr konsistent).

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

(define-key local-function-key-map "\033[73;5~" [(control return)])
(define-key local-function-key-map "\033[37;6~" [(control ?L)])
Gilles 'SO - hör auf böse zu sein'
quelle
Wenn ich das richtig verstehe, muss ich zuerst eine Escape-Sequenz in meinem Terminal definieren, die einer Tastenkombination entspricht. Dann muss ich in Emacs die Escape-Sequenz wieder der Tastenkombination zuordnen. Kann die Escape-Sequenz beliebig sein, solange sie nicht mit den in definierten übereinstimmt infocmp $TERM?
Yossarian
2
@ Yossarian Ja. Zusätzlich dazu, dass keine Konflikte auftreten, müssen die Escape-Sequenzen eindeutig sein, dh, keine Escape-Sequenzen sollten ein Präfix eines anderen sein. Dies bedeutet in der Praxis, dass das erste Zeichen sein muss ESC(es sei denn, Sie möchten ein Zeichen ≥ 128 ausprobieren, dies beschränkt jedoch die möglichen Eingabecodierungen) und das zweite Zeichen etwas sein muss, für das Sie keine ESC fooBindung wünschen .
Gilles 'SO - hör auf böse zu sein'
Ich bin gerade dabei, zu versuchen, was Sie vorgeschlagen haben. Sollte local-set-keyeigentlich sein define-key? Ersteres gibt einen Fehler aus (falsche Anzahl von Argumenten), während letzteres zumindest für <kbd> C-Enter </ kbd> funktioniert. Es scheint, dass konsole immer noch Probleme beim Senden von <kbd> CM-% </ kbd> hat.
Yossarian
@ Yossarian In der Tat sollte es sein define-key. Ich weiß nicht, ob Konsoles Escape-Schlüssel konfiguriert werden können. Xterm ist wahrscheinlich anpassbarer als jede andere Alternative.
Gilles 'SO - hör auf böse zu sein'
1
Beachten Sie, dass sich Thomas Dickeys xterm in der aktiven Entwicklung befindet. Mit der XTerm*modifyOtherKeys: 2Ressource werden auch für C-M-Kombinationen eindeutige Sequenzen generiert. Mit dieser Einstellung müssen Sie jedoch viele benutzerdefinierte Zuordnungen bereitstellen ( XTerm*modifyOtherKeys: 1ist weniger leistungsfähig, aber sofort weitaus funktionaler). Ein Beispiel (wenn auch eine , die für mich nicht funktioniert hat ) , um die sieht xterm-extras.elBibliothek und den damit verbundenen .Xresourcesund .inputrcDateien im Easymacs herunterladen.
Phils
1

Für einen begrenzten, aber signifikanten Satz von Schlüsseln kann man unter der Annahme der KDE-Konsole Folgendes tun, um funktionierende, komplexe Tastenkombinationen in emacs -nw zu haben:

Ich werde meine Implementierung der S-<RET>Arbeit als Beispiel verwenden:

  1. Öffnen Sie eine neue Konsole, gehen Sie zu Einstellungen -> Aktuelles Profil -> Tastatur -> Bearbeiten
  2. Klicken Sie auf Hinzufügen, machen Sie einen neuen Eintrag für Return+Shiftund geben Sie ihm eine nützliche Tastenfolge (ich habe ausgewählt, \E[27;3welche meiner Meinung nach die Tastenfolge ist, die X gesendet hat, als ich mit xev herumgestochert habe, aber das kann falsch sein - das Wichtigste ist, zu machen sicher, dass es eine richtige Flucht hat und mit nichts anderem in Konflikt steht).
  3. Spielen Sie damit in dem kleinen Testbereich unten, um sicherzustellen, dass es funktioniert.
  4. Konsole neu starten.
  5. Starten emacs -nwund im Arbeitspuffer auswerten:

    (read-key-sequence-vector "Type your new key:")

    Geben Sie dann Ihre neue Tastenkombination ein.

    • Wenn Sie damit nicht vertraut sind, schreiben Sie die Zeile aus, lassen Sie den Cursor am Ende der Zeile und drücken Sie Cx Ce, damit Emacs diese Zeile ausführen. Sie sollten Ihnen sagen, was auch immer Sie in die Anführungszeichen setzen, und auf Sie warten schreibe etwas.
  6. Es sollte eine Schlüsselsequenz ausspucken, die Sie binden können.
    (Es kehrte [27 91 50 55 59 51]zu mir zurück , im Gegensatz zu dem langweiligen alten, [13]bevor ich mich mit der Konsolen-Tastenkombination herumschlug.)

  7. Fügen Sie Ihrer Emacs-Konfiguration Folgendes hinzu:

    (define-key function-key-map [27 91 50 55 59 51] [(shift return)])
    
  8. Ich habe es emacs -nwin einer Bildschirmsitzung getestet mit :

    (define-key ess-mode-map [(shift return)] #'ess-eval-line-and-step)
    (define-key sh-mode-map [(shift return)]  #'send-line-to-shell)
    
Ashton Trey Belew
quelle
0

Die kurze Antwort lautet, dass dies eine grundlegende Einschränkung aller Terminals darstellt.

Die etwas längere Antwort lautet: Selbst wenn jemand ein Terminal erstellt, das das tut, was Sie wollen, würde Emacs selbst größere Änderungen erfordern, um mit diesem hypothetischen Terminal zu arbeiten.

Hruvulum
quelle
Das ist ein guter Punkt bei Emacs, der mir nicht einmal in den Sinn gekommen ist. Ich denke, ich werde stattdessen anfangen, die GUI zu verwenden.
Yossarian
Das ist, was ich tue.
Hruvulum
0

Es gibt einige Bemühungen, das VT-Protokoll so zu erweitern, dass verlustfreie Tastatureingaben möglich sind (unter anderem Funktionen wie Grafiken).

Ein Beispiel ist notty: https://github.com/withoutboats/notty

Vladimir Panteleev
quelle