¿Existe una buena personalización general de org-babel para que se ejecute de forma asincrónica? Recientemente planeo usar MATLAB a través de org-babel, pero me gustaría hacerlo de manera asíncrona, ya que algunos cálculos llevan tiempo.
No deseo personalizar solo ob-matlab. Esto se debe a que creo que debería hacerse en el nivel del marco en lugar de una aplicación. En otras palabras, una misma modificación debería habilitar la función asíncrona para otras extensiones de idioma, por ejemplo, el lenguaje R.
¿Alguien tiene una buena solución? Hasta ahora he intentado async.el
, así como deferred.el
modificar, org-babel-execute-safely-maybe
que se puede encontrar en ob-core.el
este momento.
Respuestas:
Hasta ahora he descubierto que generar un nuevo proceso de Emacs es una solución.
Aquí está lo que he hecho.
1. Agregue una función para iniciar un proceso externo de emacs.
init.el
2. Agregue un archivo de configuración para cargar en el nuevo proceso de emacs.
La función anterior inicia emacs en el
--batch
modo. Por lo tanto, el init.el normal no se cargará.En su lugar, queremos crear un archivo de configuración más corto (para cargar rutas, etc.).
La ruta a nuestro nuevo archivo de configuración se almacena
async-emacs-repl-org-babel-init-file
en el fragmento de arriba.org-babel-async-init.el
Aquí nosotros ...
Nota 1: sin esta configuración, la evaluación fallará con
"No org-babel-execute function for $lang!"
Nota 2: Por supuesto, si lo desea, puede cargar el archivo init.el normal en lugar de crear un nuevo archivo de configuración. Haz eso agregando
(setq org-babel-async-init-file "~/.emacs.d/init")
a tuinit.el
. Pero creo que crear un archivo de configuración para esta tarea es más sencillo.3. Además ...
Añadir a init.el
Añadir a org-babel-async-init.el
Agregue a org-babel-async-init.el (puede que no necesite estos. Estos son para MATLAB)
Agregue a org-babel-async-init.el (es posible que no los necesite. Estos son para Julia, R y otros idiomas que usan ESS).
4. Uso
(Después de la configuración anterior).
M-x my/async-emacs-repl-org-babel-execute
(en lugar de hacerloC-c C-c
). Esto iniciará un proceso externo de Emacs como un servidor REPL si es necesario, y luego ejecutará el bloque fuente en el que se encuentra.Expresiones de gratitud
Aprendí la idea de comenzar un proceso de emacs para la evaluación de org-babel de esta publicación . Me gustaría agradecer al autor.
Comentarios para personalización
La idea aquí es simple. Iniciar una nueva emacs procesan como REPL para Elisp, hacerlo
find-file
en el mismo archivo .org estamos editando,goto-line
al mismo punto del cursor, ejecutarorg-babel-execute-src-block
,save-buffer
. Deje de salir hasta que el usuario detenga el proceso (de lo contrario, los gráficos desaparecerían inmediatamente después de mostrarse). Naturalmente, uno puede pensar en extender esto al:C-c C-c
lugar de ejecutar funciones a mano / configurando una nueva combinación de teclas (que se puede lograr mediante consejos).De hecho, el éxito de este enfoque me parece estar mostrando una forma general de desarrollar características asíncronas en Emacs. Crear una capa de "comandos", agregar scripts para realizar tareas y tener un marco para iniciar y reutilizar procesos de emacs. Al igual que el framework Symfony de PHP (PHP no tiene hilos) tiene características de Comando.
Editar historial
Código refactorizado (02/04/2016). La solución ahora reutiliza un proceso de Emacs (2016-04-02). La solución ahora está simplificada y solo tiene un
interactive
comando para ejecutar (02/04/2016. Configuración agregada (12/04/2016).fuente
async.el
?lambda
función que se le asigna. No lo usé para esta solución porque no pude encontrar una manera de enviar datos al nuevo proceso. La comunicación del proceso es necesaria si desea utilizar la función: session de 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.
Lo siento, esto debería ser un comentario y no una respuesta, pero simplemente no tengo suficientes puntos.org-babel-do-load-languages
. 3) El#+SRC_BEGIN
bloque que está ejecutando contiene un error.M-x my/async-emacs-repl-org-babel-execute
, de lo contrario el buffer "org-babel-asíncrono" se quejará:...t/Dropbox/org/work.org locked by maarhart@htkl... (pid 68694): (s, q, p, ?)? Please type q, s, or p; or ? for help
. Entonces, si esto se puede resolver, sería fantástico. Gracias de todos modos por esto, ¡es increíble! Por cierto, ¿es posible vincularloC-c C-c
o entrará en conflicto con el modo org?Para futuras referencias y bibliotecas listas para usar. Aceptaré esta por la respuesta porque son más recientes.
ob-async
Aquí hay una biblioteca que usa async.el https://github.com/linktohack/ob-async
org-babel-eval-in-repl
Mi otra solución (disponible en melpa): https://github.com/diadochos/org-babel-eval-in-repl
fuente