Quali sono i caratteri stampati quando si premono i tasti Alt + freccia?


13

Quando premo AltUp, Astampato sullo schermo del terminale. La stessa cosa è successa quando ho premuto AltDownma Bè invece stampata.

Altri personaggi che ho realizzato;

AltLeft= De AltRight=C

Qual è lo scopo di questi comandi?

Risposte:


14

A seconda della configurazione del terminale, digitare Alt+Keyè come digitare i tasti Esce Keyin sequenza, quindi invia il carattere ESC (aka \eo ^[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[Ao \033OAdipende 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 barscritto dopo foouna riga. Se fate:

stty -echoctl; tput rmkx; read foo

Vedrai che i tasti freccia spostano il cursore.

Quando un'applicazione gradisce zsho vilegge quella sequenza di caratteri dal terminale, la interpreta come l'azione "Su", perché sa dal database terminfo ( kcuu1capacità) che è la sequenza di escape inviata dopo aver premuto Up.

Ora, per Alt-Up, alcuni terminali come rxvte suoi derivati come eterminviare \033seguito dalla sequenza di escape per Up(che è \033\033[Ao \033\033OA), mentre alcuni altri come xtermo gnome-terminalhanno 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;3Aal 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[Ao \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. bashper esempio interpreterà \033[1;3come 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[1quindi lo salterà e leggerà il resto: ;3Ae lo inserirà nell'editor di riga.

Molte applicazioni come vi, zsho readlinequelle basate come gdbo bash(anche se attenzione bashutilizza 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.


3

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 [[Bvalori. 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;3Ccodice 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


3

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 bashaspettano 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 come smme rmm.

bashlo 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 xtermintrodotta 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 xtermviene 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:

  1. analizzare completamente la sequenza di caratteri
  2. analizzarlo parzialmente e gettare via il controlmodificatore se non necessario
  3. confronta semplicemente la sequenza di caratteri con un dizionario, sperando di determinare il significato in quel modo.

Pochi programmi farebbero il primo; alcuni editor di testo farebbero il secondo (in realtà, ho fatto questo per dedle fine del 1980 ). Gli sviluppatori di applicazioni come la bashscelta 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. xtermlo fa per la funzione tcap-query , fornendo vimle assegnazioni effettive dei tasti funzione.

Poiché nessuna delle stringhe che si bashconfronta con corrisponde alle stringhe che riceve, può confondersi, accontentandosi di corrispondenze parziali (come il carattere di escape da solo).

Ulteriori letture:

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.