Bisakah hasil org-babel di-output sebagai komentar kode?

13

Di blog, buku teks, dll, sangat umum untuk menampilkan hasil dari beberapa kode sebagai komentar, misalnya:

(+ 1 1) ;=> 2

Apakah ada cara untuk menampilkan hasil seperti ini secara otomatis menggunakan fitur Babel Mode-Org?

Secara khusus, yang saya inginkan adalah dapat menentukan header seperti ini:

#+begin_src scheme <some headers>
(+ 1 1)
(/ 4 (* 2 2))
#+end_src

Akan berubah menjadi yang berikut saat saya C-c C-c:

#+begin_src scheme <some headers>
(+ 1 1) ;=> 2
(/ 4 (* 2 2)) ;=> 1
#+end_src

Dan kemudian jika saya melakukan beberapa perubahan, seperti ...

#+begin_src scheme <some headers>
(+ 1 5) ;=> 2
(/ 8 (* 2 2)) ;=> 1
#+end_src

... dan C-c C-c, itu akan menggantikan komentar dengan yang diperbarui:

#+begin_src scheme <some headers>
(+ 1 5) ;=> 6
(/ 8 (* 2 2)) ;=> 2
#+end_src

Atau, singkat dari apa yang saya impikan di atas, apakah ada cara mudah untuk mendapatkan hasil yang ditampilkan oleh rither file org github, sehingga yang berikut ini akan terlihat (idealnya dengan format yang saya tentukan pada level dokumen):

#+RESULTS:
: 2
parkeristyping
sumber
Ide yang menarik, tapi saya rasa tidak ada yang siap pakai. Saya akan mencoba untuk memodifikasi backend Babel spesifik untuk menempatkan hasil di tempat yang telah ditentukan. Meskipun ini tampak rumit, ketika hasilnya memiliki beberapa baris misalnya.
wvxvw

Jawaban:

7

coba ini

Gunakan blok kode bernama dan nowebtajuk untuk mengubah kode Anda menjadi program melek.

#+NAME: my-code
#+BEGIN_SRC elisp :exports none 
(+ 1 1)
#+END_SRC

#+NAME: my-other-code 
#+BEGIN_SRC elisp :exports none 
(/ 4 (* 2 2))
#+END_SRC

Buat orgblok kode untuk memformat kode Anda dengan hasil Anda

#+BEGIN_SRC org :results drawer replace :noweb yes :exports results 

  ,#+NAME: my-code-with-answer
  ,#+BEGIN_SRC elisp  :exports code 
  <<my-code>> ;=> <<my-code()>>
  <<my-other-code>> ;=> <<my-other-code()>>
  ,#+END_SRC


#+END_SRC

Lakukan C-c C-cpada orgblok kode dan Anda akan melihat hasil yang mirip dengan kode di bawah ini:

#+RESULTS:
:RESULTS:

#+NAME: my-code-with-answer
#+BEGIN_SRC elisp  :exports code 
(+ 1 1) ;=> 2
(/ 4 (* 2 2)) ;=> 1
#+END_SRC

:END:

Jika Anda memposting kode ke Github, Anda akan melihat

(+ 1 1) ;=> 2
(/ 4 (* 2 2)) ;=> 1

Kode ini diuji dengan
GNU Emacs 24.5.1 (x86_64-unknown-cygwin, GTK + Versi 3.14.13) Versi
Org-Mode: 8.3.2
dan github.

