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 bindkey
Ich 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 ^[[A
in bindkey-at-CLI speak dasselbe ist wie \e[A
in 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 scancode
Programm - 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.
quelle
stty -a
sagtlnext
) und dann die Taste.Antworten:
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
\e
aka\033
aka 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 zuecho
oderprint
(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.^[OF
und^[[F
(dh\eOF
und\e[F
) sind die beiden gemeinsamen Escape-Sequenzen, die von gesendet werden End.^E
(ie\005
) ist die Emacs-Schlüsselbindung ( Ctrl+ E) fürend-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
terminfo
assoziative 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.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.
quelle
(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.
quelle
zsh
möchten Sie vielleicht beim Thema Tasten diezkbd
Funktion ausprobieren, mit der Sie eine vollständige Tastenzuordnung in einer Datei speichern können. Ich glaube, es ist in derautoload
Lage, aber wenn nicht, suchen Sie es in/usr/share/zsh/functions/Misc
. Übrigens gibt es noch ein paar andere seltsame Sachentetris
.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
:Aus der Manpage bezüglich
-a
:Mit können
xmodmap
Sie einige der Zuordnungen abrufen: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
quelle
Es gibt ein
infocmp
Hilfsprogramm zum Beschreiben vonterminfo
Einträgen. Dies ist besonders nützlich bei-L
Optionen mit langen C-Variablennamen :Vergleichen Sie dies mit der
bindkey
Ausgabeman 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
infocmp
mit der ersten verbindetbindkey
.Im Zweifelsfall, was eine bestimmte Zeichenfolge bedeutet (wie in der
infocmp
Ausgabe gedruckt ), kann man immer in einterminfo
Handbuch schauen, in dem zum Beispiel die vollständige Beschreibung angegeben istquelle