Sur la base des informations que j'ai trouvées ici, j'ai pu découvrir une solution plus simple pour aligner à droite tout en acceptant un contenu de longueur variable à droite ou à gauche, y compris le support de la couleur. Ajouté ici pour votre commodité ...
Note sur les couleurs: utiliser l' \033
évasion en faveur d'alternatives, sans \[\]
regroupements, s'avère le plus compatible et donc recommandé.
L'astuce consiste à écrire d'abord le côté droit, puis à utiliser le retour chariot ( \r
) pour revenir au début de la ligne et continuer à écraser le contenu du côté gauche en plus, comme suit:
prompt() {
PS1=$(printf "%*s\r%s\n\$ " "$(tput cols)" 'right' 'left')
}
PROMPT_COMMAND=prompt
J'utilise tput cols
sur Mac OS X pour récupérer la largeur du terminal / de la console terminfo
depuis que ma $COLUMNS
var n'est pas remplie env
mais vous pouvez remplacer la " *
" valeur remplaçable dans %*s
, en fournissant " ${COLUMNS}
", ou toute autre valeur que vous préférez, à la place.
L'exemple suivant utilise $RANDOM
pour générer un contenu de longueur différente comprend des couleurs et montre comment vous pouvez extraire des fonctions pour refactoriser l'implémentation en fonctions réutilisables.
function prompt_right() {
echo -e "\033[0;36m$(echo ${RANDOM})\033[0m"
}
function prompt_left() {
echo -e "\033[0;35m${RANDOM}\033[0m"
}
function prompt() {
compensate=11
PS1=$(printf "%*s\r%s\n\$ " "$(($(tput cols)+${compensate}))" "$(prompt_right)" "$(prompt_left)")
}
PROMPT_COMMAND=prompt
Étant donné printf
que la longueur de la chaîne est le nombre de caractères dont nous avons besoin pour compenser la quantité de caractères requise pour le rendu des couleurs, vous la trouverez toujours avant la fin de l'écran en raison des caractères ANSI non imprimés sans compensation. Les caractères requis pour la couleur restent constants et vous constaterez que printf prend également en compte le changement de longueur, tel que renvoyé par $RANDOM
exemple ', ce qui maintient notre bon alignement intact.
Ce n'est pas le cas avec des séquences d'échappement rapide bash spéciale (ie. \u
, \w
, \h
, \t
) Cependant, car ceux - ci n'enregistrera une longueur de 2 parce que bash ne les traduire lorsque l'invite est affiché, après printf a rendu la chaîne. Cela n'affecte pas le côté gauche, mais il vaut mieux les éviter à droite.
Cela n'a aucune conséquence si le contenu généré reste de longueur constante. Comme avec l' \t
option de temps qui rendra toujours le même nombre de caractères (8) pendant 24 fois. Il suffit de prendre en compte la compensation requise pour tenir compte de la différence entre 2 caractères comptés, ce qui donne 8 caractères lors de l'impression, dans ces cas.
Gardez à l'esprit que vous devrez peut-être triple échapper \\\
certaines séquences d'échappement qui, autrement, ont un sens pour les chaînes. Comme dans l'exemple suivant, l'échappement du répertoire de travail actuel \w
n'a aucune signification sinon il fonctionne comme prévu, mais l'heure \t
, ce qui signifie un caractère de tabulation, ne fonctionne pas comme prévu sans l'échapper triple au préalable.
function prompt_right() {
echo -e "\033[0;36m\\\t\033[0m"
}
function prompt_left() {
echo -e "\033[0;35m\w\033[0m"
}
function prompt() {
compensate=5
PS1=$(printf "%*s\r%s\n\$ " "$(($(tput cols)+${compensate}))" "$(prompt_right)" "$(prompt_left)")
}
PROMPT_COMMAND=prompt
nJoy!