En algunas situaciones, zsh tarda mucho en generar una lista de finalizaciones. Tal vez necesite enumerar algunos archivos en un servidor remoto o tal vez necesite ejecutar una herramienta que tenga un tiempo de inicio prolongado. En estas situaciones, después de presionar Tabpara iniciar la finalización, la visualización de la pantalla no cambia de inmediato y no siempre está claro si zsh todavía está generando la lista de finalizaciones, ha generado la lista pero no hay finalizaciones para lo que presiono. he escrito, o la finalización simplemente no se admite en el contexto actual.
¿Hay alguna forma de mostrar algún tipo de indicador mientras zsh crea la lista de finalización? De manera más general, ¿hay alguna manera de hacer que zsh ejecute una función definida por el usuario antes de comenzar a crear la lista y luego ejecutar una función diferente cuando esté lista?
Respuesta1
El punto de entrada de la finalización es la función._main_complete
. Llama al gancho compprefuncs
después de configurar las opciones del shell y las variables relacionadas con la finalización y antes de analizar la configuración de visualización de la finalización y realizar las completaciones. Llama al gancho comppostfuncs
justo antes de regresar normalmente, ya sea que se hayan encontrado terminaciones o no, pero no antes de regresar con una interrupción del teclado ( Ctrl+ C).
Cada gancho es una matriz de nombres de funciones; las funciones se llaman en orden y se ignora su estado de retorno. _main_complete_
borra la matriz antes de llamar a las funciones, por lo que deben volver a insertarse.
Yo uso elzsh/terminfo
módulopara mostrar un indicador en la esquina inferior derecha de la cadena. La finalización borra este indicador, al menos en la configuración que probé.
zmodload zsh/terminfo
function set_completion_indicator {
echoti sc # save_cursor
echoti cup $((LINES - 1)) $((COLUMNS - $#1)) # cursor_position
echoti setaf $2 # set_foreground (color)
printf %s $1
echoti sgr 0 # exit_attribute_mode
echoti rc # restore_cursor
#sleep 1
}
completion_indicator_text='(completing)'
completion_indicator_color=3
function display_completion_indicator {
compprefuncs+=(display_completion_indicator)
set_completion_indicator $completion_indicator_text $completion_indicator_color
}
function hide_completion_indicator {
comppostfuncs+=(hide_completion_indicator)
# The completion code erases the indicator, so there's nothing to do.
}
compprefuncs+=(display_completion_indicator)
comppostfuncs+=(hide_completion_indicator)