ผลลัพธ์ของ org-babel สามารถแสดงผลเป็นความคิดเห็นของรหัสได้หรือไม่


13

ในบล็อกตำรา ฯลฯ เป็นเรื่องธรรมดามากที่จะแสดงผลลัพธ์ของโค้ดบางส่วนเป็นความคิดเห็นเช่น:

(+ 1 1) ;=> 2

มีวิธีแสดงผลลัพธ์เช่นนี้โดยอัตโนมัติโดยใช้คุณสมบัติ Babel ของ Org-Mode หรือไม่

โดยเฉพาะสิ่งที่ฉันต้องการคือสามารถระบุส่วนหัวเช่นนี้:

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

จะเปลี่ยนเป็นสิ่งต่อไปนี้เมื่อฉันC-c C-c:

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

และถ้าฉันทำการเปลี่ยนแปลงบางอย่างเช่นนั้น ...

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

... และC-c C-cมันจะแทนที่ความคิดเห็นด้วยการอัปเดต:

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

หรือขาดสิ่งที่ฉันฝันไว้ข้างต้นมีวิธีง่าย ๆ ในการแสดงผลลัพธ์โดยเครื่องมือแสดงผลไฟล์ org ของ github ดังนั้นสิ่งต่อไปนี้จะสามารถมองเห็นได้ (โดยการจัดรูปแบบที่ฉันระบุในระดับเอกสาร):

#+RESULTS:
: 2

แนวคิดที่น่าสนใจ แต่ฉันไม่คิดว่าจะมีสิ่งใดมาพร้อม ฉันพยายามแก้ไขแบ็กเอนด์บาเบลที่เฉพาะเจาะจงเพื่อให้ได้ผลลัพธ์ในตำแหน่งที่กำหนดไว้ แม้ว่ามันจะดูซับซ้อน แต่เมื่อผลลัพธ์มีหลายบรรทัด
wvxvw

คำตอบ:


7

ลองนี้

ใช้บล็อคโค้ดที่มีชื่อและnowebส่วนหัวเพื่อเปลี่ยนรหัสของคุณให้เป็นโปรแกรมที่รู้หนังสือ

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

สร้างorgบล็อครหัสเพื่อจัดรูปแบบรหัสของคุณด้วยผลลัพธ์ของคุณ

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

ทำC-c C-cบนorgโค้ดบล็อกและคุณจะเห็นผลลัพธ์คล้ายกับโค้ดด้านล่าง:

#+RESULTS:
:RESULTS:

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

:END:

หากคุณโพสต์รหัสไปที่ Github คุณควรเห็น

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

รหัสนี้ทดสอบกับ
GNU Emacs 24.5.1 (x86_64-unknown-cygwin, GTK + เวอร์ชัน 3.14.13)
Org-Mode เวอร์ชั่น: 8.3.2
และ github


ขอบคุณ นี่เป็นวิธีที่มีประโยชน์และดูเหมือนยืดหยุ่นพอที่จะอนุญาตให้จัดรูปแบบผลลัพธ์ในแบบที่ฉันต้องการ แต่ฉันคิดว่ามัน (เช่นวิธีการแก้ปัญหาของตัวเอง) เกินไปที่จะสะดวกสำหรับบันทึกย่อหรือโพสต์บล็อกซึ่งเป็นสิ่งที่ฉันหวังว่าจะพบ บางทีการปรับเปลี่ยนบางอย่างเพื่อสร้างการพูดคุยกับฟังก์ชั่นนี้อาจทำให้ฉันไปถึงที่นั่นได้
parkeristyping

1
@parkeristyping - ฉันเห็นด้วย มัน verbose มากเกินไป ถ้ามันเป็นสิ่งที่ฉันจะทำค่อนข้างบ่อยเช่นบล็อกของผมมักจะเขียนโค้ดแม่แบบบางอย่างเพื่อสร้างรหัส org จัดรูปแบบในขั้นตอนที่ 2 :var my_code='("my-code" "my-other-code")จากนั้นฉันก็เพียงแค่การปรับปรุงตัวแปรผ่านเข้าสู่แม่กำเนิดเช่น ถึงอย่างนั้นมันก็ยังยุ่งยากกว่าที่ฉันต้องการ คุณต้องการให้ฉันอัปเดตคำตอบของฉันหรือไม่
Melioratus

