Warum können Emacs, die in einem Terminal ausgeführt werden, Strg + nicht unterscheiden? von ";"?


8

Diese Frage ergab sich aus meiner vorherigen Frage zu Emacs Beta . Kurz gesagt, ich möchte an C-;eine Emacs-Funktion in einem Terminal binden , aber es scheint, dass etwas diese Taste erfasst, bevor sie Emacs erreicht: Emacs glaubt, ich hätte gedrückt ;.

Der offensichtliche Verdächtige ist der Terminalemulator, aber ich habe viele davon überprüft (xterm, gnome-terminal, terminator, terminologie) und keiner von ihnen funktioniert. Höchstwahrscheinlich kann ich den Fenstermanager ausschließen, da der Schlüssel in der GUI-Version von Emacs einwandfrei C-;funktioniert. Ich habe auch zwei verschiedene Shells ausprobiert: Bash und Zsh, aber wieder ohne Erfolg.

Was kann ich noch versuchen?


Entsprechend Ihrer Frage zu Emacs drücken Sie Strg +; sendet ;an Emacs, also erfasst es nichts . Was passiert, ist, dass Strg +; und nackt; Senden Sie die gleichen Informationen. Welches ist es: Erfassung (dh Emacs erhält nichts) oder Informationsverlust (dh Emacs erhält ;)?
Gilles 'SO - hör auf böse zu sein'

Es gibt keinen Standardcode für C-;im Terminal. Was passiert, wenn Sie eine C-v C-;einfache Bash eingeben?
Artm

@Gilles Ich sehe ;in und emacs -nwzwar unabhängig , ob ich getroffen ;oder C-;.
WeSenseASoulInSearchOfAnswers

@artm bashgenau wie Emacs druckt nur nackt ;.
WeSenseASoulInSearchOfAnswers

Antworten:


11

Möglicherweise entsteht Ihre Verwirrung dadurch, dass Sie kein tatsächliches Terminal verwendet haben. Damals, als ernsthafte Computer die Größe mehrerer aufrecht stehender Kühlschränke hatten, kommunizierte ein Terminal über ein serielles Kabel mit einem zentralen Computer, wobei nur Zeichen und Zeichen verwendet wurden. Die Zeichen waren Teil eines standardisierten Zeichensatzes, z. B. ASCII oder EBCDIC, aber typischerweise ASCII. ASCII verfügt über 33 Steuerzeichen, die vom Terminalbetreiber durch Drücken einer Sondertaste (z. B. DEL) oder durch Gedrückthalten der STRG-Taste und Drücken einer anderen Taste gesendet wurden. Der Zentralcomputer sah nur das resultierende Steuerzeichen; es wusste nicht, welche Tasten gedrückt wurden, um das Zeichen zu erzeugen.

Ein Terminalemulationsprogramm wie xterm ahmt dieses Verhalten nach. Der Terminalemulator bietet eine Möglichkeit, alle 33 ASCII-Steuerzeichen zu senden, und Emacs empfängt diese Zeichen, wenn sie gesendet werden. Aber Emacs ist wie der Zentralcomputer in der obigen Beschreibung - es kann nicht wissen, welche Tasten tatsächlich gedrückt wurden, als Sie es unter einem Terminalemulator ausführen. Wenn Sie also STRG und Semikolon drücken, weiß Emacs nicht, dass etwas eingegeben wurde, es sei denn, das Terminalemulationsprogramm hat diese Tastendrücke einem ASCII-Zeichen zugeordnet.

Terminalemulatoren verwenden normalerweise die folgenden Zuordnungen, um Steuerzeichen zu generieren :

Tastendruck ASCII
--------------------
ESCAPE 27
LÖSCHEN 127
RÜCKSEITE 8
STRG + LEERTASTE 0
STRG + @ 0
STRG + A 1
STRG + B 2
STRG + C 3
usw...
STRG + X 24
STRG + Y 25
STRG + Z 26
STRG + [27
STRG + \ 28
STRG +] 29
STRG + ^ 30
STRG + _ 31

Beachten Sie, dass STRG +; erscheint nicht in dieser Liste. Terminals senden normalerweise nur das druckbare Zeichen, das der Taste zugewiesen ist, wenn STRG + Taste keinem Steuerzeichen zugeordnet ist. Also, was Ihr Terminalemulator Ihnen durch Senden sagt; allein ist, dass es nicht weiß, was zu tun ist, wenn Sie STRG + drücken;.

All dies gilt nur, wenn Sie ein Terminal oder ein Terminalemulationsprogramm verwenden. Wenn Sie Emacs als native Anwendung unter einem Fenstersystem ausführen, hat Emacs vollen Zugriff auf die Tastenanschlagereignisse und nicht nur auf Zeichen. So kann Emacs sehen, dass Sie STRG und Semikolon gleichzeitig gedrückt haben, und es Ihnen ermöglichen, diesem Tastenanschlagpaar eine Aktion zuzuweisen.

Terminals verfügen häufig über Funktionstasten und Pfeiltasten, die auch Zeichenfolgen erzeugen, die Steuerzeichen enthalten. Diese Sequenzen beginnen normalerweise mit ASCII-Code 27 (ESCAPE).


3

Terminals übertragen Zeichen (genauer: Bytes), keine Schlüssel. Wenn Sie eine Taste oder ein Keychord wie Ctrl+ drücken ;, müssen diese Informationen in eine Folge von Bytes codiert werden. Keychords , die ein Zeichen, wie darstellen Aoder Shift+ Aoder À, als das Zeichen gesendet: a, A, à(die letzten ein oder zwei Bytes ist auf das Endgerät des Zeichencodierung abhängig).

Schlüsselwörter mit Funktionstasten haben kein entsprechendes Zeichen und werden daher als Escape-Sequenzen gesendet: Eine Folge von Bytes, die mit dem Escape-Zeichen beginnen ( \ein einer Emacs-Zeichenfolge, die als Cyan erscheint, ^[wenn sie buchstäblich in einen Puffer eingegeben wird). Einige Funktionstasten haben entsprechende Bytes, die Steuerzeichen sind .

Das Keychord Ctrl+ ;hat keine Standard-Escape-Sequenz, daher generieren die meisten Terminalemulatoren das Zeichen ;. Dadurch geht die Information verloren, dass der CtrlModifikator gedrückt wurde.

Um eine Bindung für Ctrl+ zu definieren ;, müssen Sie Ihren Terminalemulator so konfigurieren, dass eine andere Escape-Sequenz gesendet wird. Ich glaube nicht, dass Sie dies mit dem Gnome-Terminal tun können (Gnome ist selten konfigurierbar). Sie können es mit Xterm tun. Siehe Gibt es Linux-Terminals, die alle Tastenkombinationen verarbeiten können? für Anweisungen.

Die Shell, die Sie möglicherweise im Terminal ausführen, ist nicht beteiligt. Ein GUI-Emacs hat kein Problem, da die GUI (X11) Eingabeereignisse in einer Form überträgt, die Schlüssel und Modifikatoren codiert, nicht als bloße Folge von Zeichen.

Siehe Wie funktionieren Tastatureingabe und Textausgabe? Für detailliertere Hintergrundinformationen darüber, wie Eingaben von Ihrer Tastatur in Ihre Anwendung gelangen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.