Le linee lunghe si sovrappongono nel prompt personalizzato di Bash PS1


13

Ho configurato un PS1prompt bash a due righe , con nome del server, ora, nome utente e altre variabili utili.

PS1="\n\[\033[1;34m\]\342\226\210\342\226\210 \u @ $SERVER_NAME""$BBlue"" \w""$Color_Off  \n\[\033[0;36m\]\342\226\210\342\226\210 \d \t $ \[\033[0;39m\]"

inserisci qui la descrizione dell'immagine

Fonte Github completa qui .

Il problema è che le linee lunghe sono spesso avvolte attorno a se stesse, il che significa che la nuova linea si sovrappone alla precedente.

Il problema è incoerente: alcune linee sono avvolte correttamente, altre no.

Qualche idea su come risolvere questo problema?

Risposte:


16

Ecco la mia fantasia PS1 a due righe per il prompt di bash.

PS1

\[\e[1;32m\]\H\[\e[0m\] :: \[\e[1;30m\]\d\[\e[0m\] \@ :: \[\e[1;33m\]\w\n\[\e[1;34m\]\u $ \[\033[0m\]

Quindi ecco cosa ho fatto. Se questo fosse il mio colore:

\e[1;32m

L'ho cambiato in:

\[\e[1;32m\]

In sostanza è necessario racchiuderlo in:

\[$mycolor\]

Dai un'occhiata a questa risposta .


+1 Grazie. Stranamente, non sembra funzionare su Mac.
Adam Matan,

Sei un salvavita! Per quanto riguarda Mac, Adam .. È molto probabilmente dovuto al conteggio delle colonne. Prova a impostare il prompt solo su una stringa di caratteri, ad esempio "questo è il mio prompt:" e verifica se il problema persiste. In tal caso, l'impostazione della colonna sul terminale è troppo ampia o troppo stretta.
Alex Summers,

7

Ho trovato questa soluzione online, che ha suggerito una parentesi di chiusura per colorare le variabili:

Cambia questo:

Black='\e[0;30m'        # Black
Red='\e[0;31m'          # Red
Green='\e[0;32m'        # Green

per:

Black='\e[0;30m\]'        # Black
Red='\e[0;31m\]'          # Red
Green='\e[0;32m\]'        # Green

Ho commesso il cambiamento - spero che funzioni come previsto.


1
non sono sicuro di ciò che dovrebbe raggiungere. Devi avvolgere qualsiasi cosa che non occupi spazio ( \[ \]ansi-escape ) , quindi non puoi semplicemente terminare tutti i colori di ansi-escape \]perché perché se non ci fosse \[. Quando stai inserendo caratteri non stampabili, dovresti semplicemente avvolgerli \[ \](ad es PS1='\[\e[32;1m\] green prompt \[\e[0m\] $'.).
dylnmc,

Infatti! Senza l'apertura \ [, questo promuove il prompt per noi utenti Linux. Forse è diverso per OSX? Che strano. \ [e \ e [sono interpretati come due cose diverse per Linux. Il primo indica di bash che la sequenza che segue non è stampabile e di non contarla come parte dei caratteri visualizzati del prompt. La \ e [è la parentesi di escape per avviare una combinazione di colori ANSI.
Alex Summers,

0

La mia soluzione preferita al problema della sovrapposizione di long line in bash PS1 è quella di avere un \n (e) riga (e) di prompt alla fine di PS1.

per esempio

inserisci qui la descrizione dell'immagine

Se vuoi tutte le altre cose - tempo, utente, host, directory e ramo git (!) Puoi usare questo (mac o linux):

/unix//a/124012/10043


per git branch dovresti usare if [[ $(git rev-parse --is-inside-git-dir 2> /dev/null) ]]; then branch="$( git symbolic-ref --short -q HEAD 2> /dev/null )"; fi. Questo è uno standard quando si inserisce git in uno script e si valuta il nome del ramo da quello che ho letto in precedenza.
dylnmc,
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.