Czy istnieje dobra ogólna personalizacja org-babel, aby działała asynchronicznie? Ostatnio planuję używać MATLAB-a przez org-babel, ale chciałbym to w sposób asynchroniczny, ponieważ niektóre obliczenia wymagają czasu.
Nie chcę dostosowywać tylko ob-matlab. Jest tak, ponieważ uważam, że należy to zrobić na poziomie frameworka zamiast aplikacji. Innymi słowy, ta sama modyfikacja powinna włączyć funkcję asynchronizacji dla innych rozszerzeń języka, np. Języka R.
Czy ktoś ma dobre rozwiązanie? Do tej pory próbowałem, async.el
a także deferred.el
modyfikować, org-babel-execute-safely-maybe
które można obecnie znaleźć ob-core.el
.
Odpowiedzi:
Do tej pory odkryłem, że odrodzenie nowego procesu Emacsa jest rozwiązaniem.
Oto co zrobiłem.
1. Dodaj funkcję, aby rozpocząć proces zewnętrznego emacsa.
init.el
2. Dodaj plik konfiguracyjny, aby załadować w nowym procesie emacs.
Powyższa funkcja uruchamia emacsa w
--batch
trybie. W ten sposób normalny plik init.el nie zostanie załadowany.Zamiast tego chcemy utworzyć krótszy plik konfiguracyjny (w celu załadowania ścieżek itp.).
Ścieżka do naszego nowego pliku konfiguracyjnego jest zapisana we
async-emacs-repl-org-babel-init-file
fragmencie powyżej.org-babel-async-init.el
Tutaj my ...
Przypis 1: Bez tego ustawienia ocena zakończy się niepowodzeniem
"No org-babel-execute function for $lang!"
Przypis 2: Oczywiście, jeśli chcesz, możesz załadować normalny plik init.el zamiast tworzyć nowy plik konfiguracyjny. Zrób to, dodając
(setq org-babel-async-init-file "~/.emacs.d/init")
do swojegoinit.el
. Myślę jednak, że utworzenie pliku konfiguracyjnego dla tego zadania jest prostsze.3. Dodatkowo ...
Dodaj do init.el
Dodaj do org-babel-async-init.el
Dodaj do org-babel-async-init.el (możesz ich nie potrzebować. Są to dla MATLAB)
Dodaj do org-babel-async-init.el (możesz ich nie potrzebować. Są to dla Julii, R i innych języków używających ESS.)
4. Wykorzystanie
(Po powyższej konfiguracji.)
M-x my/async-emacs-repl-org-babel-execute
(zamiast robićC-c C-c
). W razie potrzeby uruchomi to zewnętrzny proces Emacsa jako serwer REPL, a następnie uruchom blok źródłowy, w którym się znajdujesz.Podziękowanie
Z tego postu dowiedziałem się, jak rozpocząć proces emacsa do oceny org-babel . Chciałbym podziękować autorowi.
Komentarze do dostosowania
Pomysł tutaj jest prosty. Zacznij nowy emacs przetwarzać jako REPL dla Elisp, należy
find-file
do tego samego pliku .org jesteśmy edytujesz,goto-line
do tego samego punktu kursora, prowadzonyorg-babel-execute-src-block
,save-buffer
. Przestań wychodzić, dopóki użytkownik nie zatrzyma procesu (w przeciwnym razie wykresy znikną natychmiast po ich wyświetleniu). Można oczywiście pomyśleć o rozszerzeniu tego przez:C-c C-c
zamiast uruchamiania funkcji ręcznie / ustawianie nowego skrótu klawiszowego (co można uzyskać za pomocą porad).Wydaje mi się, że sukces tego podejścia pokazuje ogólny sposób rozwijania funkcji asynchronicznych w Emacsie. Tworzenie warstwy „poleceń”, dodawanie skryptów do wykonywania zadań oraz tworzenie ram do uruchamiania i ponownego wykorzystywania procesów emacs. Podobnie jak framework Symfony PHP (PHP nie ma wątków) ma funkcje poleceń.
Edytuj historię
Kod refaktoryzowany (02.02.2016). Rozwiązanie wykorzystuje teraz proces Emacsa (2016-04-02). Rozwiązanie jest teraz uproszczone i ma tylko jedno
interactive
polecenie do uruchomienia (2016-04-02. Dodano konfigurację (2016-04-12).źródło
async.el
?lambda
przypisaną mu funkcję. Nie użyłem go do tego rozwiązania, ponieważ nie mogłem znaleźć sposobu na przesłanie danych do nowego procesu. Komunikowanie procesu jest konieczne, jeśli chcesz skorzystać z funkcji: 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.
pojawia się następujący komunikat o błędzie: Niestety, powinien to być komentarz, a nie odpowiedź, ale po prostu nie mam wystarczającej liczby punktów.org-babel-do-load-languages
. 3)#+SRC_BEGIN
Wykonywany blok zawiera błąd.M-x my/async-emacs-repl-org-babel-execute
, inaczej bufor „org-babel-asynchroniczny” będzie narzekać:...t/Dropbox/org/work.org locked by maarhart@htkl... (pid 68694): (s, q, p, ?)? Please type q, s, or p; or ? for help
. Gdyby można to rozwiązać, byłoby fantastycznie. W każdym razie dzięki za to jest niesamowite! Nawiasem mówiąc, czy można go powiązać,C-c C-c
czy będzie kolidować z trybem org?Dla przyszłych odniesień i gotowych bibliotek. Przyjmę tę odpowiedź, ponieważ są one nowsze.
ob-async
Oto biblioteka wykorzystująca async.el https://github.com/linktohack/ob-async
org-babel-eval-in-repl
Moje inne rozwiązanie (dostępne w Melpa): https://github.com/diadochos/org-babel-eval-in-repl
źródło