Je suis sûr que j'ai vu quelqu'un avoir une partie de son invite alignée à droite dans sa fenêtre de terminal, puis que le curseur réel démarre sur une deuxième ligne. Je sais que je peux atteindre la deuxième ligne avec un "\ n" dans la PS1, mais je ne sais pas comment aligner une partie de celle-ci vers la droite. Est-ce que j'ai vu juste un espace ajouté entre les deux chaînes?
la source
.inputrc
aset show-mode-in-prompt on
. Les deux ne calculent pas la longueur des codes ANSI CSI non imprimables et ne les enferment pas correctement dans\[
et\]
comme mentionné par @Mu Mind. Voir cette réponse pour une résolution.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:J'utilise
tput cols
sur Mac OS X pour récupérer la largeur du terminal / de la consoleterminfo
depuis que ma$COLUMNS
var n'est pas remplieenv
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.É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.nJoy!
la source
L'utilisation
printf
avec$COLUMNS
a très bien fonctionné, quelque chose comme:Cela me le justifiait parfaitement.
la source
Ce qui suit mettra la date et l'heure actuelles en ROUGE sur la RHS du terminal.
Avantages:
shellcheck
nettoyer..inputrc
aset show-mode-in-prompt on
.\[
et\]
afin que la modification du texte saisi à l'invite n'entraîne pas une réimpression étrange de l'invite.Note : Vous devez vous assurer que toutes les séquences de couleurs dans le
$PS1
avant ce code est exeucted sont correctement enfermés dans\[
et\]
et qu'il n'y a pas d' imbrication d'entre eux.la source
bash: local: can only be used in a function
, ce qui est trivial à corriger, et après cela, il ne montre rien car ilCOLUMNS
n'est pas défini: il doit être remplacé par$(tput cols)
. même résultat si l'extrait est enregistré dans un fichier différent, puis extrait.bashrc
.tput cols
s'il$COLUMNS
n'est pas défini. Et oui, ce code devrait être à l'intérieur d'une fonction. J'utilisePROMPT_COMMAND='_prompt_bash_set'
et nomme la fonction_prompt_bash_set
.Je pensais juste que je jetterais le mien ici. C'est presque exactement la même chose que l'invite zsh GRML (sauf les mises à jour zsh, elle est un peu meilleure sur les nouvelles lignes et les espaces arrière - ce qui est impossible à répliquer dans bash ... enfin très difficile à ce stade, au moins).
J'ai passé trois bons jours à ce sujet (testé uniquement sur un ordinateur portable exécutant une arche), voici donc une capture d'écran, puis le contenu de mon ~ / .bashrc :)
avertissement - c'est un peu fou
important côté - chaque
^[
(comme^[[34m
) est vraiment le personnage d'échappement(char)27
. La seule façon dont je sais comment insérer ceci est d'entrer ctrl+ ( [v) (c'est-à [- dire d'appuyer sur les deux et vpendant que la touche ctrlest maintenue enfoncée.Je travaille toujours à rendre les couleurs configurables, mais je suis satisfait des couleurs telles qu'elles sont maintenant.
Travaille actuellement sur un correctif pour le
^[
personnage fou et le changement de couleur facile :)la source
Vous pouvez utiliser
printf
pour faire un bon alignement:la source
En ajoutant la réponse de Giles, j'ai écrit quelque chose pour mieux gérer les couleurs (à condition qu'elles soient correctement enfermées dans
\[
et\]
. C'est au cas par cas et ne gère pas tous les cas, mais cela me permet de définir ma PS1L dans la même syntaxe que la PS1 et utilise la date (non colorée) comme PS1R.Le voici sur github: dbarnett / dotfiles / right_prompt.sh . Je l'utilise dans mon .bashrc comme ceci:
Remarque: J'ai également ajouté une nouvelle ligne après PS1R, ce qui ne fait aucune différence visuelle, mais semble empêcher l'invite de se brouiller si vous faites défiler certaines commandes dans votre historique de commandes.
Je suis sûr que quelqu'un d'autre peut améliorer cela, et peut-être généraliser une partie de la casse spéciale.
la source
Voici une solution basée sur
PROMPT_COMMAND
ettput
:La magie est réalisée par:
Qui se décompose par:
Dans PS1,
tput
est échappé avec \ [\] afin qu'il ne soit pas compté dans la longueur affichée.la source