MISE À JOUR
J'ai mis en place mon implémentation ici avec les instructions d'installation :
https://github.com/dosentmatter/rainbow-bash-prompt
J'utilise l'implémentation en C de lolcat mais je l'ai modifiée un peu pour la rendre pseudo-aléatoire.
ANCIENNE RÉPONSE
Voici comment je l'ai fait. Ajoutez ceci à votre .bashrc
:
PS1_colorless=${PS1:-'\h:\W \u\$ '}
ESC=$(echo -e '\033')
SOH=$(echo -e '\001')
STX=$(echo -e '\002')
PS1_color_wrap='s/'$ESC'\\[[[:digit:];]*m/'$SOH'&'$STX'/g'
PS1="\$(lolcat -f <<< \"$PS1_colorless\" | sed '$PS1_color_wrap')"
Cela fonctionne en exécutant lolcat
dynamiquement sur $PS1_colorless
et en effectuant un sed
pour ajouter des caractères de contrôle afin que le retour à la ligne fonctionne correctement.
Cela prend un peu moins de 200 millisecondes pour s'exécuter. Donc cela pourrait être trop lent pour vous. Voici un exemple que j'ai chronométré :
![ruby lolcat time]()
J'ai choisi d'utiliser PS1
et non PROMPT_COMMAND
car je voulais pouvoir utiliser les séquences d'échappement de prompt bash telles que \h
, \W
, etc. ce qui ne serait pas possible avec PROMPT_COMMAND
car j'ai besoin de le passer à PS1
pour expansion avant d'exécuter lolcat
. Vous pouvez utiliser des alternatives comme ${HOSTNAME%%.*}
pour imiter le comportement de \h
mais je ne pense pas que vous puissiez le faire pour quelque chose comme
\# le numéro de commande de cette commande
Il utilise -f
pour forcer lolcat
à s'exécuter même si la sortie est dirigée vers sed
. Par défaut, lolcat
ne produit rien si la sortie n'est pas vers un tty.
Après avoir exécuté lolcat
, il effectue un sed
pour entourer la syntaxe de couleur ansi telle que ESC[38;5;184m
(ESC
est le caractère de contrôle \033
) avec les caractères de contrôle SOH
et STX
de sorte qu'il devienne SOHESC[38;5;184mSTX
. SOH
et STX
correspondent respectivement à \[
et \]
dans les caractères de contrôle du prompt bash. Je dois utiliser les caractères de contrôle SOH
et STX
au lieu de \[
et \]
car je génère des couleurs dynamiquement. \[
et \]
ne fonctionneraient pas car ils sont traduits en caractères de contrôle lorsque PS1
est d'abord analysé. \[
et \]
fonctionneraient si vous utilisiez PROMPT_COMMAND
pour générer la sortie pour PS1
mais alors je ne pourrais pas utiliser \u
et \W
car lolcat aurait été exécuté avant de passer \u
à PS1
pour expansion.
Pour référence : https://stackoverflow.com/questions/24839271/bash-ps1-line-wrap-issue-with-non-printing-characters-from-an-external-command
Les caractères entourés par SOH
et STX
sont traités comme des caractères non imprimables. Cela est nécessaire pour que le retour à la ligne fonctionne correctement et ne traite pas la couleur ansi comme des caractères visibles réels.
Si vous voulez utiliser des caractères de contrôle non imprimables littéraux, vous pouvez remplacer
cela
ESC=$(echo -e '\033')
SOH=$(echo -e '\001')
STX=$(echo -e '\002')
PS1_color_wrap='s/'$ESC'\\[[[:digit:];]*m/'$SOH'&'$STX'/g'
avec ceci
PS1_color_wrap='s/^[\\[[[:digit:];]*m/^A&^B/g'
Remarquez que les ^[
, ^A
et ^B
sont les caractères de contrôle littéraux donc vous ne pouvez pas les copier et coller. Vous devriez utiliser quelque chose comme vim pour les saisir
Dans vim :
^[
== Ctrl+vEsc ou Ctrl+vo033
^A
== Ctrl+vCtrl+a ou Ctrl+vo001
^B
== Ctrl+vCtrl+b ou Ctrl+vo002
MODIFICATION (un peu plus rapide en python) : La version python semble s'exécuter un peu plus rapidement :
![python lolcat time]()
Changez ces variables dans votre .bash_profile :
PS1_colorless=${PS1:-'\h:\W \u\$'}
PS1_newline="tr -d '\n'"
PS1_spacing=' '
PS1="\$(lolcat -F 6 -p 25 -f <<< \"$PS1_colorless\" | $PS1_newline | sed '$PS1_color_wrap')"
PS1+=$PS1_spacing
La version python a des sauts de ligne supplémentaires dans la sortie donc je les supprime avec le tr
. Il supprime également les espaces finaux donc j'ai enlevé les espaces finaux de PS1_colorless
et les ajoute de nouveau avec PS1_spacing
.
Vous pouvez l'obtenir ici : https://github.com/tehmaze/lolcat
Je mettrai à jour si j'arrive un jour à faire fonctionner le port C : https://github.com/jaseg/lolcat
Je n'ai pas réussi à le construire sur mac os. Si quelqu'un arrive à le faire fonctionner sur linux ou mac os, merci de me le faire savoir.