GNU/Linux >> Linux Esercitazione >  >> Linux

Come visualizzare i caratteri di controllo (^c, ^d, ^[, …) in modo diverso nella shell?

Quando si digitano i caratteri di controllo nella shell, vengono visualizzati utilizzando quella che viene chiamata "notazione con accento circonflesso". Escape, ad esempio, viene scritto come ^[ in accento circonflesso.

Mi piace personalizzare la mia shell bash per farla sembrare bella. Ad esempio, ho cambiato il mio PS1 e PS2 diventare colorato. Ora voglio che anche i personaggi di controllo ottengano un aspetto unico per renderli più distinguibili dai caratteri normali.

$ # Here I type CTRL-C to abort the command.
$ blahblah^C
          ^^ I want these two characters to be displayed differently

C'è un modo per rendere i miei caratteri di controllo dell'evidenziazione della shell in modo diverso?

È possibile visualizzarli in grassetto o magari farli apparire con colori diversi dal testo normale?

Sto usando bash shell qui ma non ho taggato la domanda con bash perché forse esiste una soluzione che si applica a molte shell diverse.

Nota che non so a quale livello avvenga l'evidenziazione dei personaggi di controllo. All'inizio ho pensato che fosse nel guscio stesso. Ora ho sentito che è readline che controlla il modo in cui i caratteri di controllo sono in shell come bash . Quindi la domanda è ora contrassegnata con readline e sto ancora cercando risposte.

Risposta accettata:

Quando premi Ctrl+X , l'emulatore di terminale scrive il byte 0x18 sul lato master della coppia pseudo-terminale.

Quello che succede dopo dipende da come è configurata la disciplina della linea tty (un modulo software nel kernel che si trova tra il lato master (sotto il controllo dell'emulatore) e il lato slave (con cui interagiscono le applicazioni in esecuzione nel terminale).

Un comando per configurare quella disciplina di linea tty è il stty comando.

Quando si esegue un'applicazione stupida come cat che non è a conoscenza e non si preoccupa se il suo stdin è un terminale o meno, il terminale è in un canonico predefinito modalità in cui la disciplina della linea tty implementa un grezzo editor di linea .

Alcune applicazioni interattive che necessitano di qualcosa di più di un semplice editor di riga in genere modifica queste impostazioni all'avvio e ripristinale all'uscita. Conchiglie moderne, al loro prompt sono esempi di tali applicazioni. Implementano il proprio editor di linee più avanzato.

In genere, mentre si accede a una riga di comando, la shell inserisce la disciplina della riga tty in quella modalità e quando si preme invio per eseguire il comando corrente, la shell ripristina la normale modalità tty (come era in vigore prima dell'emissione del prompt).

Se esegui stty -a comando, vedrai le impostazioni correnti in uso per le applicazioni stupide . Probabilmente vedrai icanon , echo e echoctl impostazioni abilitate.

Ciò significa che:

  • icanon :quell'editor di linee grezze è abilitato.
  • echo :i caratteri digitati (che l'emulatore di terminale scrive sul lato master) vengono eco indietro (reso disponibile per la lettura dall'emulatore di terminale).
  • echoctl :invece di essere eco Inoltre, i caratteri di controllo vengono echeggiati come ^X .

Quindi, supponiamo di digitare A B Backspace-aka-Ctrl+H/? C Ctrl+X Backspace Ritorno .

Il tuo emulatore di terminale invierà:ABbCx18br . La disciplina di linea echeggerà indietro:ABb bC^Xb bb brn e un'applicazione che legge l'input dal lato slave (/dev/pts/x ) leggerà ACn .

Tutto ciò che l'applicazione vede è ACn e solo quando premi Invio quindi non può avere alcun controllo sull'output per ^X lì.

Correlati:qual è la lettura del file conf tra login e shell non login?

Lo noterai per eco , il primo ^H (^? con alcuni terminali, vedere il erase impostazione) ha prodotto b b rimandato al terminale. Questa è la sequenza per spostare indietro il cursore, sovrascrivere con lo spazio, spostare nuovamente il cursore indietro, mentre il secondo ^H ha prodotto b bb b per cancellare quei due ^ e X caratteri.

Il ^X (0x18) stesso veniva tradotto in ^ e X per l'uscita. Come B , non è arrivato all'applicazione, poiché l'abbiamo eliminato con Backspace.

r (noto anche come ^M ) è stato tradotto in rn (^M^J ) per eco e n (^J ) per la domanda.

Allora, quali sono le nostre opzioni per quegli stupidi applicazioni:

  • disabilita echo (stty -echo ). Ciò cambia effettivamente il modo in cui i personaggi di controllo vengono riprodotti, perché... non facendo eco a nulla. Non proprio una soluzione.
  • disabilita echoctl . Questo cambia il modo in cui controllano i caratteri (diversi da ^H , ^M … e tutti gli altri utilizzati dall'editor di linea) vengono ripetuti. Vengono quindi echeggiati come è. Cioè, ad esempio, il carattere ESC viene inviato come e (^[ /0x1b ) byte (che viene riconosciuto come l'inizio di una sequenza di escape dal terminale), ^G invii un a (un BEL, che fa suonare il terminale)... Non è un'opzione.
  • disabilita l'editor della linea grezza (stty -icanon ). Non proprio un'opzione in quanto le applicazioni grezze diventerebbero molto meno utilizzabili.
  • modifica il codice del kernel per cambiare il comportamento della disciplina della linea tty in modo che l'eco di un carattere di controllo invia e[7m^Xe[m invece di solo ^X (qui e[7m di solito abilita il video inverso nella maggior parte dei terminali).

Un'opzione potrebbe essere quella di utilizzare un wrapper come rlwrap questo è un trucco sporco per aggiungere un editor di linee di fantasia ad applicazioni stupide. Quel wrapper in effetti cerca di sostituire il semplice read() s dal dispositivo terminale alle chiamate all'editor di linea readline (che cambia la modalità della disciplina della linea tty).

Andando ancora oltre, potresti anche provare soluzioni come questa che dirotta tutto l'input dal terminale per passare attraverso l'editor di riga di zsh (che evidenzia ^X s in reverse video) basandosi su :exec dello schermo GNU caratteristica.

Ora, per le applicazioni che implementano il proprio editor di linee, spetta a loro decidere come eco è fatta. bash usa readline per ciò che non ha alcun supporto per la personalizzazione del modo in cui i caratteri di controllo vengono ripetuti.

Per zsh , vedi:

info --index-search='highlighting, special characters' zsh

zsh evidenzia i caratteri non stampabili per impostazione predefinita. Puoi personalizzare l'evidenziazione con ad esempio:

zle_highlight=(special:fg=white,bg=red)

Per l'evidenziazione in bianco su rosso per quei caratteri speciali.

Tuttavia, la rappresentazione testuale di quei caratteri non è personalizzabile.

In una localizzazione UTF-8, 0x18 verrà visualizzato come ^X , u378 , U7fffffff (due punti codice unicode non assegnati) come <0378> , <7FFFFFFF> , u200b (un carattere unicode non stampabile) come <200B> .

x80 in una locale iso8859-1 verrebbe visualizzato come ^� … ecc.


Linux
  1. Alias ​​della riga di comando nella shell di Linux

  2. Come assegnare l'output di un comando a una variabile di shell?

  3. Contando i caratteri di ogni riga con Wc?

  4. Come fare eco a una nuova riga negli script di Bash Shell

  5. Come modificare la shell predefinita in Linux

Come ripulire i tuoi dati dalla riga di comando

Come modificare la shell predefinita nel sistema Linux

Come leggere gli argomenti della riga di comando negli script della shell?

Come controllare la versione con Git sulla riga di comando

Opzione per visualizzare i caratteri di controllo in gedit

Come ottengo il mio indirizzo IP dalla riga di comando?