Отображение индикатора прогресса во время работы пользовательского компоновщика 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

person Whyte    schedule 23.02.2017    source источник
comment
Вы пытались просто использовать print 'Completing...' вместо _message?   -  person Adaephon    schedule 24.02.2017
comment
Да, но он не удаляется впоследствии, что заставляет завершающего добавлять дополнения в конце завершения....   -  person Whyte    schedule 24.02.2017
comment
В этом случае вы можете попробовать print -n 'Completing...\r'. -n предотвращает печать новой строки, а \r перемещает курсор в начало строки. После того, как список завершений напечатан, он должен перезаписать текст.   -  person Adaephon    schedule 24.02.2017
comment
Приведенный выше код завершения выполняется в тот момент, когда нажата клавиша Tab, а курсор все еще находится на редактируемой строке. Печать \r заставит завершитель добавить остальную часть завершаемого слова в начало строки, перезаписав мое приглашение и оставив курсор в странном месте.   -  person Whyte    schedule 24.02.2017


Ответы (1)


Вы можете попробовать использовать 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
(I не смог найти хороший анкор, поэтому найдите/поищите на странице с zle -R)

person hchbaw    schedule 25.02.2017
comment
Это работает! Это работает для всех моих случаев: когда не найдено ни одного завершения, когда одно завершение найдено и автодополнено, и когда найдено несколько завершений и показано меню. Во всех случаях отображается «Завершение...», а затем правильно удаляется, когда все сделано. Спасибо! - person Whyte; 26.02.2017