2017-02-23 419 views
0

У меня есть функция заполнения вкладок ZSH для одного из моих инструментов. Он работает хорошо, однако иногда инструмент требует ответа на долгое время; есть ли способ показать какое-то указание на то, что что-то происходит во время работы инструмента (и до того, как он завершит работу)?Показывать индикацию состояния выполнения в то время как пользовательский набор 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 'Completing ... \ 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