Was ist der Metaschlüssel von bash?

16

Ich habe versucht, dem Schlüssel eine xmodmapZuordnung META_Lzu geben, MENUaber es scheint nicht von bashals 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 ?

Löwe
quelle
Wird Ihr MENUSchlüssel überhaupt von X bemerkt? Welchen Fenstermanager verwenden Sie? Einige davon können Ihnen dabei helfen, Ihre Schlüssel neu zu definieren.
Choroba

Antworten:

11

Die Abbildung von Tasten auf der Tastatur zu Modifikatoren wie Metaund Controlwird durch den X - Server (dh des Low-Level - Teil des GUI) behandelt. Diese Zuordnung kann über den xmodmapBefehl 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 MetaSchlü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 haben M-C-y, drücken Sie Ctrl+ Alt+ Y.

Starten Sie das xevProgramm 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 „ Akey, no modifier“, aber was es an die im Terminal ausgeführte Anwendung sendet, ist das Zeichen a. 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 \eoder ^[). Wenn ein Terminal-Emulator wie xterm ein Tastendruckereignis mit dem MetaModifikator 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.

Gilles 'SO - hör auf böse zu sein'
quelle
5

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.

Teddy
quelle
2

Bashs Metaschlüssel wurde ursprünglich wie folgt definiert ( lib/readline/ChangeLog):

Mon Jul 13 11:34:07 1992  Brian Fox  (bfox@cubit)
        * readline.c: (rl_variable_bind) New variable "meta-flag" if "on"
        means force the use of the 8th bit as Meta bit.  Internal variable
        is called meta_flag.

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:

   has_meta_key              km     km   Has a meta key
                                         (i.e., sets 8th-bit)
   meta_off                  rmm    mo   turn off meta mode
   meta_on                   smm    mm   turn on meta mode
                                         (8th-bit on)

und erklärt die Funktion:

Wenn das Terminal eine "Meta-Taste" hat, die als Umschalttaste fungiert und das 8. Bit eines übertragenen Zeichens setzt, kann dies mit angezeigt werden km. Andernfalls geht die Software davon aus, dass das 8. Bit Parität ist, und es wird normalerweise gelöscht. Wenn Zeichenfolgen zum Ein- und Ausschalten dieses "Metamodus" vorhanden sind, können sie als smmund angegeben werden rmm.

AltEinige Terminal-Emulatoren enthielten eine andere Funktion, die als Reaktion auf den Schlüssel ein Escape-Zeichen voranstellte. Bash (eigentlich die readlineBibliothek) dokumentiert diese Verwendung in seinem Changelog von 2004:

lib/readline/callback.c            
        - use _rl_dispatch_callback and a chain of _rl_keyseq_contexts to
          simulate the recursion used to decode multicharacter key sequences
          (even things like ESC- as meta-prefix

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, z mod2. 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 xmodmapoder xkbwissen . 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.AlttranslationAlt

xterm verfügt über mehrere Ressourceneinstellungen (dokumentiert in der Manpage ):

  • altIsNotMetaund altSendsEscape(hinzugefügt 2007 ).
  • eightBitInputseit 2006 entspricht der ursprüngliche Sinn des Meta-Modus, und es ist eine Escape-Sequenz dafür definiert, die die Funktionen smmund rmm(Meta-Modus einstellen / entfernen) des Terminals bereitstellt .
  • eightBitInputwurde 2003 geändert , um UTF-8 zu berücksichtigen, indem die decodierten Unicode-Werte um 128 anstatt um die unformatierten Eingangsbytes verschoben wurden.
  • metaSendsEscapestammt aus dem Jahr 1999
  • eightBitInputist viel älter als metaSendsEscape. 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 eightBitInputRessourceneinstellung von xterm Teil der Lösung, um einen funktionsfähigen Metaschlüssel zu erhalten.

Weitere Lektüre:

Thomas Dickey
quelle