¿Por qué ZSH termina una línea con un símbolo de porcentaje resaltado?

46

He notado esto en ocasiones con una variedad de aplicaciones. A menudo pensé que era porque la salida se canceló antes (ctrl + c, por ejemplo) o algo similar, y zsh está completando un nuevo carácter de línea. Pero ahora la curiosidad se ha apoderado de mí, ya que no parece hacer esto de manera contundente.

zsh

zsh

golpetazo

ingrese la descripción de la imagen aquí

El Sequenceprograma es algo que extraje de un libro mientras leía las certificaciones de Java y solo quería ver si se compilaba y ejecutaba. Me di cuenta de que no usa el println()método del System.outpaquete / clase. En su lugar, usa simplemente viejo print().

¿Es la falta de un nuevo carácter de línea la razón por la que obtengo este símbolo?

jktravis
fuente

Respuestas:

57

Sí, esto sucede porque es una "línea parcial". Y por defecto, zsh pasa a la siguiente línea para evitar cubrirlo con la solicitud .

Cuando se conserva una línea parcial, de forma predeterminada verá un carácter inverso + negrita al final de la línea parcial: un "%" para un usuario normal o un "#" para root. Si se establece, el parámetro de shell PROMPT_EOL_MARK se puede usar para personalizar cómo se muestra el final de las líneas parciales.

Leiaz
fuente
3
Para probar hacer esto: print -n "this is a test"entoncesprint "this is a test"
SergioAraujo
55
Ahora lo puse PROMPT_EOL_MARK=''en mi .zshrc para ocultar la diferencia entre la nueva línea final o no en la salida del comando.
geekQ
14

Esa es una característica específica de zsh(y ahora fishtambién) que le permite ver claramente las líneas no terminadas en la salida de un comando.

En los shells tradicionales, si un comando emite algunos datos después del último carácter de nueva línea o, en otras palabras, si deja el cursor terminal no al comienzo de la línea, el siguiente mensaje del shell termina agregado a esa última línea no terminada como en:

bash-4.4$ printf XXX
XXXbash-4.4$

Eso estropea el aviso, y es fácil pasar por alto eso XXX, especialmente si tienes un aviso más elegante como ese. También afecta la posición del cursor, lo que provoca problemas de visualización cuando mueve el cursor.

zshevita eso, al mostrar que la salida tiene una línea sin terminar con un %carácter en negrita y video inverso, y emite el siguiente mensaje al comienzo de la siguiente línea:

zsh-5.1.1$ printf XXX
XXX%
zsh-5.1.1$

Lo hace al emitir ese video inverso %al final de cada comando (antes de cada solicitud), pero seguido de 79 espacios (suponiendo un terminal de 80 caracteres de ancho), un carácter CR (el que hace que el cursor regrese al primero columna) y la secuencia para borrar hasta el final de la línea (y luego la solicitud).

De esa manera, si hubiera una línea sin terminar, ya que el cursor no está en la primera posición, esos 80 caracteres harán que el cursor se mueva a la siguiente línea (y eso %permanecerá). Si no, entonces eso %y esos 79 espacios estarán en una línea que se eliminará después.

Ahora, eso solo funciona si el terminal hace líneas de ajuste (por ejemplo, eso no funcionará correctamente después tput rmam). Si tiene un terminal lento (como en la línea serie de 9600 baudios), es posible que vea los que %se muestran y luego se eliminan después de cada comando, por lo que le zshpermite deshabilitar esa función:

unsetopt prompt_cr prompt_sp

De esa manera, se zshcomporta más como conchas tradicionales.

También puede cambiar esa marca con la $PROMPT_EOL_MARKvariable.

Stéphane Chazelas
fuente