Linux: la colorazione del prompt di bash interromperà il ritorno a capo


24

Quando provo a colorare il bashprompt in questo modo:

export PS1="\e[0;31m[\u@\h \W]\$ \e[m "

interrompe il ritorno a capo (invece di passare a una nuova riga quando la riga è piena, inizia nella stessa riga e cancella il testo inserito).

Se rimuovo la sequenza di colori funziona benissimo.
Uso Ubuntu 11.10 e il terminale (anche Guake ha lo stesso bug).


Strano. Funziona senza problemi su RedHat 5 e Mac OS X
Matteo,

possibile duplicato del problema PS1, cmd è in loop
gravità

Risposte:


43

È necessario avvolgere tutte le sequenze di escape tra \[e \]affinché "readline" calcoli correttamente la lunghezza visibile del prompt. Senza di essi, "readline" pensa che il prompt sia più lungo di quello che è e non sa quando il testo raggiunge il margine.

PS1 = " \ [ \ e [; 31m \] [\ u @ \ h \ W] \ $ \ [ \ e [m \] "

4
Grazie mille !! stavo cercando di trovare un po 'di documentazione nei documenti ufficiali ma non ci sono riuscito: il prompt dei colori "stock" utilizza questo "trucco" e all'inizio ho avuto difficoltà a capire esattamente a cosa servisse, quindi grazie per averlo chiarito su --- tra l'altro ho effettivamente trovato la fonte della documentazione in 'man readline 3' intorno alla linea 684 e dice che questo è in realtà chiamato 'skip-csi-sequence' per coloro che vogliono sapere dove si trova la documentazione. Non credo che l'avrei trovato senza che tu mi indicassi readline (3) anche se prima lo sapevo, non riuscivo a stabilire la connessione.
Osirisgothra,

Cosa significa "avvolgere"? Vuoi dire avvolgere il tutto IN un \[, \]? Immagino di sì, ma non sembra funzionare per me.
Max Howell,

2
@osirisgothra: la documentazione parla in realtà di una cosa diversa - ha lo skip-csi-sequencescopo di sopprimere le sequenze di input generate da tasti speciali.
gravità

1
@MaxHowell devi avvolgere ogni \e[xxmsequenza, non l'intera stringa.
Enrico,

Grazie. Nel mio caso ho appena sostituito \e[39mcon \[\e[;39m\]e funziona benissimo
Herrgott

1

il suggerimento [e] ha funzionato su bash anche su OS X 10.8.2.

Io uso:

PS1 = "[\ e [0; 37m \ W \ $ (git branch 2> / dev / null | grep -e '*' | sed 's / ^ .. (. *) / {\ 1} /') \ $ \ e [m] "

che mi mostra il mio attuale ramo git in uso.


Conosci "__git_ps1"?
rafak,

Nopes. quale cosa magica farà?
stonefruit
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.