Descontinuando el rprompt de bash
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:
-
Cuando la salida del comando anterior no terminaba con nueva lÃnea, el
rpromptse imprimÃa en la misma lÃnea que dicha salida -
Cuando el prompt estaba al final del búfer del terminal, el
rpromptse imprimÃa en la misma lÃnea que el prompt, lo que lo rompÃa -
Dependiendo de la plataforma, aún interferÃa con la navegación del historial de comandos.
-
RequerÃa lógica diferente para prompts multilÃnea, al imprimir antes de
PS1y 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.