Dove trovo un elenco di codici chiave terminale per rimappare le scorciatoie in bash?


42

Per esempio:

"\e[1;5C"
"\e[Z"
"\e-1\C-i"

Conosco solo pezzi, come \esta per escape e C-for Ctrl, ma cosa sono questi numeri ( 1) e lettere ( Z)? Quali sono i ;, [e -le indicazioni per?

Esistono solo tentativi ed errori oppure esiste un elenco completo di codici chiave bash e una spiegazione della loro sintassi?


2
Un ulteriore suggerimento per elencare gli attuali collegamenti readline della shell è bind -p.

1
Molti di questi codici sono interpretati dal tuo terminale; leggi i codici di escape ANSI su Wikipedia per un elenco di grandi dimensioni.
Chepner,

stty -a mostra le impostazioni della linea del terminale
bug

Risposte:


52

Quelle sono sequenze di caratteri inviati dal tuo terminale quando premi un determinato tasto. Niente a che vedere con bash o readline di per sé, ma ti consigliamo di sapere quale sequenza di caratteri invia una determinata chiave o combinazione di tasti se vuoi configurarti readlineper fare qualcosa alla pressione di un determinato tasto.

Quando si preme il Atasto, generalmente i terminali inviano il carattere a(0x61). Se si preme <Ctrl-I>o <Tab>, generalmente si invia il ^Icarattere noto anche come TABo \t(0x9). La maggior parte dei tasti funzione e di navigazione generalmente invia una sequenza di caratteri che inizia con ^[(control- [), noto anche come ESCo \e(0x1b, 033 ottale), ma la sequenza esatta varia da terminale a terminale.

Il modo migliore per scoprire cosa invia una chiave o una combinazione di tasti per il tuo terminale, è eseguirlo sed -n le digitarlo seguito dalla Entertastiera. Quindi vedrai qualcosa di simile:

$ sed -n l
^[[1;5A
\033[1;5A$

La prima linea è causata dal terminale locale echoeseguito dal dispositivo terminale (potrebbe non essere affidabile in quanto le impostazioni del dispositivo terminale lo influenzerebbero).

La seconda riga viene emessa da sed. Il $non è da inserire, è solo per mostrare dove la fine della linea è.

Sopra Ciò significa che Ctrl-Up(che ho premuto) inviare i 6 caratteri ESC, [, 1, ;, 5e A(0x1b 0x5b 0x31 0x3b 0x35 0x41)

Il terminfodatabase registra un numero di sequenze per un numero di chiavi comuni per un numero di terminali (basato sul $TERMvalore).

Per esempio:

TERM=rxvt tput kdch1 | sed -n l

Ti direbbe quale sequenza di escape viene inviata rxvtpremendo il Deletetasto.

Puoi cercare quale chiave corrisponde a una determinata sequenza con il tuo terminale corrente con infocmp(qui assumendo ncursesinfocmp):

$ infocmp -L1 | grep -F '=\E[Z'
    back_tab=\E[Z,
    key_btab=\E[Z,

Le combinazioni di tasti come Ctrl-Upnon hanno voci corrispondenti nel terminfodatabase, quindi per scoprire cosa inviano, leggi l'origine o la documentazione per il terminale corrispondente o provalo con il sed -n lmetodo sopra descritto.


Questa è un'ottima spiegazione, grazie! Ora tutto va a posto, \e-1\C-iè una scheda all'indietro, perché controle iinserisce una scheda e escapeseguita da -1dice bash per farlo all'indietro una volta (ho goggled questo e ho trovato alcune cose su digit-arguments).
bug

$ sed -n 1 sed: -e expression #1, char 1: missing command
cnvzmxcvmcx,

3
@vib. Questa è la L minuscola non la cifra 1
Stéphane Chazelas il

1
@ user367890, dipende dalla modalità tastiera . Probabilmente scoprirai che dopo tput smkx, il tuo terminale invia \e[OD( kcub1) e dopo tput rmkx, \e[D( cub1, lo stesso codice della sequenza che sposta il cursore a sinistra, in modo che l' eco di quei tasti sposta il cursore. Prova stty -echoctl; tput rmkx; sleep infe vedrai i tasti freccia spostano il cursore quando non è in modalità tastiera ).
Stéphane Chazelas,

1
@ user367890, da quello che Thomas (ncurses e manutentore xterm) dice nella risposta che si collega, sì, dovrebbe funzionare. la modalità tastiera o modalità applicazione si riferiscono alla stessa cosa, quindi (di nuovo, secondo Thomas) le specifiche chiave nel database terminfo sono per quando smkx è abilitato.
Stéphane Chazelas,

4

Viene fornito tramite la libreria readline di gnu. dovresti esaminare man readline per scoprire la sua descrizione.

Sembra che tu abbia bisogno anche di informazioni sul significato dei codici escspe \[A. Puoi trovare queste informazioni nell'articolo del codice esacape di Wikipedia ANSI .


Questo non spiega i miei esempi.
bug

Sembra che sia stato frainteso poco. Si prega di guardare l'aggiornamento della risposta.
corsa

Non ci sono informazioni sui miei esempi specifici nell'articolo. Una ricerca di pagina per "[A" non ha restituito nulla.
bug

1
@bug, leggi attentamente l'articolo. \[Aè nella tabella "Codici CSI" all'interno della riga: "CSI n A"
rush

Grazie fretta, ma dove posso trovare spiegazioni su [Z, [1;5Co -1?
bug

3

Questi codici provengono dalla stessa fonte? L'ultima sembra un'associazione readline GNU. Questo è ciò che l'utente invia a un bash (vedi la risposta di rush). I primi due, tuttavia, assomigliano più a sequenze di controllo terminali (anche se il primo sarebbe mal strutturato). Questo è ciò che bash o un altro programma rimandano all'emulatore di terminale per controllare i movimenti del cursore, i colori del testo e simili.


Ho trovato "\ e [1; 5C" da usare per il movimento della parola in avanti con la freccia ctrl, e "\ e [Z" e "\ e-1 \ Ci" per il menu-completo-indietro in altre esercitazioni. Sono stati tutti utilizzati all'interno del file .inputrc.
bug

OK, se sono interpretati da readline, allora ci deve essere un emulatore di terminale in cui queste sequenze di controllo sono legate a una combinazione di ctrl, alt e / o shift con i tasti funzione o freccia. (Non so quale.)
Uwe

0

Il modo più semplice che ho trovato per verificare quale sequenza di escape è generata da un tasto o una combinazione di tasti è premere Ctrl+ vin un terminale e quindi premere il tasto / combinazione che si desidera conoscere.

Potrai ottenere una sequenza come ^[Oae avrete a tradurre la ^[in \eo \033o \x1bo qualunque altra rappresentazione tuoi aspetta sistema scorciatoia per il carattere di escape.

È iniziato come una funzione Emacs denominata quoted-inserte, poiché i tasti predefiniti per Bash e Zsh imitano Emacs, l'hanno anche copiata.

Bash ottiene tramite la libreria di input GNU Readline che import rlcompleterusano anche altre cose come il potenziamento di Python .

Ecco la descrizione dal manuale di Readline :

quoted-insert( C-qo C-v)

Aggiungi il carattere successivo digitato alla riga alla lettera. Ecco come inserire sequenze di tasti come C-q, ad esempio.

Dovrebbe funzionare in qualsiasi cosa basata su GNU Readline.

Per quanto riguarda Zsh, che utilizza la propria alternativa denominata ZLE, onora il C-qlegame Emacs originale solo in modalità Vi, ironicamente, ma C-vfunziona ancora nella modalità di input predefinita simile a Emacs. (Cerca quoted-insertnelle zshzlemanpage o zshall` e la seconda coppia di risultati dovrebbe elencare le combinazioni di tasti predefinite.)

Per un mnemonico, consiglio di pensare a Ctrl+ vcome a chiederlo v erbatim.

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.