Eliminar el espacio inútil al final del indicador derecho de zsh ($ RPROMPT)

18

En zsh, siempre hay un carácter de espacio a la derecha de mi indicador derecho. Intenté con un .zshrc muy simple como:

PROMPT="#"
RPROMPT="*"

Siempre hay un espacio después del * a la derecha de la pantalla.

Aquí hay una captura de pantalla que muestra el problema (seleccioné el espacio en una de las líneas). http://i.imgur.com/cnfa2eJ.png

Gracias.

Frozax
fuente

Respuestas:

20

TL; DR

Todo lo que necesita hacer es poner esto en su ~/.zshrc(o en el mismo archivo que su tema de solicitud):

ZLE_RPROMPT_INDENT=0

Detalles

En las versiones de ZSH que conducen a 5.0.2, un valor en el código fuente C de ZSH llamado rprompt_off(que establece el desplazamiento del margen derecho) estaba codificado 1.

Pero en la versión 5.0.5 los desarrolladores agregaron la capacidad de anular este valor predeterminado configurando la ZLE_RPROMPT_INDENTvariable de entorno.

La razón de este "guión" se debe a que algunos terminales más antiguos comenzarían a desplazarse si la última celda de la pantalla tuviera un carácter.

Para versiones de ZSH anteriores a 5.0.5

Si tiene una versión anterior de ZSH y no puede actualizar, aún puede deshacerse de ese espacio haciendo lo siguiente:

  1. Engañar ZSH en el pensamiento de su rprompt es un personaje más corto de lo que realmente está utilizando el estándar envoltorio secuencia invisible:%{...%}
  2. Luego enviando una secuencia de escape de cursor hacia atrás usando terminfo: %{terminfo[cub1]}

Consulte las preguntas frecuentes y este mensaje en la lista de correo para obtener más información.

Anthony Michael Cook
fuente
55
Esto también parece colocar el cursor de entrada un carácter a la izquierda de donde normalmente estaría. Usando las indicaciones en esta pregunta, por ejemplo, el cursor se coloca en la marca hash, en lugar de inmediatamente a su derecha. (Para mí, establecer el desplazamiento en un valor menor que cero hace que las indicaciones y el cursor aparezcan en los lugares correctos. Observado con zsh 5.0.8 y 5.2.)
Rob Kennedy
Funciona para mí en 5.2.
Anthony Michael Cook
55
Me funcionó un poco en 5.2, pero ahora tengo problemas con PROMPT: el último carácter en PROMPT desapareció y la activación automática completa el último carácter con el primer carácter de la entrada actual. Por ejemplo, se %git<Tab>transforma en%ggit
roboslone
No necesita usar los trucos para las versiones más nuevas de ZSH.
Anthony Michael Cook
55
Después de configurar ZLE_RPROMPT_INDENT = 0, noté los mismos problemas de fallas de dibujo con el indicador del lado izquierdo que otros mencionan anteriormente. Sin embargo, casi todo funciona como se espera si uso -1 en lugar de 0, es decir, ZLE_RPROMPT_INDENT = -1. Vi ese consejo en github.com/bhilburn/powerlevel9k/issues/… . Casi, porque con -1 nunca usa la línea inferior de una ventana de terminal en macOS.
Marc Liyanage
2

He enviado un informe de error a los mantenedores de zsh, pero parece que este comportamiento es por diseño. Sin embargo, este problema me molestó tanto que decidí parchear y compilar zsh a mí mismo como una solución temporal. Si estás en OS X y usas Homebrew (deberías), entonces puedes instalar zsh incluyendo mi parche ejecutando:

brew install https://gist.github.com/padde/7963205/raw/eaedcc557859a40db87282fc39256fccd52d0aad/zsh.rb

es probable que desee añadir /usr/local/bin/zsha /etc/shellsy chsh -s /usr/local/bin/zshdespués. Por último, aquí está la diferencia cruda para cualquiera que esté interesado:

diff --git a/Src/Zle/zle_refresh.c b/Src/Zle/zle_refresh.c
index 17b78ce..f136178 100644
--- a/Src/Zle/zle_refresh.c
+++ b/Src/Zle/zle_refresh.c
@@ -1576,7 +1576,7 @@ zrefresh(void)
    else
        put_rpmpt = rprompth == 1 && rpromptbuf[0] &&
        !strchr(rpromptbuf, '\t') &&
-       (int)ZR_strlen(nbuf[0]) + rpromptw < winw - 1;
+       (int)ZR_strlen(nbuf[0]) + rpromptw < winw;
     } else {
 /* insert >.... on first line if there is more text before start of screen */
    ZR_memset(nbuf[0], zr_sp, lpromptw);
@@ -1631,9 +1631,9 @@ zrefresh(void)
    if (put_rpmpt && !iln && !oput_rpmpt) {
        int attrchange;

-       moveto(0, winw - 1 - rpromptw);
+       moveto(0, winw - rpromptw);
        zputs(rpromptbuf, shout);
-       vcs = winw - 1;
+       vcs = winw;
    /* reset character attributes to that set by the main prompt */
        txtchange = pmpt_attr;
        /*
Patrick Oscity
fuente
PWS (mantenedor de zsh) acaba de publicar un parche extendido , por lo que la sangría RPROMPT debería estar en las fuentes oficiales '' pronto.
mpy
Gracias por publicar el enlace. ¡Esperamos el próximo lanzamiento!
Patrick Oscity
1

Creo que el espacio en blanco a la derecha está codificado. Pero puedes engañar zshcon la siguiente configuración:

RPROMPT="%{*%}"

que en principio dice zshque la estrella no ocupa caracteres; de man zshmisc:

%{...%} Incluya una cadena como una secuencia de escape literal. La cadena dentro de las llaves no debe cambiar la posición del cursor. (...)

El inconveniente es que "desplaza" el espacio en blanco al final de PROMPT:

| PROMPT = "#" |
| RPROMPT = "% {*%}" |
| # ■ * |

Los |símbolos denotan los bordes terminales, ■ el cursor.


Otra idea sería aumentar COLUMNSen 1:

COLUMNS=$((COLUMNS + 1))

Pero uno tiene que pensar en una forma de hacer esto solo para la representación rápida, pero no para los comandos. Y esto tragará el último carácter en cada línea en una línea de comando de varias líneas.

mpy
fuente
1
Gracias. Traté de jugar con el truco% {...%}, lidiando con mi tiempo y el estado de git que se muestra a la derecha. No me importa el espacio extra en el PROMPT porque generalmente tengo uno. Sin embargo, hay una gran desventaja con esta solución: cuando activo el autocompletado con TAB, el espacio extra se elimina y está haciendo cosas raras :)
Frozax