在某些情況下,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)