2017-02-23 76 views
0

我爲我的一個工具提供了自定義ZSH Tab完成功能。它工作得很好,但有時需要很長時間才能回答;有沒有一種方法可以顯示工具運行時(以及運行完成之前)發生了什麼?自定義ZSH完成器運行時顯示進度指示

例如,是否有可能使其顯示當前線以下信息,如:

prompt$ pypath /providers/conf<TAB> 
Completing... 

這裏的挑戰是,必須讓光標返回其先前的位置(我打「TAB」 )一旦完成候選人可用。我知道ZSH可以做到這一點,但它可以顯示一條消息之前,該工具完成運行?

這裏是我目前完成的腳本:

#compdef pypath 

# This does not work; it is only added when the whole thing ends 
# _message -r "Completing..." 

IFS=$'\n' path_candidates=($(pypath "${PREFIX}*" | sed 's|.*/||' | sort -u)) 
compset -P '*/' 

if [ -z "$path_candidates" ]; then 
    compadd -x "No matches found." 
else 
    compadd -q -S '/' $path_candidates 
fi 
+0

您是否嘗試過只使用'打印「完成......」'而不是'_message'? – Adaephon

+0

是的,但之後不會刪除,這會使完成者在「正在完成...」結尾添加完成。 – Whyte

+0

在這種情況下,您可以嘗試'print -n'正在完成... \ r''。 '-n'防止打印換行符,'\ r'將光標移動到行的開頭。一旦完成列表被打印,它應該覆蓋文本。 – Adaephon

回答

0

你可以嘗試使用zle -R "Completing..."

zle -R [ -c ] [ display-string ] [ string ... ]
...
-R [ -c ] [ display-string ] [ string ... ]

重新顯示命令線;這將在用戶定義的小部件中調用,以允許更改可見。如果給出了顯示字符串而不是空的,則顯示在狀態行中(緊接在正在編輯的行的下面)。

如果給出了可選字符串,它們將按照與完成列表打印相同的方式在提示符下面列出。如果沒有給出字符串,但使用了-c選項,則清除這個列表。

請注意,此選項僅適用於在使用後不立即退出的小部件,因爲顯示的字符串將在從小部件返回後立即被擦除。

該命令可以在用戶定義的窗口小部件之外安全地調用;如果zle處於活動狀態,則會刷新顯示,而如果zle未處於活動狀態,則該命令不起作用。在這種情況下,通常不會有其他參數。

- zshzle(1): Zsh Line Editor, Zle Bulitins, zle -R
(我無法找到一個良好的錨,所以請查找/在頁面zle -R搜索)

+0

這有效!它適用於我所有的情況:當找不到完成時,找到並自動完成一個完成,以及找到多個完成並顯示一個菜單時。在所有情況下,顯示'正在完成...',然後在完成後正確移除。謝謝! – Whyte