Gibt es eine gute allgemeine Anpassung von org-babel, um asynchron zu laufen? Vor kurzem habe ich vor, MATLAB über org-babel zu verwenden, aber ich würde es gerne asynchron verwenden, da einige Berechnungen einige Zeit in Anspruch nehmen.
Ich möchte nicht nur ob-matlab anpassen. Dies liegt daran, dass ich denke, dass dies auf der Ebene des Frameworks und nicht auf der Ebene einer Anwendung erfolgen sollte. Mit anderen Worten, dieselbe Änderung sollte die Asynchronitätsfunktion für andere Spracherweiterungen aktivieren, z. B. R-Sprache.
Hat jemand eine gute Lösung? Bisher habe ich versucht, async.el
das auch deferred.el
zu modifizieren org-babel-execute-safely-maybe
, was im ob-core.el
Moment zu finden ist.
Antworten:
Ich habe bisher herausgefunden, dass das Laichen eines neuen Emacs-Prozesses eine Lösung ist.
Folgendes habe ich getan.
1. Fügen Sie eine Funktion hinzu, um einen externen Emacs-Prozess zu starten.
init.el
2. Fügen Sie eine Konfigurationsdatei hinzu, die in den neuen Emacs-Prozess geladen werden soll.
Die obige Funktion startet den Emacs im
--batch
Modus. Somit wird das normale Init.el nicht geladen.Stattdessen möchten wir eine kürzere Konfigurationsdatei erstellen (um Pfade usw. zu laden).
Der Pfad zu unserer neuen Konfigurationsdatei ist im
async-emacs-repl-org-babel-init-file
obigen Snippet gespeichert .org-babel-async-init.el
Hier wir ...
Fußnote 1: Ohne diese Einstellung schlägt die Auswertung mit fehl
"No org-babel-execute function for $lang!"
Fußnote 2: Natürlich können Sie die normale init.el-Datei laden, anstatt eine neue Konfigurationsdatei zu erstellen. Tun Sie das, indem Sie
(setq org-babel-async-init-file "~/.emacs.d/init")
zu Ihrem hinzufügeninit.el
. Ich halte es jedoch für einfacher, eine Konfigurationsdatei für diese Aufgabe zu erstellen.3. Zusätzlich ...
Zu init.el hinzufügen
Fügen Sie zu org-babel-async-init.el hinzu
Fügen Sie org-babel-async-init.el hinzu (möglicherweise benötigen Sie diese nicht. Diese sind für MATLAB).
Fügen Sie org-babel-async-init.el hinzu (möglicherweise benötigen Sie diese nicht. Dies gilt für Julia, R und andere Sprachen, die ESS verwenden.)
4. Verwendung
(Nach dem obigen Setup.)
M-x my/async-emacs-repl-org-babel-execute
(anstatt zu tunC-c C-c
). Dadurch wird bei Bedarf ein externer Emacs-Prozess als REPL-Server gestartet und anschließend der Quellblock ausgeführt, an dem Sie sich gerade befinden.Danksagung
Aus diesem Beitrag habe ich die Idee gelernt, einen Emacs-Prozess für die Org-Babel-Evaluierung zu starten . Ich möchte dem Autor danken.
Kommentare zur Anpassung
Die Idee hier ist einfach. Starten Sie eine neue Emacs als REPL für Elisp verarbeiten, zu tun ,
find-file
um die gleiche .org Datei , die wir bearbeiten,goto-line
auf den gleichen Cursor Punkt laufenorg-babel-execute-src-block
,save-buffer
. Beenden Sie das Programm, bis der Benutzer den Vorgang beendet hat (andernfalls verschwinden die Grafiken sofort, nachdem sie angezeigt wurden). Man kann natürlich darüber nachdenken, dies zu erweitern durch:C-c C-c
anstelle des manuellen Ausführens von Funktionen / Festlegen einer neuen Tastenkombination (was durch Hinweise erreicht werden kann).Tatsächlich scheint mir der Erfolg dieses Ansatzes ein allgemeiner Weg zu sein, asynchrone Funktionen in Emacs zu entwickeln. Erstellen Sie eine "Befehls" -Ebene, fügen Sie Skripts hinzu, um Aufgaben auszuführen, und verfügen Sie über ein Framework zum Starten und Wiederverwenden von Emacs-Prozessen. Genau wie das Symfony-Framework von PHP (PHP hat keine Threads) über Befehlsfunktionen verfügt.
Verlauf bearbeiten
Überarbeiteter Code (2016-04-02). Die Lösung verwendet jetzt einen Emacs-Prozess (02.04.2016). Die Lösung wurde jetzt vereinfacht und es muss nur noch ein
interactive
Befehl ausgeführt werden (2016-04-02. Konfiguration hinzugefügt (2016-04-12).quelle
async.el
?lambda
ihm zugewiesene Funktion aus. Ich habe es für diese Lösung nicht verwendet, weil ich keine Möglichkeit gefunden habe, Daten an den neuen Prozess zu senden. Die Kommunikation des Prozesses ist erforderlich, wenn Sie die Sitzungsfunktion von org-babel verwenden möchten.TERM=vt200 emacs --batch -nw --eval '(load "~/.emacs.d/org-babel-async-init")' --eval '(while t (print (eval (read))))': exited abnormally with code 255.
Entschuldigung, dies sollte ein Kommentar und keine Antwort sein, aber ich habe einfach nicht genug Punkte.org-babel-do-load-languages
. 3) Der#+SRC_BEGIN
Block, den Sie ausführen, enthält einen Fehler.M-x my/async-emacs-repl-org-babel-execute
, da sonst die „org-babel-async“ Puffer wird sich beschweren:...t/Dropbox/org/work.org locked by maarhart@htkl... (pid 68694): (s, q, p, ?)? Please type q, s, or p; or ? for help
. Wenn dies also gelöst werden kann, wäre es fantastisch. Trotzdem vielen Dank dafür, es ist unglaublich! Ist es übrigens möglich, es an denC-c C-c
org-mode zu binden oder widerspricht es ihm?Für zukünftige Referenzen und sofort einsatzbereite Bibliotheken. Ich werde diesen zur Beantwortung annehmen, da er jünger ist.
ob-asynchron
Hier ist eine Bibliothek mit async.el https://github.com/linktohack/ob-async
org-babel-eval-in-repl
Meine andere Lösung (verfügbar in Melpa): https://github.com/diadochos/org-babel-eval-in-repl
quelle