zsh が補完を探している間にインジケーターを表示する

zsh が補完を探している間にインジケーターを表示する

状況によっては、zsh が補完リストを生成するのに長い時間がかかります。リモート サーバー上のいくつかのファイルをリストする必要があるか、起動に長い時間がかかるツールを実行する必要があるかもしれません。このような状況では、Tab補完を開始するために押した後、画面表示がすぐには変化せず、zsh がまだ補完リストを生成中なのか、リストは生成されているが入力した内容に対する補完がないのか、または現在のコンテキストでは補完がサポートされていないのかが常に明確になるわけではありません。

zsh が補完リストを作成している間に、何らかのインジケーターを表示する方法はありますか? より一般的には、リストの作成を開始する前に zsh にユーザー定義関数を実行させ、完了したら別の関数を実行させる方法はありますか?

答え1

完了のエントリポイントは関数である_main_completeシェル オプションと補完関連の変数を設定した後、補完表示設定を分析して補完を実行する前にフックを呼び出します。補完が見つかったかどうかに関係なく、通常どおりに戻る直前にcompprefuncsフックを呼び出しますcomppostfuncsが、キーボード割り込み ( Ctrl+ C) で戻る前にはフックを呼び出しません。

各フックは関数名の配列です。関数は順番に呼び出され、戻りステータスは無視されます。_main_complete_関数を呼び出す前に配列を消去するため、関数を再挿入する必要があります。

私はzsh/terminfoモジュール文字列の右下隅にインジケーターを表示します。少なくとも私がテストした構成では、補完によってこのインジケーターは消去されます。

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)

関連情報