Estoy seguro de que he visto a alguien alinear una parte de su mensaje a la derecha en su ventana de terminal y luego hacer que el cursor real comience en una segunda línea. Sé que puedo lograr la segunda línea con un "\ n" en la PS1, pero no puedo entender cómo alinear parte de ella a la derecha. ¿Lo que vi fue solo un espacio en blanco agregado entre las dos cadenas?
bash
command-line
ps1
Felix Andersen
fuente
fuente
.inputrc
es asíset show-mode-in-prompt on
. Ambos no calculan la longitud de los códigos ANSI CSI no prinables , y no los encierran correctamente\[
y\]
como lo menciona @Mu Mind. Ver esta respuesta para una resolución.Con base en la información que encontré aquí, pude descubrir una solución más simple para alinear a la derecha mientras acomodaba contenido de longitud variable a la derecha o izquierda, incluido el soporte para el color. Agregado aquí para su conveniencia ...
Nota sobre los colores: usar el
\033
escape en favor de alternativas, sin\[\]
agrupaciones, resulta más compatible y por lo tanto recomendado.El truco es escribir primero el lado derecho, luego usar el retorno de carro (
\r
) para volver al inicio de la línea y continuar sobrescribiendo el contenido del lado izquierdo encima de eso, de la siguiente manera:Estoy usando
tput cols
Mac OS X para recuperar el ancho de terminal / consolaterminfo
ya que mi$COLUMNS
var no está incluidaenv
pero puede sustituir el "*
" valor reemplazable%*s
, proporcionando "${COLUMNS}
", o cualquier otro valor que prefiera.El siguiente ejemplo se utiliza
$RANDOM
para generar contenido de diferente longitud que incluye colores y muestra cómo puede extraer funciones para refactorizar la implementación a funciones reutilizables.Dado que
printf
supone que la longitud de la cadena es el número de caracteres que necesitamos para compensar la cantidad de caracteres necesarios para representar los colores, siempre se encontrará cerca del final de la pantalla debido a los caracteres ANSI no impresos sin compensación. Los caracteres requeridos para el color permanecen constantes y encontrará que también printf tiene en cuenta el cambio de longitud, tal como lo devuelve por$RANDOM
ejemplo ', que mantiene intacta nuestra alineación correcta.Este no es el caso con las secuencias de escape pronta especial de bash (es decir.
\u
,\w
,\h
,\t
), Sin embargo, ya que éstas sólo registrará una longitud de 2 a causa fiesta sólo se traducirá ellos cuando aparece el indicador, después de printf ha hecho que la cadena. Esto no afecta el lado izquierdo, pero es mejor evitarlos a la derecha.Sin embargo, no tiene consecuencias si el contenido generado permanecerá en una longitud constante. Al igual que con la
\t
opción de tiempo que siempre representará la misma cantidad de caracteres (8) durante 24 veces. Solo necesitamos tener en cuenta la compensación requerida para dar cabida a la diferencia entre 2 caracteres contados, lo que resulta en 8 caracteres cuando se imprime, en estos casos.Tenga en cuenta que es posible que deba escapar tres veces de
\\\
algunas secuencias de escape que, de lo contrario, tienen significado para las cadenas. Al igual que con el siguiente ejemplo, el escape del directorio de trabajo actual\w
no tiene ningún significado, por lo que funciona como se esperaba, pero el tiempo\t
, lo que significa un carácter de tabulación, no funciona como se espera sin que se escape primero primero.nJoy!
fuente
Usar
printf
con$COLUMNS
funcionó muy bien, algo como:Lo justificó perfectamente para mí.
fuente
Lo siguiente pondrá la fecha y hora actual en ROJO en el RHS de la terminal.
Ventajas:
shellcheck
limpiar..inputrc
tieneset show-mode-in-prompt on
.\[
y,\]
por lo tanto, la edición del texto ingresado en la solicitud no hace que la solicitud se vuelva a imprimir de manera extraña.Nota : Usted necesita asegurarse de que ninguna de las secuencias de color en el
$PS1
antes de este código es exeucted están debidamente encerrados en\[
y\]
, y que no hay anidación de ellos.fuente
bash: local: can only be used in a function
, que es trivial de arreglar, y después de eso, no muestra nada porqueCOLUMNS
no está definido: tiene que ser sustituido por$(tput cols)
. mismo resultado si el fragmento se guarda en un archivo diferente y luego se obtiene.bashrc
.tput cols
si no$COLUMNS
está configurado. Y sí, este código debe estar dentro de una función. Yo usoPROMPT_COMMAND='_prompt_bash_set'
y nombro la función_prompt_bash_set
.Solo pensé en tirar el mío aquí. Es casi exactamente lo mismo que el indicador GRML zsh (excepto que las actualizaciones de zsh es un poco mejor en nuevas líneas y espacios posteriores, lo cual es imposible de replicar en bash ... bueno, muy difícil en este momento, al menos).
Pasé unos buenos tres días en esto (solo probé en una computadora portátil con arco), así que aquí hay una captura de pantalla y luego las cosas que van en mi ~ / .bashrc :)
advertencia : es un poco loco
importante aparte : cada
^[
(como^[[34m
) es realmente el personaje de escape(char)27
. La única forma en que sé cómo insertar esto es ingresar ctrl+ ( [v) (es decir, presionar ambos [y vmientras ctrlse mantiene presionado.Todavía estoy trabajando para hacer que los colores sean configurables, pero estoy contento con los colores como están ahora.
Actualmente trabajando en una solución para el
^[
personaje loco y el cambio de color fácil :)fuente
Puede usar
printf
para hacer la alineación correcta:fuente
Agregando la respuesta de Giles, escribí algo para manejar mejor los colores (siempre que estén encerrados correctamente
\[
y\]
. Es caso por caso y no maneja todos los casos, pero me permite configurar mi PS1L en la misma sintaxis que PS1 y usa la fecha (sin color) como PS1R.Aquí está en github: dbarnett / dotfiles / right_prompt.sh . Lo uso en mi .bashrc así:
Nota: También agregué una nueva línea después de PS1R, lo que no hace ninguna diferencia visual, pero parece evitar que el mensaje se vuelva confuso si se desplaza hacia atrás a través de ciertos comandos en su historial de comandos.
Estoy seguro de que alguien más puede mejorar esto y tal vez generalizar algunos de los casos especiales.
fuente
Aquí hay una solución basada en
PROMPT_COMMAND
ytput
:La magia es realizada por:
Que se desglosa por:
En PS1,
tput
se escapa con \ [\] para que no se cuente en la longitud mostrada.fuente