Из строки документации:
Выполняйте BODY только до тех пор, пока нет ожидающих ввода.
Если поступает ввод, это завершает выполнение BODY иwhile-no-input
возвращает t. Выход заставляет его возвращать ноль. Если BODY завершает работу,while-no-input
возвращает любое значение, произведенное BODY.
Если я правильно понимаю, этот макрос позволяет мне (пытаться) выполнять тяжелые вычисления без зависания интерфейса. Это, безусловно, концепция, которая мне кажется привлекательной, но мне остается только задуматься, когда это полезно на практике.
Кажется, что вычисления могут быть прерваны в любой момент, без информации о том, где это произошло, и нет простого способа возобновить его позже. Что заставляет меня думать, что это может быть не очень полезно в конце концов ...
- Есть ли рекомендуемый способ использования
while-no-input
макроса? - Есть ли примеры использования этого макроса в дикой природе?
источник
Ответы:
Действительно, нет поддержки возобновлению. Конечно, тело
while-no-input
может делать регулярные «контрольные точки», чтобы знать, с чего начать в следующий раз.Но первоначальная мотивация для этой функциональности была в тех случаях, когда вычисленная информация, вероятно, бесполезна после следующей команды. Более конкретно, оно было введено для того
icomplete
, чтобы вычисление набора кандидатов на завершение не препятствовало тому, чтобы пользователь печатал дополнительный текст (что, в свою очередь, в любом случае требует повторного вычисления этого набора кандидатов на завершение).источник
Это очень полезно в counsel-git-grep : я могу вызывать
git grep
целые 3 800 000 строк репозитория Emacs git после каждого нажатия клавиши. Никаких зависаний. И это нормально, если тебя прерывают, тебе просто нужно это проверить.источник