Kết quả org-babel có thể được xuất ra dưới dạng nhận xét mã không?


13

Trong blog, sách giáo khoa, v.v., thực sự phổ biến để hiển thị kết quả của một số mã dưới dạng nhận xét, ví dụ:

(+ 1 1) ;=> 2

Có cách nào để tự động hiển thị kết quả như thế này bằng tính năng Babel của Org-Mode không?

Cụ thể, điều tôi muốn là có thể chỉ định một tiêu đề sao cho:

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

Sẽ biến thành như sau khi tôi C-c C-c:

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

Và sau đó nếu tôi thực hiện một số thay đổi, như vậy ...

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

... và C-c C-c, nó sẽ thay thế các bình luận bằng các bình luận được cập nhật:

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

Hoặc, ngắn gọn với những gì tôi đã mơ ở trên, có một cách dễ dàng để có kết quả được hiển thị bởi trình kết xuất tệp org của github, do đó, phần sau sẽ hiển thị (lý tưởng với định dạng mà tôi chỉ định ở cấp độ tài liệu):

#+RESULTS:
: 2

Ý tưởng thú vị, nhưng tôi không nghĩ có gì đã sẵn sàng. Tôi sẽ cố gắng sửa đổi phụ trợ Babel cụ thể để đặt kết quả vào vị trí được xác định trước. Mặc dù điều này có vẻ phức tạp, khi kết quả có nhiều dòng chẳng hạn.
wvxvw

Câu trả lời:


7

thử đi

Sử dụng các khối mã và nowebtiêu đề được đặt tên để biến mã của bạn thành một chương trình biết chữ.

#+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

Tạo một orgkhối mã để định dạng mã của bạn với kết quả của bạn

#+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

Thực hiện C-c C-ctrên orgkhối mã và bạn sẽ thấy kết quả tương tự như mã bên dưới:

#+RESULTS:
:RESULTS:

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

:END:

Nếu bạn đăng mã lên Github, bạn sẽ thấy

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

Mã này đã được thử nghiệm với
GNU Emacs 24.5.1 (x86_64-unknown-cygwin, GTK + Phiên bản 3.14.13)
Org-Mode Phiên bản: 8.3.2
và github.


Cảm ơn. Đây là một cách tiếp cận hữu ích và có vẻ đủ linh hoạt để cho phép định dạng kết quả theo bất kỳ cách nào tôi muốn. Nhưng, tôi nghĩ rằng nó (như giải pháp của riêng tôi) quá dài dòng để thuận tiện cho ghi chú nhanh hoặc bài đăng trên blog, đó là những gì tôi đã hy vọng tìm thấy. Có lẽ một số sửa đổi để xây dựng babel trên chức năng này có thể đưa tôi đến đó, mặc dù.
parkeristyping

1
@parkeristyping - Tôi đồng ý. Thật quá dài dòng. Nếu đó là điều tôi sẽ làm khá thường xuyên, ví dụ blog, tôi thường viết một số mã mẫu để tạo mã org được định dạng ở bước 2. Sau đó, tôi chỉ cập nhật một biến được truyền vào trình tạo mẫu, ví dụ :var my_code='("my-code" "my-other-code"). Mặc dù vậy nó vẫn còn cồng kềnh hơn tôi muốn. Bạn có muốn tôi cập nhật câu trả lời của tôi?
Melioratus

@parkeristyping - Tôi chỉ tìm ra một cách khác nhưng nó yêu cầu bạn xuất tệp org gốc và đăng xuất lên GitHub.
Melioratus

3

Cách gần nhất mà tôi có thể thực hiện với chức năng Babel hiện có là:

Đầu tiên, tôi định nghĩa một hàm emacs-lisp để trả trước kết quả bằng ";=> ":

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

Sau đó, tôi xử lý kết quả bằng :posttiêu đề:

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

Cái này trả về cái sau C-c C-c, cái này hiển thị trên github do :exports bothtiêu đề, nhưng nó nằm trong một khối mã riêng.

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

Tôi nghĩ rằng chiến lược này làm cho tập tin org quá lộn xộn để có giá trị nó, mặc dù. Và, trừ khi tôi vô hiệu hóa xác nhận đánh giá mã, tôi phải chấp nhận hai "Bạn có chắc chắn muốn đánh giá mã không?" lời nhắc (một cho khối Scheme và một cho elisp commentify).


1

Bạn có thể làm một cái gì đó như thế này:

  1. Viết khối mã nguồn nhiều dòng có tên của bạn như bình thường

  2. Thay đổi gói từ BEGIN/END_SRCthành …-EXAMPLE:

    # + NAME: nguồn thực
    # + BEGIN_EXAMPLE emacs-lisp
    (+ 3 4)
    (* 4 47)
    # + END_EXAMPLE
  1. Dán và thực hiện khối này dưới khối mã đầu tiên.
    # + TÊN: LispBlock
    # + TIÊU ĐỀ :: var lcmds = nguồn thực
    # + BEGIN_SRC emacs-lisp: kết quả đầu ra: quấn src emacs-lisp
    (cá heo (cmd (chuỗi lcmds "\ n"))
      (trừ khi (chuỗi = "" cmd)
        (hoàng tử
         (định dạng "% s \ t; →% s \ n"
                 cmd (eval (xe hơi (đọc từ chuỗi cmd))))))))
    # + END_SRC
  1. Kết quả:
    # + KẾT QUẢ: LispBlock
    # + BEGIN_src emacs-lisp
    (+ 3 4); → 7
    (* 4 47); → 188
    # + END_src
  1. Thêm các khối nguồn đa dòng bổ sung với các tên riêng lẻ khi cần vào văn bản của bạn

  2. Thêm #+CALL:dòng nơi bạn đặt tên của Khối làm lcmdsbiến. Khối biến đổi ở trên chỉ cần một lần cho mỗi tài liệu.

Lưu ý rằng khối Biến đổi cần được viết bằng ngôn ngữ mà bạn đang xử lý.

Lần đầu tiên tôi đã thử "tự động hóa" giải pháp tốt từ @melioratus, nhưng gặp vấn đề với điều đó, khi tôi gặp phải giải pháp trên.

@jpkotta thx vì đã chỉ ra cách khắc phục cần thiết để tránh vấn đề về danh sách số với mã-khối-mã.


1
Cách giải quyết rất thông minh! Cảm ơn vì đăng!
Melioratus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.