Подтвердить что ты не робот

Как я могу запустить функцию elisp асинхронно?

для тех, кто не знает, imenu - вещь в emacs, которая позволяет режиму вставлять один или несколько пунктов меню в панель меню. Наиболее распространенное использование заключается в том, чтобы сделать "оглавление" доступным из раскрывающегося меню, чтобы пользователь мог быстро перейти к объявлениям функций или классов или разделов в документе и т.д.

imenu имеет несколько разных способов работы - в первом и наиболее часто используемом способе, основной режим предоставляет регулярные выражения для imenu, а imenu использует эти регулярные выражения для выполнения сканирования буфера и построения индекса. Основной режим устанавливает это, помещая список регулярных выражений в imenu-generic-expression. Второй способ заключается в том, что основной режим выполняет собственное сканирование. Это можно сделать, установив переменную imenu-create-index-function на имя функции, определяемой themode, которая возвращает список, содержащий оглавление.

Я делаю последнее - imenu-create-index-function - но иногда fn занимает время ожидания, скажем, 3 или 4 секунды или более, что задерживает пользовательский интерфейс. Если я сделаю операцию асинхронной, это решит эту проблему.

Я знаю об асинхронных процессах. Логика сканирования реализована в elisp. Можно ли запустить elisp в асинхронном процессе? Если да, то как?

Или, есть ли способ запустить регулярный elisp асинхронно в emacs, не прибегая к асинхронному процессу?

Я думаю, что это так, как это делает font-lock, он отфильтровывается на холостом ходу. Он сохраняет состояние и выделяет немного за раз, всегда помня, где он остановился, что еще нужно отформатировать, что изменилось со времени последнего запуска шрифтов и т.д. Правильно ли я понимаю? Возможно, я мог бы использовать этот постепенный подход.

Рекомендации?

4b9b3361

Ответ 1

Чтобы запустить элипс асинхронно, вы можете использовать run-with-idle-timer или run-with-timer. Думаю, вам понадобится версия idle. Проверьте ссылки на документацию для получения более подробной информации.

Примечание. Если для выполнения кода требуется 3 или 4 секунды, он все равно займет так много времени (и заморозит Emacs во время его запуска), поэтому, если вы можете разбить работу на достаточно мелкие куски, которые она занимает. 5 секунд или около того, что может работать хорошо.

Один пакет, который я использую все время, pabbrev.el, отлично использует таймеры бездействия - я никогда не замечаю, что он работает. Это может быть хороший пакет для изучения, чтобы увидеть, как он разбивает работу (он сканирует все открытые буферы и создает список частот слов).

Ответ 2

Вы можете запустить elisp в асинхронном процессе, создав emacs в пакетном режиме в качестве процесса, см. http://www.emacswiki.org/emacs/BatchMode. Кроме этого, я вообще ничего не знаю.

Похоже, http://nschum.de/src/emacs/async-eval/ в основном обертывает шаблон, необходимый для этого. Нет подсказки, если он активно поддерживается или что-то еще.