Existe-t-il une bonne personnalisation générale d'org-babel pour une exécution asynchrone? Récemment, je prévois d'utiliser MATLAB via org-babel, mais j'aimerais qu'il soit asynchrone, car certains calculs prennent du temps.
Je ne souhaite pas personnaliser uniquement ob-matlab. C'est parce que je pense que cela devrait être fait au niveau du framework au lieu d'une application. En d'autres termes, une même modification devrait activer la fonction asynchrone pour d'autres extensions de langue, par exemple la langue R.
Quelqu'un at-il une bonne solution? Jusqu'à présent , je l' ai essayé async.el
, ainsi que deferred.el
de modifier org-babel-execute-safely-maybe
qui se trouvent dans ob-core.el
le moment.
Réponses:
Jusqu'à présent, j'ai découvert que la création d'un nouveau processus Emacs est une solution.
Voici ce que j'ai fait.
1. Ajoutez une fonction pour démarrer un processus emacs externe.
init.el
2. Ajoutez un fichier de configuration à charger dans le nouveau processus emacs.
La fonction ci-dessus démarre emacs dans le
--batch
mode. Ainsi, l'init.el normal ne sera pas chargé.Au lieu de cela, nous voulons créer un fichier de configuration plus court (pour charger les chemins et ainsi de suite).
Le chemin d'accès à notre nouveau fichier de configuration est stocké
async-emacs-repl-org-babel-init-file
dans l'extrait ci-dessus.org-babel-async-init.el
Ici nous ...
Note de bas de page 1: Sans ce paramètre, l'évaluation échouera avec
"No org-babel-execute function for $lang!"
Note de bas de page 2: Bien sûr, vous pouvez charger le fichier init.el normal au lieu de créer un nouveau fichier de configuration, si vous le souhaitez. Pour ce faire, en ajoutant
(setq org-babel-async-init-file "~/.emacs.d/init")
à votreinit.el
. Mais je pense que la création d'un fichier de configuration pour cette tâche est plus simple.3. De plus ...
Ajouter à init.el
Ajouter à org-babel-async-init.el
Ajouter à org-babel-async-init.el (vous n'en aurez peut-être pas besoin. Ce sont pour MATLAB)
Ajoutez à org-babel-async-init.el (vous n'en aurez peut-être pas besoin. Ce sont pour Julia, R et d'autres langues qui utilisent ESS.)
4. Utilisation
(Après la configuration ci-dessus.)
M-x my/async-emacs-repl-org-babel-execute
(au lieu de faireC-c C-c
). Cela lancera un processus Emacs externe en tant que serveur REPL si nécessaire, puis exécutera le bloc source où vous vous trouvez.Remerciements
J'ai appris l'idée de démarrer un processus emacs pour l'évaluation org-babel de ce post . Je remercie l'auteur.
Commentaires pour la personnalisation
L'idée ici est simple. Organiser un nouveau processus emacs comme REPL pour Elisp, faire
find-file
le même fichier .org en cours d' édition,goto-line
au même point du curseur, exécutezorg-babel-execute-src-block
,save-buffer
. Arrêtez de quitter jusqu'à ce que l'utilisateur arrête le processus (sinon, les graphiques disparaîtraient immédiatement après leur affichage). On peut naturellement penser à étendre cela en:C-c C-c
lieu d'exécuter des fonctions à la main / définir un nouveau raccourci clavier (qui peut être réalisé par des conseils).En fait, le succès de cette approche me semble montrer une manière générale de développer des fonctionnalités asynchrones dans Emacs. Créer une couche "commandes", ajouter des scripts pour effectuer des tâches et disposer d'un cadre pour démarrer et réutiliser les processus emacs. Tout comme le framework Symfony de PHP (PHP n'a pas de threads) a des fonctionnalités de commande.
Modifier l'historique
Code refactorisé (2016-04-02). La solution réutilise maintenant un processus Emacs (2016-04-02). La solution est désormais simplifiée et n'a qu'une seule
interactive
commande à exécuter (2016-04-02. Ajout de la configuration (2016-04-12).la source
async.el
?lambda
fonction qui lui est attribuée. Je ne l'ai pas utilisé pour cette solution car je n'ai pas trouvé de moyen d'envoyer des données au nouveau processus. La communication du processus est nécessaire si vous souhaitez utiliser la fonction: session d'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.
Désolé, cela devrait être un commentaire et non une réponse, mais je n'ai tout simplement pas assez de points.org-babel-do-load-languages
. 3) Le#+SRC_BEGIN
bloc que vous exécutez contient un bug.M-x my/async-emacs-repl-org-babel-execute
, sinon le tampon « org-babel-async » se plaindra:...t/Dropbox/org/work.org locked by maarhart@htkl... (pid 68694): (s, q, p, ?)? Please type q, s, or p; or ? for help
. Donc, si cela peut être résolu, ce serait fantastique. Merci quand même, c'est incroyable! Au fait, est-il possible de le lier àC-c C-c
ou va-t-il entrer en conflit avec le mode org?Pour les références futures et les bibliothèques prêtes à l'emploi. J'accepterai celui-ci pour la réponse car ils sont plus récents.
ob-async
Voici une bibliothèque utilisant async.el https://github.com/linktohack/ob-async
org-babel-eval-in-repl
Mon autre solution (disponible dans melpa): https://github.com/diadochos/org-babel-eval-in-repl
la source