Как я могу запустить функцию 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, он отфильтровывается на холостом ходу. Он сохраняет состояние и выделяет немного за раз, всегда помня, где он остановился, что еще нужно отформатировать, что изменилось со времени последнего запуска шрифтов и т.д. Правильно ли я понимаю? Возможно, я мог бы использовать этот постепенный подход.
Рекомендации?
Ответы
Ответ 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/ в основном обертывает шаблон, необходимый для этого. Нет подсказки, если он активно поддерживается или что-то еще.