Melioratus
sumber
Terima kasih. Ini adalah pendekatan yang membantu dan tampaknya cukup fleksibel untuk memungkinkan pemformatan hasil dengan cara apa pun yang saya inginkan. Tapi, saya pikir itu (seperti solusi saya sendiri) terlalu bertele-tele untuk menjadi nyaman untuk catatan cepat atau posting blog, yang adalah apa yang saya harapkan. Mungkin beberapa modifikasi untuk membangun babel pada fungsi ini bisa membuat saya di sana.
parkeristyping
1
@parkeristyping - Saya setuju. Itu terlalu verbose. Jika itu sesuatu yang akan saya lakukan cukup sering, misalnya blog, saya biasanya menulis beberapa kode templat untuk menghasilkan kode org terformat dalam langkah 2. Kemudian saya hanya memperbarui variabel yang diteruskan ke generator templat, misalnya :var my_code='("my-code" "my-other-code"). Meski begitu masih lebih rumit dari yang saya inginkan. Apakah Anda ingin saya memperbarui jawaban saya?
Melioratus
@parkeristyping - Saya baru tahu cara lain tetapi mengharuskan Anda mengekspor file org asli dan memposting ekspor ke GitHub.
Melioratus
3

Yang paling dekat yang saya dapat capai dengan fungsionalitas Babel yang ada adalah sebagai berikut:

Pertama, saya mendefinisikan fungsi emacs-lisp untuk menambahkan hasil dengan ";=> ":

#+name: commentify
#+begin_src emacs-lisp :var result="" :exports none
(concat ";=> " (format "%s" result))
#+end_src

Lalu saya memproses hasil menggunakan :postheader:

#+begin_src scheme :post commentify(*this*) :results code :exports both
(+ 5 7)
#+end_src

Ini mengembalikan yang berikut ini C-c C-c, yang ditampilkan pada github karena :exports bothheader, tetapi dalam blok kode yang terpisah.

#+RESULTS:
#+BEGIN_SRC scheme
;=> 12
#+END_SRC

Saya pikir strategi ini membuat file org terlalu berantakan untuk menjadi sia-sia. Dan, kecuali saya menonaktifkan konfirmasi evaluasi kode, saya harus menerima dua "Anda yakin ingin mengevaluasi kode?" bisikan (satu untuk blok Skema dan satu untuk elisp commentify).

parkeristyping
sumber
1

Anda dapat melakukan sesuatu seperti ini:

  1. Menulis Anda bernama Multi-Baris blok kode sumber seperti biasa

  2. Ubah pembungkus dari BEGIN/END_SRCmenjadi …-EXAMPLE:

    # + NAME: sumber asli
    # + BEGIN_EXAMPLE emacs-lisp
    (+ 3 4)
    (* 4 47)
    # + END_EXAMPLE
  1. Rekatkan dan jalankan blok ini di bawah blok kode pertama.
    # + NAME: LispBlock
    # + HEADER:: var lcmds = real-source
    # + BEGIN_SRC emacs-lisp: hasil keluaran: wrap src emacs-lisp
    (dolist (cmd (split-string lcmds "\ n"))
      (kecuali (string = "" cmd)
        (pangeran
         (format "% s \ t; →% s \ n"
                 cmd (eval (mobil (read-from-string cmd))))))))
    # + END_SRC
  1. Hasil:
    # + HASIL: LispBlock
    # + BEGIN_src emacs-lisp
    (+ 3 4); → 7
    (* 4 47); → 188
    # + END_src
  1. Tambahkan blok sumber multisaluran tambahan dengan nama individual sesuai kebutuhan ke dalam teks Anda

  2. Tambahkan #+CALL:baris tempat Anda memberi nama Blok sebagai lcmdsvariabel. Blok transformasi di atas hanya diperlukan satu kali per dokumen.

Perhatikan bahwa blok Transformasi perlu ditulis dalam bahasa yang Anda gunakan.

Saya pertama kali mencoba "mengotomatisasi" solusi yang baik dari @melioratus, tetapi mengalami masalah dengan itu, ketika saya berlari ke solusi di atas.

@ jpkotta thx untuk menunjukkan perbaikan yang diperlukan untuk menghindari masalah nomor-daftar-dengan-kode-blok.

Alex Stragies
sumber
1
Solusi yang sangat cerdas! Terima kasih untuk posting!
Melioratus