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.