Tastenbelegungstabelle?

18

Haben wir eine Tastaturbelegungstabelle, die alle Arten der Bezugnahme auf einen Tastendruck übersetzt? Ich benutze zsh, aber ich gehe davon aus, dass es für jede Shell funktionieren würde, wenn es einen solchen Tisch gäbe.

Der Grund, den ich frage, ist, dass ich einige Tastenkombinationen zuweisen möchte und nicht wissen kann, wie ich auf sie verweisen soll (es sei denn, ich werde eine stehlen, die bereits definiert ist).

In 'zbindkey' haben wir zum Beispiel folgendes:

[[ "$terminfo[kend]"  == " O"* ]] && \
    bindkey -M emacs "${terminfo[kend]/O/[}"  end-of-line

... und ich kann mir vorstellen, dass "kend" bedeutet, dass es sich um den EndSchlüssel handelt.

Gegenprüfung mit bindkeyIch sehe diese Zeilen:

"^E" end-of-line
"^[OF" end-of-line
"^[[F" end-of-line

... also ich vertraue darauf, dass sich eine dieser Zeilen auf den EndSchlüssel bezieht . Welcher?

Wir haben dies auch in der "bindkey" -Datei:

bindkey "\e[A" history-beginning-search-backward

Nun, ich weiß zufällig, dass das der Up ArrowSchlüssel ist, aber wie könnte ich herausfinden, ob ich es nicht wusste?

$ bindkey (at CLI)

... gibt uns eine andere Sprache für den gleichen Schlüssel:

"^[[A" history-beginning-search-backward

