在 zsh 尋找完成時顯示指示器

在 zsh 尋找完成時顯示指示器

在某些情況下,zsh 需要很長時間才能產生完成清單。也許它需要列出遠端伺服器上的一些文件,或者可能需要運行一個啟動時間較長的工具。在這些情況下,當我按下Tab開始補全後,螢幕顯示不會立即改變,而且並不總是清楚 zsh 是否仍在生成補全列表,它已經生成了列表,但我的內容沒有補全。已經輸入,或者當前上下文不支援完成。

有沒有辦法在 zsh 建置完成清單時顯示某種指示器?更一般地說,有沒有辦法讓 zsh 在開始建置清單之前執行使用者定義的函數,然後在完成後讓它執行不同的函數?

答案1

完成的入口點是函數_main_complete。它compprefuncs在設定 shell 選項和完成相關變數之後、分析完成顯示設定和執行完成之前呼叫掛鉤。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)

相關內容