Risposte:
A seconda della configurazione del terminale, digitare Alt+Keyè come digitare i tasti Esce Keyin sequenza, quindi invia il carattere ESC (aka \e
o ^[
o \033
) seguito dal carattere o dalla sequenza di caratteri inviati dopo averlo premuto Key.
Premendo Up, la maggior parte degli emulatori di terminale invia i tre caratteri \033[A
o \033OA
dipende dal fatto che siano in modalità tastiera dell'applicazione o meno.
Il primo corrisponde alla sequenza di escape che, quando viene inviata al terminale, sposta il cursore verso l'alto. Se fate:
printf '\nfoo\033[Abar\n\n'
Vedrai bar
scritto dopo foo
una riga. Se fate:
stty -echoctl; tput rmkx; read foo
Vedrai che i tasti freccia spostano il cursore.
Quando un'applicazione gradisce zsh
o vi
legge quella sequenza di caratteri dal terminale, la interpreta come l'azione "Su", perché sa dal database terminfo ( kcuu1
capacità) che è la sequenza di escape inviata dopo aver premuto Up.
Ora, per Alt-Up, alcuni terminali come rxvt
e suoi derivati come eterm
inviare \033
seguito dalla sequenza di escape per Up(che è \033\033[A
o \033\033OA
), mentre alcuni altri come xterm
o gnome-terminal
hanno sequenze di escape separati per questi tipi di chiavi quando utilizzato con i tasti di combinazione come Alt, Shift, Ctrl.
Coloro che in genere inviare \033[1;3A
al momento Alt-Up.
Quando viene inviata al terminale, quella sequenza sposta anche il cursore verso l'alto (il secondo parametro (3) viene ignorato). Non esiste un tasto della tastiera corrispondente , quindi è la stessa sequenza inviata Alt-Upin o fuori dalla modalità tastiera dell'applicazione .
Ora che sia \033\033[A
o \033[1;3A
, molte applicazioni non sanno a cosa servono quelle sequenze. Il database terminfo non li aiuterà, perché non esiste una tale capacità che definisce quali caratteri inviano quelle combinazioni di tasti.
Faranno del loro meglio per interpretare quella sequenza. bash
per esempio interpreterà \033[1;3
come una sequenza di escape, non ne sa nulla, quindi non fa nulla, seguito da A
. zsh
, interromperà la lettura non appena scoprirà che non è nota alcuna sequenza di caratteri corrispondente. Non c'è sequenza di escape che sappia che inizia con, \033[1
quindi lo salterà e leggerà il resto: ;3A
e lo inserirà nell'editor di riga.
Molte applicazioni come vi
, zsh
o readline
quelle basate come gdb
o bash
(anche se attenzione bash
utilizza una versione modificata di readline
) consentono di aggiungere associazioni per qualsiasi sequenza di caratteri.
Ad esempio, in zsh
, potresti voler legare Alt-Up, Alt-Downcome:
bindkey '\e[1;3A' history-beginning-search-backward
bindkey '\e[1;3B' history-beginning-search-forward
Devono cercare nella cronologia avanti e indietro le righe di comando che iniziano come quella corrente fino alla posizione corrente del cursore, che è abbastanza utile per richiamare i comandi precedenti.
Puoi usare Crtl+ vper restituire i codici di input della tua tastiera. Se lo fai per i tasti freccia, si otterrà [[D^
, [[C^
, [[A^
, e [[B
valori. Non ci sono collegamenti predefiniti per i Alttasti freccia +, quindi sembra che l'azione eseguita stia stampando solo il codice lettera. Hovewer, se crei la tua versione locale del file di configurazione della libreria readline:
$ cp /etc/inputrc ~/.inputrc
E aggiungi una riga:
"\e[1;3C": "sometexthere"
Dov'è il [1;3C
codice di input di Alt+ →(puoi farlo allo stesso modo di prima di usare Crtl+ vscorciatoia) e riavviare il tuo terminale quindi Crtl+ →scorciatoia ti restituirà il testo "sometexthere" e altre Alt+ scorciatoie da freccia smetteranno di restituire caratteri.
Invece testo è possibile passare un comando associabile da http://www.gnu.org/software/bash/manual/html_node/Bindable-Readline-Commands.html#Bindable-Readline-Commands come
"\e[1;3C": unix-line-discard
per avere lo stesso effetto di Crtl+ u(elimina riga).
Maggiori informazioni qui: http://cnswww.cns.cwru.edu/php/chet/readline/readline.html
La Altchiave viene spesso utilizzata come meta modificatore. I tasti cursore e funzione vengono definiti tasti speciali poiché possono inviare più caratteri e i caratteri inviati possono essere modificati.
Alcuni utenti, ad esempio, si bash
aspettano che la pressione Altinvierà un tasto preceduto dal carattere di escape. La funzionalità "meta" documentata (vedi terminfo(5)
) si occupa dell'ottavo bit:
Se il terminale ha una "meta chiave" che funge da tasto shift, impostando l'ottavo bit di qualsiasi carattere trasmesso, questo fatto può essere indicato con
km
. Altrimenti, il software supporrà che l'ottavo bit sia parità e che di solito verrà cancellato. Se esistono stringhe per attivare e disattivare questa "meta-modalità" , possono essere fornite comesmm
ermm
.
bash
lo sa anche questo (vedi le FAQ di ncurses ), ma pochi dei suoi utenti sono interessati alla funzionalità. Tuttavia, sono abituati a fare riferimento a Alt"meta", anche se la modalità meta è disattivata. Sia rxvt che xterm hanno questa caratteristica fin dai primi anni '90.
Altri utenti (da quando è stata xterm
introdotta la funzione nella patch # 94, 1999 ) possono aspettarsi che le informazioni del modificatore vengano codificate come parametro nella sequenza di caratteri che una chiave speciale invierebbe. La documentazione di XTerm si riferiva a questi tasti modificati come tasti funzione "stile PC" per distinguerli da "stile VT220" (che non aveva modificatori). Potrebbe essere inviato un tasto cursore non modificato ESC[A, ma è anche legale disporre di un parametro , ad es. ESC[5A, Che un'applicazione dovrebbe comprendere ripetendolo cinque volte. La prima versione di xterm
's PC-style chiavi usato che '5' per denotarecontrole una versione successiva lo ha modificato per evitare confusione con il conteggio delle ripetizioni. Così...
ESC[5A
suggerisce che l'applicazione sposta il cursore su 5 righe, mentre
ESC[1;5A
suggerisce di spostarsi verso l'alto di una riga, comunicando all'applicazione che è controlstato premuto un tasto.
Le combinazioni utili sono presenti nel database terminfo di ncurses dal 2004 :
# 2004-07-17
# * add xterm-pc-fkeys -TD
Il database terminfo mostra la versione corrente di xterm + pcfkeys con un commento che mostra come sono codificati i modificatori:
# This fragment describes as much of XFree86 xterm's "pc-style" function
# keys as will fit into terminfo's 60 function keys.
# From ctlseqs.ms:
# Code Modifiers
# ---------------------------------
# 2 Shift
# 3 Alt
# 4 Shift + Alt
# 5 Control
# 6 Shift + Control
# 7 Alt + Control
# 8 Shift + Alt + Control
# ---------------------------------
# The meta key may also be used as a modifier in this scheme, adding another
# bit to the parameter.
(Alt e meta non sono necessariamente la stessa chiave). Quello è un blocco (a sua volta composto da altri blocchi) da cui xterm
viene formata la descrizione del terminale. Utilizza un'estensione fornita in ncurses dal 1999 che consente nomi definiti dall'utente. Poiché termcap supporta solo nomi a 2 caratteri e descrizioni a 1023 byte, non vi era motivo di rendere disponibili questi nomi estesi tramite l' interfaccia termcap . Sono prontamente disponibili per le applicazioni che utilizzano l' interfaccia terminfo .
Ora arriva una difficoltà: ci sono alcuni modi per un'applicazione di determinare ciò che una sequenza di tasti come quella rappresenta:
Pochi programmi farebbero il primo; alcuni editor di testo farebbero il secondo (in realtà, ho fatto questo per ded
le fine del 1980 ). Gli sviluppatori di applicazioni come la bash
scelta del terzo percorso presumono che la maggior parte delle informazioni sia in termcap . In alternativa, avrebbero potuto scegliere di creare una tabella con informazioni termcap / terminfo e utilizzare l'interfaccia che forniva le informazioni migliori. xterm
lo fa per la funzione tcap-query , fornendo vim
le assegnazioni effettive dei tasti funzione.
Poiché nessuna delle stringhe che si bash
confronta con corrisponde alle stringhe che riceve, può confondersi, accontentandosi di corrispondenze parziali (come il carattere di escape da solo).
Ulteriori letture: