0 votos

Problema con el prompt de ZSH: los comandos se desplazan a la derecha en cien caracteres de espacio cuando se completan, es decir, usando la tecla TAB

De este puesto, ¿Conseguir la función en PS1 (Zsh)? Parece que es posible ejecutar una función dentro de un prompt` de ZSH.

Aquí cómo utilizar una función en PROMPT :

setopt PROMPT_SUBST
slash_color () { dirs | awk -F "/" ' {for (i=1; i<=NF; i++) printf "\033[38;5;75m"$i"\033[38;5;206m/"} '; }

PS1='%F{13}|%F{green}%n@%F{cyan}%m%F{13}|%f%T%F{13}|$(slash_color)%F{13}|%F{7} '

Por debajo del resultado :

Prompt result

TEMA : Pero ahora, me encuentro con otro problema: cuando estoy dentro de un directorio, la primera terminación con TAB, por ejemplo "vim" ⇨Tab desplazar toda la pantalla a un centenar de caracteres de espacio a la derecha.

Para ilustrarlo, he aquí una captura de pantalla:

vim tab screen capture

Como puede ver, justo después de escribir vim te y después de pulsar ⇨Tab el comando vim te es empujado hacia la derecha: no entiendo de dónde puede venir este desplazamiento.

Estoy usando zsh-5.8 de MacPorts y también pude reproducir el problema compilando las fuentes de zsh-5.8 en MacOS Catalina.

Si alguien pudiera tener una explicación/sugerencia/pista, esto estaría bien para contarlo.

PD: Sospecho que el uso de una simple variable de entorno ZSH podría arreglar este extraño comportamiento.

He investigado un poco y he encontrado estos 2 enlaces interesantes :

Parece que el desplazamiento que se produce en mi caso se debe a la interpretación de los caracteres de escape ANSI, pero no he entendido todos los detalles.

Sin embargo, he intentado modificar slash_color() función como esta :

slash_color () {
dirs | awk -F "/" '{ blue="\e[38;5;75m"; \
                     pink="\e[38;5;206m"; \
                     for (i=1; i<NF; i++) \
                       printf blue $i pink "/"; \
                     printf blue $NF pink; \
                     printf "\n"
                   }'
}

Pero esto no funciona, me sale el siguiente error sobre awk :

awk: cmd. line:1: warning: escape sequence `\e' treated as plain `e'

En mi problema original (desplazamiento hacia la derecha), todo ocurre como si ZSH estuviera calculando mal la longitud del PATH real visible de PROMPT y lo sobreestimara? Eso explicaría por qué estoy desplazado a la derecha.

Podría alguien echar un vistazo, por favor, a los dos enlaces que he dado más arriba, podría contener la solución en mi caso.

ACTUALIZACIÓN 1: @Allan, aquí puedes ver mi último intento :

# Prompt for zsh : path separated by %F{13} slash to better see where we are
setopt PROMPT_SUBST

slash_color() {
dirs | awk -F "/" '{ blue="\033[38;5;75m"; \
                     pink="\033[38;5;206m"; \
                     for (i=1; i<NF; i++) \
                      printf blue $i pink "/"; \
                     printf blue $NF pink; \
                     printf "\n";
                   }';
}

# Last method using my_precmd_hook_function
my_precmd_hook_function() {
  slash_path=$(slash_color)
}

autoload -U add-zsh-hook
add-zsh-hook precmd my_precmd_hook_function

PROMPT='%F{13}|%F{green}%n@%F{cyan}%m%F{13}|%f%T%F{13}|''$slash_path''%F{13}|%F{7} '

El renderizado de PATH con la barra diagonal rosa es bueno, pero el problema del desplazamiento hacia la derecha se mantiene cuando escribo cd + ⇨Tab o ls + ⇨Tab . La presencia de printf "\n"; no cambia nada en el resultado.

A continuación una captura que ilustra esto :

shifting to the right

SOLUCIÓN FINALMENTE ENCONTRADA : mi perseverancia ha dado sus frutos, todo funciona bien, se acabaron los desplazamientos y la barra diagonal coloreada en PATH, con :

# Prompt for zsh : path separated by %F{13} slash to better see where we are
setopt PROMPT_SUBST

# Path with colorized forward slash
slash_color() {
dirs | awk -F "/" '{ blue="%{\033[38;5;75m%}"; \
                     pink="%{\033[38;5;206m%}"; \
                     for (i=1; i<NF; i++) \
                      printf blue $i pink "/"; \
                     printf blue $NF pink; \
                   }';
}

# Prompt final
PROMPT=$'%F{13}|%F{green}%n@%F{cyan}%m%F{13}|%f%T%F{13}|$(slash_color)%F{13}|%F{7} '

# Zsh reverse auto-completion
bindkey '^[[Z' reverse-menu-complete

Muchas gracias por todos sus consejos.

0 votos