@ parkeristyping - ฉันเพิ่งจะหาวิธีอื่น แต่มันต้องการให้คุณส่งออกไฟล์ org ต้นฉบับและโพสต์การส่งออกไปยัง GitHub
Melioratus

3

สิ่งที่ใกล้เคียงที่สุดที่ฉันสามารถทำได้ด้วยฟังก์ชั่น Babel ที่มีอยู่คือ:

ก่อนอื่นฉันกำหนดฟังก์ชัน emacs-lisp เพื่อเพิ่มผลลัพธ์ด้วย";=> ":

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

จากนั้นฉันจะประมวลผลผลลัพธ์โดยใช้:postหัวข้อ:

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

ส่งกลับค่าต่อไปนี้C-c C-cซึ่งจะแสดงบน github เนื่องจาก:exports bothส่วนหัว แต่มันอยู่ในบล็อกรหัสแยกต่างหาก

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

ฉันคิดว่ากลยุทธ์นี้ทำให้ไฟล์องค์กรรกเกินไปที่จะคุ้มค่า และถ้าฉันปิดการใช้งานการประเมินการยืนยันรหัสฉันต้องยอมรับสอง "คุณแน่ใจหรือว่าต้องการประเมินรหัส?" แจ้งให้ (หนึ่งสำหรับบล็อกโครงการและอีกหนึ่งสำหรับ elisp commentify)


1

คุณสามารถทำสิ่งนี้:

  1. เขียนของคุณชื่อหลายสายรหัสที่มาบล็อกได้ตามปกติ

  2. เปลี่ยนการตัดคำจากBEGIN/END_SRCเป็น…-EXAMPLE:

    # + NAME: แหล่งที่มาจริง
    # + BEGIN_EXAMPLE emacs-lisp
    (+ 3 4)
    (* 4 47)
    # + END_EXAMPLE
  1. วางและดำเนินการบล็อกนี้ภายใต้บล็อกรหัสแรก
    # + NAME: LispBlock
    # + HEADER:: var lcmds = real-source
    # + BEGIN_SRC emacs-lisp: ผลลัพธ์ผลลัพธ์: wrap src emacs-lisp
    (dolist (cmd (แยกสตริง lcmds "\ n"))
      (ยกเว้น (string = "" cmd)
        (princ
         (รูปแบบ "% s \ t; →% s \ n"
                 cmd (eval (รถยนต์ (อ่านจากสตริง cmd)))))
    # + END_SRC
  1. ผลลัพธ์:
    # + ผลลัพธ์: LispBlock
    # + BEGIN_src emacs-lisp
    (+ 3 4); → 7
    (* 4 47); → 188
    # + END_src
  1. เพิ่มบล็อกซอร์สหลายบรรทัดเพิ่มเติมพร้อมชื่อแต่ละชื่อตามที่ต้องการในข้อความของคุณ

  2. เพิ่ม#+CALL:บรรทัดที่คุณให้ชื่อของบล็อกเป็นlcmdsตัวแปร จำเป็นต้องใช้บล็อกการแปลงข้างต้นหนึ่งครั้งต่อเอกสารเท่านั้น

โปรดทราบว่าจำเป็นต้องเขียนบล็อกการแปลงในภาษาที่คุณกำลังปฏิบัติอยู่

ฉันพยายาม "แก้ปัญหาอัตโนมัติ" ที่ดีจาก @melioratus แต่พบปัญหาเกี่ยวกับสิ่งนั้นเมื่อฉันพบปัญหาข้างต้น

@jpkotta ขอบคุณสำหรับการชี้ให้เห็นการแก้ไขที่จำเป็นเพื่อหลีกเลี่ยงหมายเลข list-with-code-block-problem


1
วิธีแก้ปัญหาที่ฉลาดมาก! ขอบคุณสำหรับการโพสต์!
Melioratus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.