Есть ли хорошая общая настройка org-babel для асинхронной работы? Недавно я планирую использовать MATLAB через org-babel, но я хотел бы использовать его асинхронно, поскольку некоторые вычисления требуют времени.
Я не хочу настраивать только ob-matlab. Это потому, что я думаю, что это должно быть сделано на уровне структуры вместо приложения. Другими словами, та же самая модификация должна включить функцию асинхронности для других языковых расширений, например, языка R.
У кого-нибудь есть хорошее решение? До сих пор я пытался, async.el
а также deferred.el
изменить org-babel-execute-safely-maybe
то, что можно найти в ob-core.el
данный момент.
Ответы:
До сих пор я обнаружил, что порождение нового процесса Emacs является решением.
Вот что я сделал.
1. Добавьте функцию для запуска внешнего процесса emacs.
init.el
2. Добавьте файл конфигурации для загрузки в новый процесс emacs.
Приведенная выше функция запускает emacs в
--batch
режиме. При этом обычный init.el не будет загружен.Вместо этого мы хотим создать более короткий файл конфигурации (для загрузки путей и т. Д.).
Путь к нашему новому файлу конфигурации хранится
async-emacs-repl-org-babel-init-file
в приведенном выше фрагменте.орг-столпотворение Асинхр-init.el
Мы тут ...
Сноска 1: Без этого параметра оценка не будет выполнена
"No org-babel-execute function for $lang!"
Сноска 2: Конечно, вы можете загрузить обычный файл init.el вместо создания нового файла конфигурации, если хотите. Сделайте это, добавив
(setq org-babel-async-init-file "~/.emacs.d/init")
к вашемуinit.el
. Но я думаю, что создание файла конфигурации для этой задачи более просто.3. Дополнительно ...
Добавить в init.el
Добавить в org-babel-async-init.el
Добавьте в org-babel-async-init.el (они могут вам не понадобиться. Это для MATLAB)
Добавьте в org-babel-async-init.el (они могут вам не понадобиться. Они предназначены для Julia, R и других языков, использующих ESS.)
4. Использование
(После настройки выше.)
M-x my/async-emacs-repl-org-babel-execute
(а не делайC-c C-c
). Это при необходимости запустит внешний процесс Emacs в качестве сервера REPL, а затем выполнит исходный блок, в котором вы находитесь.Подтверждения
Из этого поста я узнал идею запуска процесса emacs для оценки org-babel . Я хотел бы поблагодарить автора.
Комментарии для настройки
Идея здесь проста. Запустить новый Emacs обрабатывать как РЕПЛ для Elisp, сделать
find-file
в тот же .org файл мы редактируемыеgoto-line
в ту же точку курсора, бегитеorg-babel-execute-src-block
,save-buffer
. Прекратите выход, пока пользователь не остановит процесс (в противном случае графики исчезнут сразу после их отображения). Естественно, можно подумать о расширении этого путем:C-c C-c
вместо запуска функций вручную / установки новой привязки клавиш (что может быть достигнуто советами).Фактически, успех этого подхода, как мне кажется, показывает общий способ разработки асинхронных функций в Emacs. Создание слоя «команд», добавление сценариев для выполнения задач и создание инфраструктуры для запуска и повторного использования процессов emacs. Точно так же, как PHP-фреймворк Symfony (в PHP нет потоков) имеет функции Command.
Редактировать историю
Рефакторинг кода (2016-04-02). Решение теперь повторно использует процесс Emacs (2016-04-02). Решение теперь упрощено и имеет только одну
interactive
команду для запуска (2016-04-02. Добавлена конфигурация (2016-04-12).источник
async.el
?lambda
данную ему функцию. Я не использовал его для этого решения, потому что не смог найти способ отправить данные в новый процесс. Сообщение о процессе необходимо, если вы хотите использовать функцию: session org-babel.TERM=vt200 emacs --batch -nw --eval '(load "~/.emacs.d/org-babel-async-init")' --eval '(while t (print (eval (read))))': exited abnormally with code 255.
извините, это должен быть комментарий, а не ответ, но мне просто не хватает очков.org-babel-do-load-languages
. 3)#+SRC_BEGIN
Блок, который вы выполняете, содержит ошибку.M-x my/async-emacs-repl-org-babel-execute
, иначе буфер «орг-столпотворение Асинхр» будет жаловаться:...t/Dropbox/org/work.org locked by maarhart@htkl... (pid 68694): (s, q, p, ?)? Please type q, s, or p; or ? for help
. Так что, если это можно решить, это было бы здорово. В любом случае спасибо за это, это удивительно! Кстати, можно ли его привязатьC-c C-c
или он будет конфликтовать с org-mode?Для будущих ссылок и готовых библиотек. Я приму это за ответ, потому что они более свежие.
об-асинхронной
Вот библиотека, использующая async.el https://github.com/linktohack/ob-async
орг-Бабель-Eval-в-РЕПЛ
Мое другое решение (доступно в melpa): https://github.com/diadochos/org-babel-eval-in-repl
источник