Si obtienes votos negativos, considera la posibilidad de hacer que toda la resolución de problemas sea una respuesta: incluso las respuestas parciales y las incorrectas obtienen votos positivos y ayudan a la gente a aprender. Luego, la pregunta puede acortarse a una o dos frases que describan el problema con claridad. Esto también tiende a conseguir votos positivos y tracción.

1 votos

apple.stackexchange.com/questions/383297/ es sobre zsh 5.7.1, la respuesta describe que el problema no ocurre en 5.8. Así que no estoy seguro de por qué lo consideras relevante.

0 votos

@nohillside Sospecho que la función slash_color () pone el lío en la visualización del prompt, especialmente, los caracteres no visibles como los códigos de escape ANSI parecen añadirse al prompt cuando intento hacer un TAB finalización y todos los comandos cd foo/ se desplaza a la derecha. Este problema se produce tanto en zsh-5.7.1 y zsh-5.8 .

1voto

Douglas Puntos 10417

Para ser sincero, creo que el hecho de que hayas hecho este aviso demasiado complejo y hayas intentado introducir "capas" adicionales y complejas a lo que se supone que es un aviso sencillo está teniendo problemas imprevistos e impredecibles.

En mi respuesta anterior a su pregunta relacionada que es en lo que se basa su slash_color función en, advertí sobre esto desde el punto de vista de la usabilidad. En los comentarios, mencioné que no estaba dispuesto a poner una función dentro de un aviso por razones de seguridad.

Ok... las renuncias están fuera del camino.


Mi primera observación es que tienes un carácter de nueva línea generado por awk .

slash_color code

Así que, en tu prompt, le estás diciendo que saque una nueva línea en algo que se supone que está contenido en una sola línea. No sé cómo PROMPT maneja las cosas dentro de ZSH, pero dudo que maneje muy bien los caracteres de nueva línea.

En segundo lugar, parece que estás mezclando todas las cosas diferentes que ZSH, awk y las funciones en general tienen que tratar. Todavía estoy un poco confuso en cuanto a la lógica real aquí, pero parece que estás tratando de empujar los códigos de escape "normales" a través de dos capas de funciones dentro de ZSH utilizando sus convenciones de color y los módulos cargables de ZSH.

¿Podría alguien echar un vistazo, por favor, a los 2 enlaces que he dado más arriba, podría contener la solución en mi caso?

¿Por qué? ¿Qué hay en esos enlaces que te lleve a creer eso? El primer enlace es sobre la expansión de variables dentro del prompt. El segundo te muestra cómo colorear tu prompt usando tanto secuencias de escape como el método preferido de llaves en ZSH.

Creo que el problema es el exceso de complejidad.

Estás metiendo con calzador un función que no sólo tiene los códigos de escape ANSI, que son compatibles, sino que llama a otro que crea una tubería, lo que significa que crea una subestructura para llamar a otra función. (A esto me refería con lo de las capas y la complejidad).

Por eso he sugerido utilizar precmd() . No sólo puede anidar funciones, sino que puede llamar a múltiples funciones y, a continuación, genere su aviso. Te aconsejo que explores más eso y no te fijes en que PROMPT es el único método para despellejar a este gato .

Mi otro consejo es que articules lo que te gustaría conseguir en última instancia y lo publiques como una nueva pregunta porque probablemente haya una solución que no conozcas. IMO, esto suena como un Problema XY

0 votos

Lamento ser aburrido con mi intento, que es complicado, debo admitirlo. Así que voy a seguir su consejo y explorar la precmd() zsh puede ser rápidamente un monstruo a nivel de opciones y configuraciones posibles, por eso mi antigua configuración de bash es simple comparada con zsh (no digo que bash sea básico en sí mismo). Añadiré una actualización lo antes posible para seguir interactuando con vosotros. Gracias

0 votos

Solución finalmente encontrada como se puede ver después de mi ACTUALIZACIÓN1 . Muchas gracias.

0voto

youpilat13 Puntos 108

SOLUCIÓN FINALMENTE ENCONTRADA : mi perseverancia ha dado sus frutos, todo funciona bien, se acabaron los desplazamientos y la barra diagonal coloreada en PATH, con :

# Prompt for zsh : path separated by %F{13} slash to better see where we are
setopt PROMPT_SUBST

# Path with colorized forward slash
slash_color() {
dirs | awk -F "/" '{ blue="%{\033[38;5;75m%}"; \
                     pink="%{\033[38;5;206m%}"; \
                     for (i=1; i<NF; i++) \
                      printf blue $i pink "/"; \
                     printf blue $NF pink; \
                   }';
}

# Prompt final
PROMPT=$'%F{13}|%F{green}%n@%F{cyan}%m%F{13}|%f%T%F{13}|$(slash_color)%F{13}|%F{7} '

# Zsh reverse auto-completion
bindkey '^[[Z' reverse-menu-complete

Muchas gracias por todos sus consejos.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X