tabella delle associazioni dei tasti?


18

Abbiamo una tabella di associazioni dei tasti che traduce tutti i vari modi di fare riferimento a una pressione del tasto? Sto usando zsh, ma presumo che se ci fosse una tabella del genere funzionerebbe per qualsiasi shell.

Il motivo per cui chiedo è che vorrei assegnare alcune combinazioni di tasti e non ho modo di sapere come fare riferimento a loro (a meno che non ho intenzione di rubare uno già definito).

Ad esempio, in 'zbindkey' abbiamo questo genere di cose:

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

... e posso immaginare che "kend" significhi che questo si riferisce alla Endchiave.

Controllo incrociato con bindkeyVedo queste righe:

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

... quindi confido che una di quelle righe si riferisca alla Endchiave. Quale?

Abbiamo anche questo nel file "bindkey":

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

Ora, capisco che questa è la Up Arrowchiave, ma come potrei scoprire se non lo sapessi?

$ bindkey (at CLI)

... ci dà una lingua diversa per la stessa chiave:

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

... ma almeno ora so che ^[[Ain bindkey-in-CLI speak è la stessa cosa che \e[Ain bindkey-in-zbindkey speak. Questo è facile. Ai vecchi tempi in DOS, Up Arrow c'era 0;72: era possibile trovare il codice di scansione di ogni sequenza di tasti legale e c'era solo una lingua.

C'è un tavolo? O qualche altro modo di essere in grado di scegliere una terminfo[]sequenza di tasti e sapere come fare riferimento ad esso in ... in "bindkey-in-zbindkey" ... in "bindkey-at-CLI" e / o in qualunque altra lingua capita di essere?

Ancora una volta, in DOS c'era il scancodeprogramma: digita una sequenza di tasti e ottieni lo scancode. È stato peccaminosamente facile.


Dalle risposte immagino quindi che non c'è modo di stampare una tabella di tutti i possibili collegamenti? Comunque 'bindkey' fa quasi quello che voglio:

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
...

almeno posso vedere tutti i binding esistenti, anche se non tutti i possibili binding. Ora, se ci fosse solo un modo per tradurre i glifi chiave in termini "regolari":

bindkey "Home" beginning-of-line

... allora sarei felice.


3
Premi Ctrl + V (o qualunque cosa stty -adica lnext) quindi il tasto.
Mikel,

Risposte:


16

L'interfaccia tra un'applicazione terminale e un emulatore di terminale (o terminale hardware) trasmette byte, non chiavi. I tasti funzione come i tasti di spostamento del cursore vengono tradotti in sequenze di escape (a partire dal carattere di escape ESC aka \eaka \033aka 0x1b aka ^ [). Lo stesso vale per le combinazioni di un tasto funzione o di un tasto carattere con modificatori, anche se non tutti i terminali inviano sequenze diverse per tutte le diverse combinazioni di modificatori. Alcuni tasti vengono inviati codificati come caratteri di controllo (ad es. Tab→ Ctrl-I = \t= \011).

Come puoi vedere, ci sono molti modi per descrivere i personaggi di controllo. Alcuni hanno un nome, corrispondente alla loro funzione tradizionale (es. Tab, avanzamento riga); quelli tendono ad avere una combinazione barra rovesciata + lettera che puoi usare dentro $'…'o in un argomento in echoo print(così come nelle espressioni regolari sed e nei letterali stringa in awk, C e altre lingue (nota che diversi strumenti possono avere un set leggermente diverso delle sequenze di escape)). Puoi usare backslash + octal (es. \033) Anche in questi contesti.

Esistono alcune variazioni su quali terminali di sequenza di escape inviano per ciascun tasto. Fortunatamente, non c'è quasi nessuna sovrapposizione: ci sono pochissime sequenze di caratteri che significano tasti diversi su terminali diversi. Il problema principale è il carattere 127 = \177= 0x7f che è più spesso al Backspacegiorno d'oggi ma a volte Delete.

^[OFe ^[[F(ie \eOFe \e[F) sono le due sequenze di escape comuni inviate da End. ^E(ad es. \005) è l'associazione chiave di Emacs ( Ctrl+ E) per end-of-line.

Per vedere cosa invia il tuo emulatore di terminale per una particolare chiave o combinazione di tasti, premi Ctrl+ Ve poi il tasto in questione. Ciò inserisce letteralmente il primo carattere della sequenza di escape. Le sequenze di escape normalmente consistono in un carattere di escape seguito da caratteri stampabili, quindi anche il resto della sequenza di escape viene inserito letteralmente.

Il database Terminfo contiene le sequenze di escape per alcune chiavi. Troverai l'elenco delle funzionalità di Terminfo nella pagina man terminfo (5) sul tuo sistema. In zsh, è possibile elencare i valori nel database tramite l' terminfoarray associativo. Prestare attenzione quando si stampano valori che contengono sequenze di escape che vengono anche interpretate dal terminale quando visualizzate, quindi stamparle in un formato tra virgolette.

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

Vedi Come funzionano l'input da tastiera e l'output di testo? per una panoramica più completa di ciò che accade quando si preme un tasto. Non è necessario comprendere le combinazioni di tasti in zsh.


11
    BEGINNER'S GUIDE TO ZSH KEYBOARD ASSIGNMENTS, AKA 'KEYBOARD BINDINGS'.

(commenti, miglioramenti, denunce amare benvenute: rayandrews a eastlink dot ca)

Combinazioni di tasti 'disponibili' su una tastiera '101' per PC collegata a un PC con 'zsh' sotto xfce4 sotto Debian Linux (non so chi sia 'in carica'). Tutte le combinazioni che producono codici duplicati all'interno dei tasti 'grigi' sono state rimosse ad eccezione dell'avatar più semplice che viene mostrato. Nota, alcune chiavi / combinazioni grigie hanno duplicati '^ lettera', come 'Enter' == '^ M', questi non sono stati rimossi. Altre combinazioni attive non erano "disponibili" poiché utilizzate dal sistema, anche dalla console, ad es. I tasti 'Alt + Funzione' cambiano i terminali. Forse la chiave 'Meta' farebbe di più, ma questo è con un 101 KB. Interessante che ci siano molte più combinazioni disponibili in DOS, come Ctrl + Funzione - tutte disponibili in DOS, nessuna disponibile in Linux, così sembra. Nessuna delle combinazioni di tasti tripple (ad es. 'Ctrl + Alt + Su') ha prodotto codici univoci all'interno dei tasti grigi, ma producono codici nei tasti bianchi. Anomalie interessanti: '^ [[22' '^ [[27' '^ [[30' sono 'mancanti', ti sei chiesto perché quei numeri sono stati saltati. (Il che significa che potresti aspettarti che 'F11' sia '^ [[22' non '^ [[23'.)

I codici chiave visualizzati sono come verrebbero emessi da 'showkeys -a' o 'bindkey' alla CLI. Tuttavia, per qualche motivo se si utilizza 'bindkey' all'interno di uno script (come in '.zshrc') '^ [' deve essere sostituito con '\ e', quindi in CLI:

bindkey -s '^ [[[[A' 'my-command \ Cm'

... associare 'F1' a 'my-command' ed eseguirlo ('\ Cm' simula il tasto 'Invio').

in ".zshrc":

bindkey -s '\ e [25' 'my-command1; mio comando2 \ Cm '

... associa 'Shift-F1' a 'my-command1' seguito da 'my-command2' ed esegui entrambi.

COMBINAZIONI UTILIZZANDO SOLO I TASTI "GRIGIO" :

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

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

chiave [ Inserisci ] = '^ [[2 ~' chiave [ Elimina ] = '^ [[3 ~' chiave [ Home ] = '^ [[1 ~' chiave [ Fine ] = '^ [[4 ~' chiave [ PageUp ] = '^ [[5 ~' key [ PageDown ] = '^ [[6 ~' key [ Up ] = '^ [[A' key [ Down ] = '^ [[B' key [ 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?

Come / dove è definito " Alt - Ctrl - Elimina "?

enter code here

voglio quasi mandare una mail ...
mikeserv,

Certamente mike: rayandrews@eastlink.ca
Ray Andrews,

era solo uno scherzo, raggio: non vedi spesso troie, lamentele, lamentele? mandami una email ... by-line da queste parti. L'ho apprezzato, tutto qui. comunque, a parte l' zshargomento dei tasti, potresti provare la zkbdfunzione che dovrebbe farti salvare un'intera mappatura dei tasti in un file. Credo che sia in autoloadgrado, ma, in caso contrario, cercarlo /usr/share/zsh/functions/Misc. A proposito, ci sono anche altre cose strane tetris.
Mikeserv,

Questo è uno degli strumenti che ho usato per creare il mio tavolo, ma come si fa a ottenere "tutto" in una volta?
Ray Andrews,

interessante - immagino di no. Non l'ho mai eseguito prima d'ora - ho letto solo il suo file sorgente - e questo è successo un paio di mesi fa. Immagino che faccia una serie di test di input per generare il suo file di salvataggio. ma salva tutto in un file, giusto?
Mikeserv,

6

Ci sono molti strumenti a tua disposizione in Unix / Linux, quindi può essere un po 'confuso e travolgente. Per cominciare userei 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

Dalla pagina man relativa a -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.

È possibile utilizzare xmodmapper ottenere alcuni dei mapping:

$ 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)

Quanto sopra non è tutti i pezzi del puzzle, ma sono alcune informazioni aggiuntive che potrebbero esserti utili per trovare la mappa definitiva tra le combinazioni di tasti e gli scancodes. Ci sono maggiori informazioni in questo U&L Domande e risposte: Mappature chiave in Linux .

Riferimenti


1
Sebbene tutto ciò sia vero, è irrilevante comprendere i collegamenti chiave in un terminale.
Gilles 'SO- smetti di essere malvagio' il

@Gilles - sì, ho pensato che stavo solo cercando di fornire lead, ora che ho letto la tua intelligenza artificiale per capire come funziona questa interfaccia, grazie!
slm

"showkey -a" non è irrilevante, però.
skagedal,

2

se c'era solo un modo per tradurre i glifi chiave in termini "regolari":

bindkey "Home" beginning-of-line

... allora sarei felice.

C'è infocmpun'utilità per descrivere le terminfovoci. Ciò è particolarmente utile con l' -Lopzione aka nomi di variabili C lunghi :

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

Confrontando questo con l' bindkeyoutput

"^[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

si può vedere che usano una notazione diversa per escape , ma in fondo è relativamente facile scrivere uno script che collega la seconda colonna infocmpcon la prima bindkey.

In caso di dubbio sul significato di una particolare stringa (come stampato in infocmpoutput) si può sempre consultare il terminfomanuale in cui viene fornita la descrizione completa, ad esempio

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

0

Uso l'emulatore di terminale URxvt. C'è vincolante per mostrare tali codici di una chiave utile: Ctrl+V. Dopo averlo premuto, inserisci la sequenza di tasti che desideri e stamperà il suo codice. Ad esempio, my Ctrl+ ha un codice ^[Oa.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.