zshが完了を見つけたときのインジケータの表示

zshが完了を見つけたときのインジケータの表示

場合によっては、zshが完成リストを生成するのに長い時間がかかります。リモートサーバー上のいくつかのファイルを一覧表示する必要があるか、起動に時間がかかるツールを実行する必要があるかもしれません。このような場合、Tab開始完了をクリックした後、画面表示はすぐには変更されず、zshがまだ完了リストを生成しているかどうかは常に明確ではありません。リストを作成しましたが、コンテンツは完了していません。入力された、または現在のコンテキストで補完はサポートされていません。

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

答え1

完了のエントリポイントは次の関数です。_main_completecompprefuncsシェルオプションと完了関連変数が設定された後、分析が完了する前に表示設定と実行が完了する前にHookを呼び出します。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)

関連情報