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 :
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:
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 :
- zsh, prompt, expansión de variables, secuencias de color ANSI
- Uso de secuencias de escape ANSI en el prompt de zsh
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 :
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 unTAB
finalización y todos los comandoscd foo/
se desplaza a la derecha. Este problema se produce tanto enzsh-5.7.1
yzsh-5.8
.0 votos
Así que apple.stackexchange.com/questions/383297/ no se aplica, ¿verdad? :-) Mira, por un lado es genial que investigues sobre esto y documentes los resultados, por otro lado hace que la pregunta sea difícil de leer y entender (por lo que la mayoría de la gente simplemente la ignorará). Así que, por favor, centra la pregunta en el problema real para conseguir más atención.
0 votos
@nohillside tu enlace habla de otro tema, cuando se elimina un carácter de mando. En este caso,
zsh-5.8
lo arregla, pero aquí en este puesto, este es otro problema.0 votos
Estoy de acuerdo, por eso me pregunto por qué has incluido este enlace en tu pregunta :-)
0 votos
@nohillside . Enlace eliminado como usted lo sugirió, ahora sólo un problema específico.
0 votos
@youpilat13 por favor publica una respuesta :)