Comment personnaliser PS1 correctement?

J'ai personnalisé mon bash avec ceci dans mon bashrc

export PS1="\e[0;36m\h\e[m \e[0;33m\w/\e[m \e[0;31m\n\$ →\e[m " 

Donc, je reçois quelque chose comme ça (avec des colors):

 Ahuri ~/Public/ $ → 

Mais j'ai des problèmes avec les longues commands. Quand j'écris une command très longue qui est plus longue qu'une ligne, elle commence à écraser ma première ligne

Exemple :

 Ahuri ~/Public/ $ → ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

Si je continue à append "^" je reçois:

 Ahuri ~/Public/ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

mon "$ →" est écrasé, puis toute la ligne est écrasée.

Il n'y a aucun problème avec le \n . C'est encore l'ancien problème de longueur de séquence d'échappement: \e[0m et similaire ne consortingbuent pas à la longueur réelle de l'invite, donc vous devez les inclure dans \[ .. \] pour l'indiquer à l'interpréteur:

 PS1="\[\e[0;36m\]\h\[\e[m\] \[\e[0;33m\]\w/\[\e[m\]\n \[\e[0;31m\]\$ →\[\e[m\] " 

Utilisez $PROMPT_COMMAND pour afficher la ligne supplémentaire afin que vous n'ayez pas \n dans $PS1 .

Une option plus simple consiste à utiliser les séquences tput :

 export PS1='\[$(tput setaf 4)\]\h\[$(tput sgr0)\] \[$(tput setaf 3)\]\w/\[$(tput sgr0)\]\n\[$(tput setaf 1)\]\$ →\[$(tput sgr0)\] '