Dépréciation du rprompt pour bash
Cette page a été traduite par PageTurner AI (bêta). Non approuvée officiellement par le projet. Vous avez trouvé une erreur ? Signaler un problème →
Après mûre réflexion, nous avons décidé de supprimer la prise en charge du rprompt dans bash. Si vous souhaitez
comprendre les raisons de cette décision, poursuivez votre lecture.
Contexte
Le rprompt est une fonctionnalité permettant d'afficher une invite à droite du terminal, sur
la même ligne que votre curseur. Bien que native sur de nombreux shells, cette fonctionnalité n'existe pas dans bash.
Pour contourner cette limitation, Oh My Posh utilise une implémentation personnalisée pour bash et PowerShell.
Historique
Première implémentation
Oh My Posh a connu deux évolutions du rprompt personnalisé pour bash. La première version affichait le rprompt
avec l'invite principale dans la variable PS1, nécessitant un seul appel CLI pour visualiser l'invite.
Le défi est que, puisque le rprompt s'affiche avec l'invite principale, nous devons garantir
que readline de bash puisse interpréter correctement l'invite. Dans bash, tout caractère non imprimable,
comme les codes couleur, doit être encadré par \[ et \]. Ceci est nécessaire pour que bash puisse
calculer la longueur de l'invite et finalement positionner correctement le curseur.
Il s'est avéré que pour le rprompt, cela devait être fait différemment. Le rprompt est affiché
après ce que bash interprète comme la fin de l'invite. Nous avons découvert qu'il fallait encadrer l'intégralité du rprompt
avec \[ et \], sans échapper individuellement les caractères non imprimables.
Nous avons utilisé cette approche un temps, mais elle s'est révélée peu robuste. Il était facile de compromettre le calcul de position du curseur par readline, et le débogage était difficile. Ce comportement variait aussi selon les plateformes, nous obligeant à repenser notre solution.
Deuxième implémentation
La deuxième implémentation du rprompt était beaucoup plus robuste. Nous avons décidé d'afficher le rprompt
via un appel CLI séparé pour mieux contrôler la sortie. Cette approche exploitait la variable PROMPT_COMMAND
de bash, un hook exécuté avant l'affichage de l'invite. Nous affichions d'abord le
rprompt dans la PROMPT_COMMAND,
puis définissions l'invite principale dans la variable PS1 afin que bash ignore la présence du rprompt.
Cette approche était plus propre architecturalement, mais présentait ses propres défis. Le plus évident était la nécessité de deux appels CLI pour afficher l'invite, ce qui ralentissait légèrement le rendu.
De plus, comme l'affichage se produisait avant l'évaluation de PS1, nous avons observé les problèmes suivants :
-
lorsque la sortie de la commande précédente ne se terminait pas par un saut de ligne, le
rprompts'affichait sur la même ligne que la sortie de la commande précédente -
lorsque l'invite se trouvait en bas du tampon du terminal, le
rprompts'affichait sur la même ligne que l'invite, ce qui la corrompait -
Selon la plateforme, cela pouvait perturber la navigation dans l'historique des commandes
-
Une logique différente était nécessaire pour les invites multilignes, car nous affichions avant
PS1et devions repositionner le curseur
Parmi ces problèmes, seul le point 4 pouvait être résolu. Les autres échappaient totalement à notre contrôle.
Conclusion
Oh My Posh est un outil qui doit être facile à utiliser, à maintenir et être fiable à 100%. L'un des principes fondamentaux d'
Oh My Posh est qu'il ne devrait jamais corrompre le shell. La fonctionnalité rprompt dans bash n'a jamais été suffisamment fiable
et elle était difficile à déboguer en cas de problème.
J'ai passé d'innombrables heures à déboguer des problèmes avec le rprompt dans bash, mais il est temps de passer à autre chose. Si vous
souhaitez utiliser la fonctionnalité rprompt, je vous recommande d'utiliser un shell qui la prend en charge nativement, comme
nushell, zsh ou fish.
Qu'en est-il de PowerShell ?
Le rprompt dans PowerShell est parfaitement fiable, même sans support natif. PowerShell ne rencontre pas
les mêmes difficultés que bash pour calculer la largeur de l'invite, et aucun échappement n'est nécessaire.
Nous pouvons utiliser la première implémentation mentionnée, qui fonctionne parfaitement.