Direct naar hoofdinhoud

Afschaffing van de bash rprompt

· 4 minuten leestijd
Onofficiële Beta-vertaling

Deze pagina is vertaald door PageTurner AI (beta). Niet officieel goedgekeurd door het project. Een fout gevonden? Probleem melden →

Na zorgvuldige afweging is besloten ondersteuning voor de rprompt in bash te verwijderen. Als je benieuwd bent naar de achterliggende redenen, lees dan vooral verder.

Context​

rprompt is een functie waarmee je een prompt aan de rechterkant van de terminal kunt weergeven, op dezelfde regel als je cursor. Deze functie is standaard beschikbaar in veel shells, maar niet in bash. Om deze beperking te omzeilen, heeft Oh My Posh een aangepaste implementatie die we voor zowel bash als PowerShell gebruiken.

Geschiedenis​

Eerste implementatie​

Er waren twee evoluties van de aangepaste rprompt voor bash in Oh My Posh. De eerste drukte de rprompt samen met de primaire prompt in de PS1-variabele af, zodat we maar één CLI-aanroep nodig hadden om de prompt te tonen.

De uitdaging is dat, omdat de rprompt samen met de primaire prompt wordt afgedrukt, we er zeker van moeten zijn dat bash' readline de prompt correct kan interpreteren. In bash moet elk karakter dat geen afdrukbaar karakter is, zoals kleurcodes, worden ingepakt in \[ en \]. Dit is nodig om ervoor te zorgen dat bash de lengte van de prompt kan berekenen en uiteindelijk de cursor correct kan positioneren.

Het bleek dat voor rprompt dit anders aangepakt moest worden. De rprompt wordt afgedrukt na wat bash interpreteert als het einde van de prompt. We ontdekten dat we de hele rprompt moeten omwikkelen met \[ en \], in plaats van individuele niet-afdrukbare karakters te escapen.

We hebben dit een tijdje gedaan, maar deze aanpak bleek niet erg robuust. Het was gemakkelijk om readline's cursorpositieberekening te verstoren, en het was moeilijk om te debuggen. Het gedrag verschilde ook per platform, dus moesten we terug naar de tekentafel.

Tweede implementatie​

De tweede implementatie van de rprompt was veel robuuster. We besloten de rprompt af te drukken via een aparte CLI-aanroep, zodat we de uitvoer beter konden beheersen. Dit maakte gebruik van de PROMPT_COMMAND variabele in bash, een hook die wordt uitgevoerd vóór het afdrukken van de prompt. Eerst drukten we de rprompt af in de PROMPT_COMMAND, en stelden daarna de primaire prompt in via de PS1-variabele, zodat bash zich niet druk maakte om de aanwezigheid van de rprompt.

Deze aanpak was architectonisch veel eleganter, maar kende ook zijn eigen uitdagingen. De meest voor de hand liggende was dat twee CLI-aanroepen nodig waren om de prompt af te drukken, waardoor het renderen iets trager was dan bij de eerste implementatie.

Bovendien merkten we door het afdrukken vóór de evaluatie van PS1 de volgende problemen op:

  1. wanneer de uitvoer van het vorige commando niet eindigde met een nieuwe regel, werd de rprompt afgedrukt op de zelfde regel als de uitvoer van het vorige commando

  2. wanneer de prompt zich onderaan de terminalbuffer bevond, werd de rprompt afgedrukt op dezelfde regel als de prompt, waardoor de prompt kapot ging

  3. afhankelijk van het platform verbrak het nog steeds commando-historieknavigatie

  4. het vereiste andere logica voor meerregelige prompts omdat we vóór PS1 afdrukken en de cursor correct moeten herpositioneren

Van deze problemen kon alleen punt 4 worden opgelost. Alles andere lag buiten onze controle.

Conclusie​

Oh My Posh is een tool die eenvoudig te gebruiken, te onderhouden en 100% betrouwbaar moet zijn. Een van de kernprincipes van Oh My Posh is dat het de shell nooit kapot mag maken. De rprompt-functie in bash is nooit betrouwbaar genoeg geweest, en het was moeilijk te debuggen wanneer het misging. Ik heb talloze uren besteed aan het debuggen van problemen met de rprompt in bash, maar het is tijd om verder te gaan. Als je de rprompt-functie wilt gebruiken, raad ik aan een shell te gebruiken die deze native ondersteunt, zoals nushell, zsh of fish.

En PowerShell?​

De rprompt-functie in PowerShell is 100% betrouwbaar, zelfs zonder native ondersteuning. PowerShell heeft niet dezelfde problemen met het berekenen van de daadwerkelijke promptbreedte als bash, en er hoeft niets te worden geëscaped. We kunnen de eerste implementatie gebruiken die hierboven is beschreven, en die werkt perfect.