可以将org-babel结果作为代码注释输出吗?


13

在博客,教科书等中,通常将某些代码的结果显示为注释,例如:

(+ 1 1) ;=> 2

有没有一种方法可以使用Org-Mode的Babel功能自动显示这样的结果?

具体来说,我想要的是能够指定这样的标头:

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

或者,除了我在上面做的梦之外,有没有一种简单的方法可以让github的org文件渲染器显示结果,因此以下内容将是可见的(理想情况下是我在文档级别指定的格式):

#+RESULTS:
: 2

有趣的主意,但我认为没有现成的东西。我会尝试修改特定的Babel后端,以将结果放置在预定位置。尽管这看起来很复杂,但是例如当结果有多行时。
wvxvw

Answers:


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)
组织模式版本:8.3.2
和github中进行了测试。


谢谢。这是一种有用的方法,似乎足够灵活,可以按照我想要的任何方式格式化结果。但是,我认为它(像我自己的解决方案一样)太冗长,以至于无法快速写笔记或写博客帖子,而这正是我希望找到的。不过,也许对基于此功能的babel进行一些修改可以使我到达那里。
parkeristyping '16

1
@parkeristyping-我同意。太冗长了。如果我经常这样做(例如博客),我通常会在步骤2中编写一些模板代码来生成格式化的组织代码。然后,我只需更新传递到模板生成器中的变量,例如:var my_code='("my-code" "my-other-code")。即使这样,它仍然比我想要的麻烦。您要我更新我的答案吗?
Melioratus

@parkeristyping-我刚刚想出了另一种方法,但是它要求您导出原始的组织文件,并将导出内容发布到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,由于:exports both标题,该内容的确显示在github上,但它在单独的代码块中。

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

我认为这种策略会使org文件过于混乱,以至于不值得。并且,除非禁用代码评估确认,否则我必须接受两个“您确定要评估代码吗?”。提示(一个用于Scheme块,另一个用于elisp commentify)。


1

您可以执行以下操作:

  1. 照常编写命名的 Multi-Line源代码块

  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
    (清单(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 thx指出了避免数字列表与代码块问题所需的修复程序。


1
非常聪明的解决方法!感谢您的发布!
Melioratus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.