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