Apakah ada penyesuaian umum yang baik dari org-babel untuk berjalan secara tidak sinkron? Baru-baru ini saya berencana untuk menggunakan MATLAB melalui org-babel, tetapi saya ingin itu secara async, karena beberapa perhitungan memang membutuhkan waktu.
Saya tidak ingin mengkustomisasi ob-matlab saja. Ini karena saya pikir itu harus dilakukan di level framework daripada aplikasi. Dengan kata lain, modifikasi yang sama harus mengaktifkan fitur async untuk ekstensi bahasa lain, misalnya bahasa R.
Adakah yang punya solusi yang bagus? Sejauh ini saya telah mencoba async.el
dan deferred.el
memodifikasi org-babel-execute-safely-maybe
yang dapat ditemukan ob-core.el
pada saat ini.
Jawaban:
Sejauh ini saya telah menemukan bahwa menelurkan proses Emacs baru adalah solusi.
Inilah yang telah saya lakukan.
1. Tambahkan fungsi untuk memulai proses emacs eksternal.
init.el
2. Tambahkan file konfigurasi untuk dimuat dalam proses emacs baru.
Fungsi di atas memulai emacs dalam
--batch
mode. Dengan demikian init.el yang normal tidak akan dimuat.Sebagai gantinya, kami ingin membuat file konfigurasi yang lebih pendek (untuk memuat path dan sebagainya).
Path ke file konfigurasi baru kami disimpan di
async-emacs-repl-org-babel-init-file
dalam cuplikan di atas.org-babel-async-init.el
Disini kita ...
Catatan Kaki 1: Tanpa pengaturan ini, evaluasi akan gagal dengan
"No org-babel-execute function for $lang!"
Catatan kaki 2: Tentu saja Anda dapat memuat init.el normal daripada membuat file konfigurasi baru, jika diinginkan. Lakukan itu dengan menambahkan
(setq org-babel-async-init-file "~/.emacs.d/init")
keinit.el
. Tapi saya pikir membuat file konfigurasi untuk tugas ini lebih mudah.3. Selain itu ...
Tambahkan ke init.el
Tambahkan ke org-babel-async-init.el
Tambahkan ke org-babel-async-init.el (Anda mungkin tidak membutuhkan ini. Ini untuk MATLAB)
Tambahkan ke org-babel-async-init.el (Anda mungkin tidak membutuhkan ini. Ini untuk Julia, R dan bahasa lain yang menggunakan ESS.)
4. Penggunaan
(Setelah pengaturan di atas.)
M-x my/async-emacs-repl-org-babel-execute
(bukannya melakukanC-c C-c
). Ini akan memulai proses Emacs eksternal sebagai server REPL jika diperlukan, dan kemudian jalankan blok sumber Anda.Ucapan Terima Kasih
Saya telah belajar ide memulai proses emacs untuk evaluasi org-babel dari posting ini . Saya ingin mengucapkan terima kasih kepada penulis.
Komentar untuk penyesuaian
Idenya di sini sederhana. Mulai emacs baru memproses sebagai REPL untuk Elisp, lakukan
find-file
ke file .org sama kita mengedit,goto-line
ke titik kursor yang sama, berjalanorg-babel-execute-src-block
,save-buffer
. Berhenti keluar sampai pengguna menghentikan proses (Jika tidak, grafik akan langsung hilang setelah ditampilkan). Seseorang dapat secara alami berpikir untuk memperpanjang ini dengan:C-c C-c
daripada menjalankan fungsi dengan tangan / mengatur keybind baru (yang dapat dicapai dengan saran).Sebenarnya, keberhasilan pendekatan ini menurut saya menunjukkan cara umum mengembangkan fitur-fitur async di Emacs. Membuat lapisan "perintah", menambahkan skrip untuk melakukan tugas, dan memiliki kerangka kerja untuk memulai dan menggunakan kembali proses emacs. Sama seperti kerangka kerja Symfony dari PHP (PHP tidak memiliki utas) memiliki fitur Command.
Edit riwayat
Kode yang di-refactored (2016-04-02). Solusi sekarang menggunakan kembali proses Emacs (2016-04-02). Solusi sekarang disederhanakan dan hanya memiliki satu
interactive
perintah untuk dijalankan (2016-04-02. Konfigurasi tambahan (2016-04-12).sumber
async.el
?lambda
fungsi yang diberikan padanya. Saya tidak menggunakannya untuk solusi ini karena saya tidak dapat menemukan cara untuk mengirim data ke proses baru. Mengkomunikasikan proses diperlukan jika Anda ingin menggunakan: sesi fitur dari 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.
Maaf, ini seharusnya menjadi komentar dan bukan jawaban, tetapi saya tidak punya cukup poin.org-babel-do-load-languages
. 3)#+SRC_BEGIN
Blok yang Anda jalankan mengandung bug.M-x my/async-emacs-repl-org-babel-execute
, jika tidak "org-babel-async" penyangga akan mengeluh:...t/Dropbox/org/work.org locked by maarhart@htkl... (pid 68694): (s, q, p, ?)? Please type q, s, or p; or ? for help
. Jadi jika ini bisa diselesaikan, itu akan fantastis. Bagaimanapun, terima kasih untuk ini, sungguh menakjubkan! Omong-omong, apakah mungkin untuk mengikatnyaC-c C-c
atau akankah itu bertentangan dengan mode-org?Untuk referensi di masa mendatang dan perpustakaan di luar kotak. Saya akan menerima jawaban ini karena jawabannya lebih baru.
ob-async
Berikut perpustakaan menggunakan async.el https://github.com/linktohack/ob-async
org-babel-eval-in-repl
Solusi saya yang lain (tersedia dalam melpa): https://github.com/diadochos/org-babel-eval-in-repl
sumber