... aber zumindest weiß ich jetzt, dass ^[[Ain bindkey-at-CLI speak dasselbe ist wie \e[Ain bindkey-in-zbindkey speak. Das ist leicht. In den alten Tagen in DOS, das Up Arrow war 0;72- Sie den Scan - Code eines jeden Rechtstastendruck finden konnten , und es gab nur die eine Sprache.

Ist dort ein Tisch? Oder eine andere Möglichkeit, in der Lage zu sein, einen Tastenanschlag zu wählen und zu wissen, wie man darauf verweist terminfo[]... in "bindkey-in-zbindkey" ... in "bindkey-at-CLI" und / oder in einer beliebigen anderen Sprache zufällig sein?

Wieder gab es unter DOS das scancodeProgramm - geben Sie einen Tastendruck ein, und Sie haben den Scancode erhalten. Es war sündhaft leicht.


Aus den Antworten schätze ich dann, dass es keine Möglichkeit gibt, eine Tabelle aller möglichen Bindungen auszudrucken? Wie auch immer, bindkey macht fast das, was ich will:

pts/2 HP-y5-10-Debian1 root /aWorking/Docs $ bindkey -L
bindkey "^@" set-mark-command
bindkey "^A" beginning-of-line
bindkey "^B" backward-char
bindkey "^D" delete-char-or-list
bindkey "^E" end-of-line
...

Zumindest kann ich alle vorhandenen Bindungen sehen, auch wenn nicht alle möglichen Bindungen. Wenn es nur eine Möglichkeit gäbe, die wichtigsten Glyphen in "reguläre" Begriffe zu übersetzen:

bindkey "Home" beginning-of-line

... dann würde ich mich freuen.

Ray Andrews
quelle
3
Drücken Sie Strg + V (oder was auch immer stty -asagt lnext) und dann die Taste.
Mikel

Antworten:

15

Die Schnittstelle zwischen einer Terminalanwendung und einem Terminalemulator (oder Hardware-Terminal) überträgt Bytes, keine Schlüssel. Funktionstasten wie Cursorbewegungstasten werden in Escape-Sequenzen übersetzt (beginnend mit dem Escape-Zeichen ESC \eaka \033aka 0x1b aka ^ [). Das Gleiche gilt für Kombinationen einer Funktionstaste oder einer Zeichentaste mit Modifikatoren, obwohl nicht alle Terminals unterschiedliche Sequenzen für alle verschiedenen Modifikatorkombinationen senden. Einige Schlüssel werden verschlüsselt als Steuerzeichen gesendet (zB Tab→ Strg-I = \t= \011).

Wie Sie sehen, gibt es viele Möglichkeiten, Steuerzeichen zu beschreiben. Einige haben einen Namen, der ihrer traditionellen Funktion entspricht (z. B. Tabulator, Zeilenvorschub). Diese haben in der Regel eine Kombination aus Backslash und Buchstaben, die Sie innerhalb $'…'oder in einem Argument zu echooder print(sowie in sed regulären Ausdrücken und in String-Literalen in awk, C und anderen Sprachen) verwenden können von Escape-Sequenzen)). Sie können Backslash + Octal (zB \033) auch in diesen Kontexten verwenden.

Es gibt einige Variationen, welche Escape-Sequenz-Terminals für jede Taste senden. Glücklicherweise gibt es fast keine Überlappung: Es gibt nur sehr wenige Zeichenfolgen, die unterschiedliche Tasten auf unterschiedlichen Terminals bedeuten. Das Hauptproblem ist das Zeichen 127 = \177= 0x7f, das Backspaceheutzutage meistens aber manchmal auftritt Delete.

^[OFund ^[[F(dh \eOFund \e[F) sind die beiden gemeinsamen Escape-Sequenzen, die von gesendet werden End. ^E(ie \005) ist die Emacs-Schlüsselbindung ( Ctrl+ E) für end-of-line.

Um zu sehen, was Ihr Terminalemulator für eine bestimmte Taste oder Tastenkombination sendet, drücken Sie Ctrl+ Vund dann die betreffende Taste. Dies fügt das erste Zeichen der Escape-Sequenz wörtlich ein. Escape-Sequenzen bestehen normalerweise aus einem Escape-Zeichen, gefolgt von druckbaren Zeichen, so dass der Rest der Escape-Sequenz ebenfalls wörtlich eingefügt wird.

Die Terminfo-Datenbank enthält die Escape-Sequenzen für einige Schlüssel. Die Liste der Terminfo-Funktionen finden Sie in der Manpage terminfo (5) auf Ihrem System. In zsh können Sie die Werte in der Datenbank über das terminfoassoziative Array auflisten. Beachten Sie beim Ausdrucken von Werten, dass diese Escape-Sequenzen enthalten, die auch vom Terminal bei der Anzeige interpretiert werden. Drucken Sie sie daher in Anführungszeichen aus.

% print -lr ${(q)terminfo[kend]}
$'\033'OF

Siehe Wie funktionieren Tastatureingaben und Textausgaben? Für eine vollständige Übersicht, was passiert, wenn Sie eine Taste drücken. Es ist nicht erforderlich, die Tastenbelegung in zsh zu verstehen.

Gilles 'SO - hör auf böse zu sein'
quelle
11
    BEGINNER'S GUIDE TO ZSH KEYBOARD ASSIGNMENTS, AKA 'KEYBOARD BINDINGS'.

(Kommentare, Verbesserungen, bittere Denunziationen erwünscht: rayandrews bei eastlink dot ca)

'Verfügbare' Tastenkombinationen auf einer '101'-PC-Tastatur, die an einen PC angeschlossen ist, auf dem' zsh 'unter xfce4 unter Debian Linux ausgeführt wird (ich weiß nicht, wer' verantwortlich 'ist). Alle Kombinationen, die doppelte Codes innerhalb der grauen Tasten erzeugen, wurden entfernt, mit Ausnahme des einfachsten gezeigten Avatars. Beachten Sie, dass einige graue Tasten / Kombinationen doppelte '^ Buchstaben' haben, wie 'Enter' == '^ M'. Diese wurden nicht entfernt. Andere aktive Kombinationen waren nicht 'verfügbar', da sie vom System verwendet wurden, selbst von der Konsole aus, z. Mit den Tasten "Alt + Funktion" werden die Klemmen umgeschaltet. Vielleicht würde der 'Meta'-Schlüssel mehr bewirken, aber das ist mit 101 KB gemeint. Interessant, dass es unter DOS weitaus mehr Kombinationen gibt, wie z. B. Strg + Funktion - alle sind unter DOS verfügbar, keine unter Linux, so scheint es. Keine der Dreifachtastenkombinationen (z. B. "Strg + Alt + Auf") erzeugte eindeutige Codes innerhalb der grauen Tasten, aber sie erzeugen Codes in den weißen Tasten. Interessante Anomalien: '^ [[22' '^ [[27' '^ [[30' 'fehlen', Sie müssen sich fragen, warum diese Zahlen übersprungen wurden. (Das heißt, Sie könnten erwarten, dass 'F11' '^ [[22' nicht '^ [[23' 'ist.)

Die angezeigten Schlüsselcodes sind so, als würden sie von 'showkeys -a' oder 'bindkey' an der CLI ausgegeben. Wenn Sie jedoch 'bindkey' innerhalb eines Skripts (wie in '.zshrc') verwenden, muss '^ [' aus irgendeinem Grund durch '\ e' ersetzt werden, also bei CLI:

bindkey -s '^ [[[A' 'mein-befehl \ Cm'

... binde 'F1' an 'my-command' und führe es aus (das '\ Cm' simuliert die 'Enter'-Taste).

in '.zshrc':

bindkey -s '\ e [25' 'my-command1; mein Befehl2 \ Cm '

... binde 'Shift-F1' an 'my-command1' gefolgt von 'my-command2' und führe beide aus.

KOMBINATIONEN MIT NUR DEN ' GRAUEN ' SCHLÜSSELN :

Taste [ F1 ] = '^ [[[A] -Taste [ F2 ] = ' ^ [[B] -Taste [ F3 ] = '^ [[[C] -Taste [ F4 ] = ' ^ [[[D] -Taste [ F5 ] = '^ [[[E' Taste [ F6 ] = '^ [[17 ~' Taste [ F7 ] = '^ [[18 ~' Taste [ F8 ] = '^ [[19 ~' Taste [ F9 ] = '^ [[20 ~' Taste [ F10 ] = '^ [[21 ~' Taste [ F11 ] = '^ [[23 ~' Taste [ F12 ] = '^ [[24 ~'

Taste [ Umschalt - F1 ] = '^ [[25 ~' Taste [ Umschalt - F2 ] = '^ [[26 ~' Taste [ Umschalt - F3 ] = '^ [[28 ~' Taste [ Umschalt - F4 ] = ' ^ [[29 ~ ' Taste [ Umschalt - F5 ] = ' ^ [[31 ~ ' Taste [ Umschalt - F6 ] = ' ^ [[32 ~ ' Taste [ Umschalt - F7 ] = '^ [[33 ~' Taste [ Shift - F8 ] = '^ [[34 ~'

key [ Insert ] = '^ [[2 ~' key [ Delete ] = '^ [[3 ~' key [ Home ] = '^ [[1 ~' key [ End ] = '^ [[4 ~' key [ PageUp ] = '^ [[5 ~' Taste [ PageDown ] = '^ [[6 ~' Taste [ Up ] = '^ [[A' Taste [ Down ] = '^ [[B' Taste [ Right ] = '^[[C' key[Left] = '^[[D'

key[Bksp] = '^?' key[Bksp-Alt] = '^[^?' key[Bksp-Ctrl] = '^H' console only.

key[Esc] = '^[' key[Esc-Alt] = '^[^['

key[Enter] = '^M' key[Enter-Alt] = '^[^M'

key[Tab] = '^I' or '\t' unique form! can be bound, but does not 'showkey -a'. key[Tab-Alt] = '^[\t'

COMBINATIONS USING THE WHITE KEYS:

Anomalies: 'Ctrl+`' == 'Ctrl+2', and 'Ctrl+1' == '1' in xterm. Several 'Ctrl+number' combinations are void at console, but return codes in xterm. OTOH Ctrl+Bksp returns '^H' at console, but is identical to plain 'Bksp' in xterm. There are no doubt more of these little glitches however, in the main:

White key codes are easy to undertand, each of these 'normal' printing keys has six forms:

A = 'a' (duhhh) A-Shift = 'A' (who would have guessed?) A-Alt = '^[a'
A-Ctrl = '^A' A-Alt-Ctrl = '^[^A' A-Alt-Shift = '^[A' A-Ctrl-Shift = '^A' (Shift has no effect)

Don't forget that:

/-Shift-Ctrl = Bksp = '^?' [-Ctrl = Esc = '^[' M-Ctrl = Enter = '^M'

And, we can 'stack' keybindings:

bindkey -s '^Xm' "My mistress\' eyes are nothing like the sun."

... Bind 'Ctrl-X' followed by 'm' to a nice line of poetry.

And we can flirt with madness:

bindkey -s '^Pletmenot' 'Let me not, to the marriage of true minds'

... but you hafta start something like that with a 'modifier' character. Try it, if you like keyboard shortcuts, you can really go to town.

QUESTIONS:

Where is it written that 'Ctrl-Bksp' means one thing at console, another thing in xterm?

Are these assignments changable?

Who designed all this, and what were they thinking at the time?

Why is it 'Alt-Function' to change terminals at a terminal, but 'Alt-Ctrl-Function' to change to a terminal from GUI?

Wie / wo ist ' Alt - Ctrl - Delete ' definiert?

enter code here
Ray Andrews
quelle
Ich möchte fast eine E-Mail senden ...
mikeserv
Auf jeden Fall mike: [email protected]
Ray Andrews
Es war nur ein Scherz, Ray - Sie sehen nur nicht oft Hündinnen, Griffe, Beschwerden? maile mir ... by-line hier. Ich habe es geschätzt, ist alles. Abgesehen davon zshmöchten Sie vielleicht beim Thema Tasten die zkbdFunktion ausprobieren, mit der Sie eine vollständige Tastenzuordnung in einer Datei speichern können. Ich glaube, es ist in der autoloadLage, aber wenn nicht, suchen Sie es in /usr/share/zsh/functions/Misc. Übrigens gibt es noch ein paar andere seltsame Sachen tetris.
mikeserv
Das ist eines der Werkzeuge, mit denen ich meinen Tisch gemacht habe, aber wie schafft man es, "alles" auf einmal auszublenden?
Ray Andrews
interessant - ich glaube, ich habe nicht. Ich habe es noch nie zuvor ausgeführt - ich habe nur die Quelldatei gelesen - und das war vor ein paar Monaten. Ich vermute, es führt eine Reihe von Eingabetests durch, um die Sicherungsdatei zu generieren. aber es speichert alles in einer Datei, oder?
mikeserv
6

Unter Unix / Linux stehen Ihnen viele Tools zur Verfügung, die etwas verwirrend und überwältigend sein können. Für den Anfang würde ich verwenden showkey:

$ showkey -a

Press any keys - Ctrl-D will terminate this program

a    97 0141 0x61
b    98 0142 0x62
c    99 0143 0x63
d   100 0144 0x64
e   101 0145 0x65
f   102 0146 0x66
g   103 0147 0x67

Aus der Manpage bezüglich -a:

   When  in  `ascii' dump mode, showkey prints to the standard output the 
   decimal, octal, and hexadecimal value(s) of the key pressed,
   according to he present keymap.

Mit können xmodmapSie einige der Zuordnungen abrufen:

$ xmodmap
xmodmap:  up to 4 keys per modifier, (keycodes in parentheses):

shift       Shift_L (0x32),  Shift_R (0x3e)
lock        Caps_Lock (0x42)
control     Control_L (0x25),  Control_R (0x69)
mod1        Alt_L (0x40),  Alt_R (0x6c),  Meta_L (0xcd)
mod2        Num_Lock (0x4d)
mod3      
mod4        Super_L (0x85),  Super_R (0x86),  Super_L (0xce),  Hyper_L (0xcf)
mod5        ISO_Level3_Shift (0x5c),  Mode_switch (0xcb)

Das Obige ist nicht alles, was zum Puzzle gehört, aber es sind einige zusätzliche Informationen, die hilfreich sein können, um die ultimative Zuordnung zwischen den Tastenkombinationen und den Scancodes zu finden. Weitere Informationen finden Sie in dieser U & L-Frage & Antwort mit dem Titel: Tastenzuordnungen unter Linux .

Verweise

slm
quelle
1
Dies ist zwar alles wahr, aber für das Verständnis der Tastenbelegung in einem Terminal unerheblich.
Gilles 'SO- hör auf böse zu sein'
@Gilles - ja, das habe ich mir gedacht, ich habe nur versucht, Leads zu liefern, jetzt, wo ich Ihre KI gelesen habe, verstehe ich, wie diese Schnittstelle funktioniert, danke!
SLM
"showkey -a" ist jedoch nicht irrelevant.
Skagedal
2

Wenn es nur eine Möglichkeit gäbe, die wichtigsten Glyphen in "normale" Begriffe zu übersetzen:

bindkey "Home" beginning-of-line

... dann würde ich mich freuen.

Es gibt ein infocmpHilfsprogramm zum Beschreiben von terminfoEinträgen. Dies ist besonders nützlich bei -LOptionen mit langen C-Variablennamen :

$ infocmp -cL
...
key_home= '\EOH'.
key_up= '\EOA'.
key_down= '\EOB'.
key_right= '\EOC'.
key_left= '\EOD'.
key_backspace= '^H'.
key_end= '\EOF'.
...

Vergleichen Sie dies mit der bindkeyAusgabe

"^[OH" beginning-of-line
"^[OA" up-line-or-history
"^[OB" down-line-or-history
"^[OC" forward-char
"^[OD" backward-char
"^H" backward-delete-char
"^[OE" end-of-line

man kann sehen, dass sie unterschiedliche Notationen für die Flucht verwenden , aber im Grunde ist es relativ einfach, ein Skript zu schreiben, das die zweite Spalte von infocmpmit der ersten verbindet bindkey.

Im Zweifelsfall, was eine bestimmte Zeichenfolge bedeutet (wie in der infocmpAusgabe gedruckt ), kann man immer in ein terminfoHandbuch schauen, in dem zum Beispiel die vollständige Beschreibung angegeben ist

key_send  ->  shifted end key
key_sic   ->  shifted insert-character key
key_dc    ->  delete-character key
jimmij
quelle