Anzeigen eines Indikators, während zsh nach Vervollständigungen sucht

Anzeigen eines Indikators, während zsh nach Vervollständigungen sucht

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, compprefuncsnachdem 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 comppostfuncsunmittelbar 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/terminfoModulum 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)

verwandte Informationen