Могут ли результаты 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
parkeristyping
источник
Интересная идея, но я не думаю, что есть что-то готовое. Я бы попытался изменить конкретный бэкэнд 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: 8.3.2
и github.

Melioratus
источник
Благодарю. Это полезный подход, и он кажется достаточно гибким, чтобы позволить форматировать результаты любым удобным для меня способом. Но я думаю, что это (как и мое собственное решение) слишком многословно, чтобы быть удобным для быстрых заметок или постов в блоге, что я и надеялся найти. Возможно, некоторые изменения в построении вавилонской игры на этой функциональности могут привести меня туда.
parkeristyping
1
@parkeristyping - я согласен. Это слишком многословно. Если это то, что я собираюсь делать довольно часто, например, блог, я обычно пишу код шаблона для генерации отформатированного кода org на шаге 2. Затем я просто обновляю переменную, передаваемую в генератор шаблонов, например :var my_code='("my-code" "my-other-code"). Несмотря на это, это все еще более громоздко, чем мне бы хотелось. Вы хотите, чтобы я обновил свой ответ?
Мелиоратус
@parkeristyping - я только что нашел другой способ, но он требует, чтобы вы экспортировали оригинальный файл org и опубликовали экспорт в GitHub.
Мелиоратус
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

Я думаю, что эта стратегия оставляет файл org слишком загроможденным, чтобы того стоить. И, если я не отключу подтверждение оценки кода, я должен принять два сообщения: «Вы уверены, что хотите оценить код?» приглашения (один для блока схемы и один для elisp commentify).

parkeristyping
источник
1

Вы можете сделать что-то вроде этого:

  1. Напишите ваш названный многострочный блок исходного кода как обычно

  2. Измените упаковку с BEGIN/END_SRCна …-EXAMPLE:

    # + ИМЯ: реальный источник
    # + BEGIN_EXAMPLE emacs-lisp
    (+ 3 4)
    (* 4 47)
    # + END_EXAMPLE
  1. Вставьте и выполните этот блок под первым блоком кода.
    # + ИМЯ: 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переменной. Вышеуказанный блок преобразования требуется только один раз для каждого документа.

Обратите внимание, что блок Transforming должен быть написан на языке, который вы обрабатываете.

Сначала я попытался «автоматизировать» хорошее решение от @melioratus, но столкнулся с проблемами, когда столкнулся с вышеуказанным решением.

@jpkotta, спасибо за указание на исправление, необходимое для избежания проблемы с числом-списком-кодом-блоком.

Алекс Страгиес
источник
1
Очень умный обходной путь! Спасибо за публикацию!
Мелиоратус