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

回答:


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でテストされました。


ありがとう。これは有用なアプローチであり、私が望むどんな方法でも結果のフォーマットを可能にするのに十分な柔軟性があるようです。しかし、それは(私自身の解決策のように)冗長すぎて、簡単なメモやブログ投稿に便利ではないので、それを見つけたいと思っていました。ただし、この機能に基づいてbabelを変更すると、そこに到達する可能性があります。
parkeristyping

1
@parkeristyping-同意します。あまりにも冗長です。ブログなどかなり頻繁にやる場合は、通常、ステップ2でフォーマット済みの組織コードを生成するテンプレートコードを作成します。その後、テンプレートジェネレーターに渡される変数を更新します:var my_code='("my-code" "my-other-code")。それでも、それは私が望むよりもさらに面倒です。私の答えを更新しますか?
Melioratus 16

@parkeristyping-別の方法を見つけたところですが、元の組織ファイルをエクスポートし、エクスポートをGitHubに投稿する必要があります。
Melioratus 16

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

ただし、この戦略では、組織ファイルは散らかりすぎて価値がありません。また、コード評価の確認を無効にしない限り、「コードを評価してもよろしいですか?」という2つを受け入れる必要があります。プロンプト(Schemeブロック用と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:results output:wrap src emacs-lisp
    (dolist(cmd(split-string lcmds "\ n"))
      (ただし(string = "" cmd)
        (princ
         (フォーマット "%s \ t;→%s \ n"
                 cmd(eval(car(read-from-string cmd))))))))
    #+ END_SRC
  1. 結果:
    #+結果:LispBlock
    #+ BEGIN_src emacs-lisp
    (+ 3 4); →7
    (* 4 47); →188
    #+ END_src
  1. テキストに必要に応じて個々の名前を持つ複数行ソースブロックを追加します

  2. #+CALL:ブロックの名前をlcmds変数として指定する行を追加します。上記の変換ブロックは、ドキュメントごとに1回だけ必要です。

Transformingブロックは、扱う言語で記述する必要があることに注意してください。

最初に@melioratusから適切なソリューションを「自動化」しようとしましたが、上記のソリューションに遭遇したときに問題が発生しました。

number-list-with-code-block-problemを回避するために必要な修正を指摘した@jpkotta thx。


1
非常に賢い回避策!投稿していただきありがとうございます!
Melioratus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.