2017-02-23 46 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