In manchen Situationen braucht zsh sehr lange, um eine Liste der Vervollständigungen zu generieren. Vielleicht muss es einige Dateien auf einem Remote-Server auflisten oder ein Tool ausführen, das eine lange Startzeit hat. In diesen Situationen ändert sich Tabdie Bildschirmanzeige nicht sofort, nachdem ich auf „Vervollständigung starten“ drücke, und es ist nicht immer klar, ob zsh noch die Liste der Vervollständigungen generiert, die Liste zwar generiert hat, aber keine Vervollständigungen für das, was ich eingegeben habe, vorhanden sind, oder die Vervollständigung im aktuellen Kontext einfach nicht unterstützt wird.
Gibt es eine Möglichkeit, eine Art Indikator anzuzeigen, während zsh die Vervollständigungsliste erstellt? Oder allgemeiner: Gibt es eine Möglichkeit, zsh eine benutzerdefinierte Funktion ausführen zu lassen, bevor es mit dem Erstellen der Liste beginnt, und dann eine andere Funktion ausführen zu lassen, wenn es fertig ist?
Antwort1
Der Einstiegspunkt der Vervollständigung ist die Funktion_main_complete
. Es ruft den Hook auf, compprefuncs
nachdem Shell-Optionen und Vervollständigungs-bezogene Variablen gesetzt wurden und bevor die Anzeigeeinstellungen für Vervollständigungen analysiert und Vervollständigungen ausgeführt werden. Es ruft den Hook comppostfuncs
unmittelbar vor der normalen Rückkehr auf, unabhängig davon, ob Vervollständigungen gefunden wurden oder nicht, aber nicht vor der Rückkehr bei einer Tastaturunterbrechung ( Ctrl+ C).
Jeder Hook ist ein Array von Funktionsnamen. Die Funktionen werden der Reihe nach aufgerufen und ihr Rückgabestatus wird ignoriert. _main_complete_
löscht das Array vor dem Aufruf der Funktionen, sodass sie sich erneut einfügen müssen.
Ich verwende daszsh/terminfo
Modulum einen Indikator in der unteren rechten Ecke der Zeichenfolge anzuzeigen. Die Vervollständigung löscht diesen Indikator, zumindest in der Konfiguration, die ich getestet habe.
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)