Aller au contenu principal

Dépréciation du rprompt pour bash

· 4 min de lecture
Traduction Bêta Non Officielle

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 :

  1. lorsque la sortie de la commande précédente ne se terminait pas par un saut de ligne, le rprompt s'affichait sur la même ligne que la sortie de la commande précédente

  2. lorsque l'invite se trouvait en bas du tampon du terminal, le rprompt s'affichait sur la même ligne que l'invite, ce qui la corrompait

  3. Selon la plateforme, cela pouvait perturber la navigation dans l'historique des commandes

  4. Une logique différente était nécessaire pour les invites multilignes, car nous affichions avant PS1 et 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.