Comment réparer mon invite bash avec de longues lignes?

3

J'ai l'invite suivante bash:

YELLOW="\[\033[0;33m\]"
GREEN="\[\033[0;32m\]"
RESET='\e[0m'

export PS1="$GREEN[\W]$YELLOW \$(__git_ps1 \"(%s) \")$RESET\\$ "

Cela ressemble à ceci:

entrez la description de l'image ici

C'est ce que je veux. Cependant, lorsque j'entre une longue ligne, la ligne n'est pas cassée du tout, mais la ligne actuelle est écrasée à partir du début de la ligne. Lorsque cela se produit et que je frappe en arrière, tout ce qui se trouve dans cette ligne disparaîtra. Comment puis-je réparer cela?

Tamás Szelei
la source

Réponses:

3

Vous avez oublié d’envelopper la valeur de $RESET.

RESET = ' \ [ \ e [0m \] '

Bash doit savoir combien de temps le message-guide est affiché pour que le retour à la ligne fonctionne correctement, et tout ce qui n'est pas compris entre \[et \]est compté.

Grawity
la source
Il ne s'agit pas de la longueur de l'invite, mais de la liste des paramètres de séquence d'échappement. Vous pouvez en ajouter plusieurs, par exemple pour rendre le texte en gras, inversé, souligné, etc.
Rajish
@ Rajish: D'accord, et pourquoi cela ferait-il une pause dans le retour à la ligne?
Grawity
@grawity Les caractères d' échappement \[et \]délimitent une séquence de caractères non imprimables. Les laisser tomber briserait probablement certains comportements terminaux ou certaines règles d'analyse syntaxique internes. gnu.org/s/bash/manual/bash.html#Printing-a-Prompt
Rajish
@ Rajish: C'est exactement ce que ma réponse dit. Les laisser tomber briserait les "règles" internes de calcul de longueur-invite-longueur.
Grawity
2

Plus portable en utilisant tput:

fgred="$(tput setaf 1)"
fggreen="$(tput setaf 2)"
fgyellow="$(tput setaf 3)"
fgblue="$(tput setaf 4)"
fgpurple="$(tput setaf 5)"
fgcyan="$(tput setaf 6)"
fgwhite="$(tput setaf 7)"

bgred="$(tput setab 1)"
bggreen="$(tput setab 2)"
bgyellow="$(tput setab 3)"
bgblue="$(tput setab 4)"
bgpurple="$(tput setab 5)"
bgcyan="$(tput setab 6)"
bgwhite="$(tput setab 7)"

bold="$(tput bold)"
underline="$(tput smul)"
reset="$(tput sgr0)"

export PS1="${fggreen}[\W]${fgyellow} \$(__git_ps1 \"(%s) \")${reset}\\$ "
Benoit
la source
Sensationnel. Je n'ai jamais entendu parler de tput auparavant. Merci!
Tamás Szelei
C'est bon, mais je n'ai jamais vu de terminal [émulateur] non compatible avec VT220 actuellement utilisé. En outre, notant le manque de \[ \].
Grawity
@grawity: L’autre avantage de tput est que vous savez quoi chercher dans le manuel si vous ne comprenez pas ce que fait le script.
Benoit