状況によっては、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)