Ich habe versucht, dem Schlüssel eine xmodmap
Zuordnung META_Lzu geben, MENUaber es scheint nicht von bash
als Metaschlüssel akzeptiert zu werden . Ich frage mich also, wie diese Komponenten (Tastatur, X, xterm, bash) in Bezug auf die Meta- und Supertasten zueinander in Beziehung stehen. Jede Erklärung wäre willkommen.
Lassen Sie mich das anders ausdrücken. Die Bash-Manpage sagt zum Beispiel, dass die Funktion yank-nth-arg gebunden ist M-C-yund funktioniert, wenn ich drücke Esc-Control-y. Aber ich finde das etwas umständlich. Wie kann ich die Bash veranlassen, einen anderen Schlüssel als Meta(wie den Menu) für alle seine Standardbindungen zu akzeptieren ?
MENU
Schlüssel überhaupt von X bemerkt? Welchen Fenstermanager verwenden Sie? Einige davon können Ihnen dabei helfen, Ihre Schlüssel neu zu definieren.Antworten:
Die Abbildung von Tasten auf der Tastatur zu Modifikatoren wie
Meta
undControl
wird durch den X - Server (dh des Low-Level - Teil des GUI) behandelt. Diese Zuordnung kann über denxmodmap
Befehl alten Stils oder die XKB- Oberfläche neuen Stils oder über ein GUI-Konfigurationstool geändert werden, das eines dieser Tools unter der Haube verwendet.In den meisten Setups ist der
Meta
Schlüssel standardmäßig der Schlüssel mit der Bezeichnung Alt. Dies liegt daran, dass Metain der Vergangenheit auf vielen Unix-Workstations ein Schlüssel angegeben war, auf dem auf PCs ein Schlüssel angegeben ist Alt. Wenn Sie eine Bindung für habenM-C-y
, drücken Sie Ctrl+ Alt+ Y.Starten Sie das
xev
Programm in einem Terminal , um zu überprüfen, wie Ihre aktuellen Bindungen lauten . Drücken Sie bei fokussiertem xev-Fenster die Tasten. Sie sehen eine Abschrift der generierten Ereignisse im Terminal.Die Kommunikation zwischen Terminalemulatoren (oder Endgeräten, die einem physischen Terminal entsprechen) und Anwendungen verwendet Zeichen. Wenn Sie auf drücken A, erhält das Terminal die Information „
A
key, no modifier“, aber was es an die im Terminal ausgeführte Anwendung sendet, ist das Zeichena
. Wenn Sie eine Funktionstaste wie Upoder drücken F1, gibt es kein entsprechendes Zeichen. Das Terminal sendet eine Zeichenfolge, die mit dem Escape-Zeichen beginnt (Byte 27, manchmal geschrieben\e
oder^[
). Wenn ein Terminal-Emulator wie xterm ein Tastendruckereignis mit demMeta
Modifikator empfängt, übersetzt er diese Taste in ein Escape-Zeichen, gefolgt von der zugrunde liegenden Funktion der Taste, z. B.\ea
(Escape, Kleinbuchstabe a), wenn Sie Meta+ drücken A.Was ist der genaue Unterschied zwischen einem "Terminal", einer "Shell", einem "Tty" und einer "Konsole"? kann nützlich sein Hintergrund.
quelle
Das Schlüsselereignis wird vom X-Server (wie von konfiguriert
xmodmap
) generiert und an Ihre X-Anwendung gesendet. Ihr Fenstermanager könnte dies abfangen, bevor es an xterm gesendet wird. XTerm wiederum übersetzt das Ereignis in einige Bytes und sendet die Bytes an die von Ihrer Shell zugewiesene Pseudotty, bash.Bitte beachten Sie, dass nicht alle Ereignisse von XTerm direkt in Bytes übersetzt werden. Zum Beispiel können die Ctrlund shiftTasten, selbst erzeugen X Tastatur - Ereignisse, aber XTerm- sendet nichts an der Schale (oder eine andere Anwendung) läuft innerhalb dieser Gruppe . Dies beinhaltet auch den MetaSchlüssel für sich, aber nicht den MenuSchlüssel. Das durch Drücken von Meta- erzeugte Ereignis ebewirkt jedoch, dass XTerm abhängig von der Ressourceneinstellung XTerm.VT100.metaSendsEscape entweder das Byte 0xE5 oder die Zwei-Byte-Sequenz 0x1B 0x65 sendet.
quelle
Bashs Metaschlüssel wurde ursprünglich wie folgt definiert (
lib/readline/ChangeLog
):Das ist zufällig so, wie es mit ncurses und xterm interpretiert wird . Ein paar Terminals für die Herstellung dieses Merkmal optional zur Verfügung gestellt (dieser Aspekt war nicht weit verbreitet Die meisten der Terminals werden Sie Gebrauch fest einprogrammiert Verhalten (und nicht sehr interessant) die Begegnung.. Term manpage dokumentiert diese Endgeräte - Leistungsmerkmale:
und erklärt die Funktion:
Alt
Einige Terminal-Emulatoren enthielten eine andere Funktion, die als Reaktion auf den Schlüssel ein Escape-Zeichen voranstellte. Bash (eigentlich diereadline
Bibliothek) dokumentiert diese Verwendung in seinem Changelog von 2004:Meta ist ein Sonderfall einer Modifikatortaste . Wie controlund shift, drücken Sie es gleichzeitig mit einer anderen Taste und erwarten etwas anderes als das Drücken der Taste für sich. X stellt Änderungsschlüssel bereit, indem ein Bit in dem Änderungswert zugewiesen wird, der im X-Ereignis für den Schlüssel übergeben wird. Tastendrücke können mehrere X-Ereignisse sein. X bietet Funktionen zum Kombinieren dieser Ereignisse unter Beibehaltung der Modifikatoren.
X definiert auch Symbole für jede der Tasten, die möglicherweise auf Ihrer Tastatur angezeigt werden. Sie sieht andere Werte (wie Unicode) durch spezielle Behandlung in den Funktionen vor, die Ereignisse kombinieren.
Aber "Meta" ist ein Sonderfall.
X-Anwendungen haben keinen metaSchlüssel, außer gemäß Konvention. X hat keine Definition für den Metaschlüssel oder den Metamodifikator. Herkömmlicherweise suchen Terminals nach der Alt-Taste und / oder einem der Modifikatoren, die bekannt sind
xmodmap
, zmod2
. Die spätere xkb- Funktion verkompliziert die Dinge (bietet jedoch keine Verbesserung im Vergleich zu dieser Diskussion), indem sie eine weitere Informationsebene bereitstellt, um den AltSchlüssel zu finden .Die Konvention kann Sie natürlich nur so weit bringen, da Sie nichts Besonderes über Meta wissen
xmodmap
oderxkb
wissen . xterm ist beispielsweise konfigurierbar, und nicht alle Benutzer möchten Meta auf die gleiche Weise konfigurieren . Beispielsweise kann es sein , dass dies nicht der beabsichtigte Metaschlüssel ist, z. B. wenn er in der Ressource verwendet wird. Ein anderer Schlüssel kann der Meta-Schlüssel sein, aber Benutzer (insbesondere Benutzer, die Escape-Sequenzen in der Bash verwenden) möchten möglicherweise ein Escape-Zeichen, wenn sie drücken . Beachten Sie jedoch, dass nichts davon passiert , wenn es nicht als Modifikator konfiguriert ist : xterm kombiniert keine Ereignisse für sich.Alttranslation
Altxterm verfügt über mehrere Ressourceneinstellungen (dokumentiert in der Manpage ):
altIsNotMeta
undaltSendsEscape
(hinzugefügt 2007 ).eightBitInput
seit 2006 entspricht der ursprüngliche Sinn des Meta-Modus, und es ist eine Escape-Sequenz dafür definiert, die die Funktionensmm
undrmm
(Meta-Modus einstellen / entfernen) des Terminals bereitstellt .eightBitInput
wurde 2003 geändert , um UTF-8 zu berücksichtigen, indem die decodierten Unicode-Werte um 128 anstatt um die unformatierten Eingangsbytes verschoben wurden.metaSendsEscape
stammt aus dem Jahr 1999eightBitInput
ist viel älter alsmetaSendsEscape
. Das hat eine Wahl zwischen dem Meta- Modus (Hinzufügen des achten Bits) oder dem Präfixieren eines Schlüssels mit escapeseit X11R4 (1989) implementiert. Die Funktion wurde jedoch beim Start ermittelt: Sie wurde während der Initialisierung überprüft, um festzustellen, ob der Eingang so eingestellt war, dass er 8 Bit oder nur 7 Bit zulässt. Danach wurde keine Änderung vorgenommen.Einige Leute setzen die beiden gleich ( 8-Bit und Escape-Präfix) und bezeichnen letzteres als Meta- Modus. Abhängig von Ihrer Sicht auf die Angelegenheit ist die
eightBitInput
Ressourceneinstellung von xterm Teil der Lösung, um einen funktionsfähigen Metaschlüssel zu erhalten.Weitere Lektüre:
quelle