Saltar al contenido principal

Descontinuando el rprompt de bash

· 4 min de lectura
Traducción Beta No Oficial

Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →

Tras una cuidadosa evaluación, hemos decidido eliminar la compatibilidad con rprompt en bash. Si te interesa conocer las razones detrás de esta decisión, continúa leyendo.

Contexto​

rprompt es una función que permite mostrar un prompt en el lado derecho del terminal, en la misma línea que tu cursor. Esta característica está disponible de forma nativa en muchos shells, pero no en bash. Para sortear esta limitación, Oh My Posh implementó una solución personalizada que utilizamos tanto para bash como para PowerShell.

Historia​

Primera implementación​

Existieron dos evoluciones del rprompt personalizado para bash en Oh My Posh. La primera imprimía el rprompt junto con el prompt principal en la variable PS1, requiriendo solo una llamada CLI para visualizar el prompt completo.

El desafío es que, dado que el rprompt se imprime junto con el prompt principal, debemos asegurarnos de que readline de bash pueda interpretar el prompt correctamente. En bash, cada carácter que no es imprimible, como códigos de color, debe envolverse entre \[ y \]. Esto es necesario para que bash pueda calcular la longitud del prompt y finalmente posicionar el cursor correctamente.

Resultó que para rprompt, esto debía hacerse de manera diferente. El rprompt se imprime después de lo que bash interpreta como el final del prompt. Descubrimos que necesitamos envolver todo el rprompt entre \[ y \], sin escapar caracteres no imprimibles individualmente.

Implementamos esto durante un tiempo, pero este enfoque resultó poco robusto. Era fácil alterar el cálculo de posición del cursor en readline, y complicado depurar. Además, el comportamiento variaba entre plataformas, lo que nos obligó a replantear la solución.

Segunda implementación​

La segunda implementación del rprompt fue mucho más robusta. Decidimos imprimir el rprompt en una llamada CLI separada para controlar mejor la salida. Aprovechamos la variable PROMPT_COMMAND de bash, un gancho que se ejecuta antes de imprimir el prompt. Primero imprimíamos el rprompt en PROMPT_COMMAND, y luego establecíamos el prompt principal en la variable PS1 para que bash ignorara el rprompt.

Este enfoque fue más limpio arquitectónicamente, pero presentó sus propios desafíos. El más evidente fue requerir dos llamadas CLI para imprimir el prompt, haciendo el renderizado más lento que en la primera implementación.

Adicionalmente, al imprimir antes de evaluar PS1, observamos estos problemas:

  1. Cuando la salida del comando anterior no terminaba con nueva línea, el rprompt se imprimía en la misma línea que dicha salida

  2. Cuando el prompt estaba al final del búfer del terminal, el rprompt se imprimía en la misma línea que el prompt, lo que lo rompía

  3. Dependiendo de la plataforma, aún interfería con la navegación del historial de comandos.

  4. Requería lógica diferente para prompts multilínea, al imprimir antes de PS1 y necesitar reubicar el cursor correctamente.

De estos problemas, solo el punto 4 se pudo solucionar. Todo lo demás estaba fuera de nuestro control.

Conclusión​

Oh My Posh debe ser fácil de usar, mantener y 100% confiable. Un principio fundamental es que nunca debe romper el shell. La función rprompt en bash nunca fue lo suficientemente fiable y resultaba difícil depurar cuando fallaba. Invertí incontables horas depurando problemas con rprompt en bash, pero es hora de avanzar. Si deseas usar rprompt, recomiendo shells con soporte nativo como nushell, zsh o fish.

¿Y qué pasa con PowerShell?​

La función rprompt en PowerShell es 100% confiable, aunque no tenga soporte nativo. PowerShell no tiene los mismos desafíos para calcular el ancho del prompt como bash, no hay necesidad de escapar nada. Podemos usar la primera implementación mencionada anteriormente, y funciona a la perfección.