Jika saya menjalankan blok babel shell berikut
#+BEGIN_SRC sh :session one :results output
ssh staging
#+END_SRC
#+BEGIN_SRC sh :session one :results output
hostname
#+END_SRC
Org membuat buffer shell yang disebut one
, dijalankan ssh staging
dan kemudian setelah terhubung, dijalankan hostname
pada staging. Namun, jika saya mengubah perintah ssh dan menjalankannya lagi, ia mencoba menjalankannya dari dalam sesi satu, dari host pentas. Jika saya menutup buffer one
itu me-reset sesi sebagai kali berikutnya perintah dijalankan dengan nama sesi itu akan membuatnya kembali. Apa yang saya belum dapat temukan adalah metode untuk memaksa blok babel tertentu untuk selalu menginisialisasi sesi baru.
Saya sadar bahwa untuk beberapa bahasa (khususnya khususnya elisp) ini tidak mungkin. Saya kira saya bisa menambahkan sesi dengan berisi blok elisp (kill-buffer "one")
, tetapi lebih baik jika ini adalah argumen header jika memungkinkan. Saya juga menyadari bahwa untuk contoh ini saya hanya bisa menggabungkan keduanya menjadi satu blok tanpa sesi, tapi saya tertarik pada urutan yang lebih rumit.
Apakah ada :prologue
perintah atau argumen khusus lainnya :session
yang memaksa yang memblokir untuk menginisialisasi shell baru pada setiap doa?
org-babel-initiate-session
.Jawaban:
Coba ini
Memaksa sesi org-babel untuk mengatur ulang atau menginisialisasi dengan menggunakan pernyataan kondisional elisp untuk secara dinamis mengatur nilai : header sesi pada blok kode pertama.
misalnya
:session (if (get-buffer "one") (if (kill-buffer "one") (print "one") (print "one")) (print "one"))
Dalam kode di atas, fungsi get-buffer memeriksa apakah buffer bernama satu ada. Jika benar, membunuh-buffer fungsi membunuh yang satu penyangga kemudian mengembalikan nilai
t
ataunil
yang diteruskan keif
pernyataan. Dalam contoh khusus ini,if
pernyataan bersarang akan selalu mengembalikan nilai satu . Harap dicatat, saya masih belajar elisp.Di bawah ini adalah contoh kode yang diperbarui:
Setiap kali blok kode pertama dieksekusi, emacs akan meminta untuk membunuh satu buffer , sehingga Anda dapat mengatur ulang sesi saat Anda inginkan.
Harapan itu membantu!
Catatan: Kode ini diuji menggunakan versi emacs dan mode-org berikut.
Sebagai kesimpulan, saya menemukan inspirasi teknis untuk jawaban ini di situs web org-memo dan kode contoh kill-buffer di stackoverflow.
sumber
kill-buffer
untuk memaksa sesi baru, tetapi lebih tertarik untuk belajar jika ada argumen blok dibangun ke mode-org, atau konvensi mapan lainnya untuk melakukan ini yang tidak saya sadari. Pendekatan Anda adalah solusi yang bagus, tetapi saya berharap ada pendekatan kanonik untuk ini.:session one :session-reset yes
?Terinspirasi oleh @Melioratus.
Saat ini, org-babel menyediakan hook yang disebut
org-babel-after-execute-hook
. Saya memperluas argumen yang didukung dari blok org-babel src dengan menggunakannya:(Saya menggunakan org-babel untuk elixir. Jika Anda ingin dukungan bahasa lain, perluas
cond
sendiri.)Setelah mengevaluasi kode di atas, Anda dapat menulis blok src seperti ini:
Setelah mengevaluasi blok src, org-babel akan membersihkan sesi yang sesuai.
sumber