Чи можуть результати 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

Або, окрім того, що я мріяв вище, чи є простий спосіб відобразити результати, виведені органом github org file renderer, щоб було видно наступне (в ідеалі з форматуванням, яке я задаю на рівні документа):

#+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 + Version 3.14.13) Версія для
Org-Mode: 8.3.2
та github.


Дякую. Це корисний підхід і здається досить гнучким, щоб дозволити форматування результатів будь-яким способом. Але я думаю, що це (як і моє власне рішення) є надто багатослівним, щоб бути зручним для швидких записок або публікацій в блозі, що я сподівався знайти. Можливо, деякі модифікації побудови бабеля на цій функціональності могли б мене там примусити.
паркеристистинг

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 занадто захаращеним, щоб його вартувати. І якщо я не відключую підтвердження оцінки коду, я повинен прийняти два "Ви впевнені, що хочете оцінити код?" підказки (один для блоку Scheme і один для elisp commentify).


1

Ви можете зробити щось подібне:

  1. Запишіть названий блок багаторядкового вихідного коду як завжди

  2. Змініть обгортку з BEGIN/END_SRCна …-EXAMPLE:

    # + ІМЯ: реальний джерело
    # + BEGIN_EXAMPLE emacs-lisp
    (+ 3 4)
    (* 4 47)
    # + END_EXAMPLE
  1. Вставте та виконайте цей блок під перший блок коду.
    # + НАЗВА: LispBlock
    # + HEADER:: var lcmds = реальний джерело
    # + BEGIN_SRC emacs-lisp: результат виведення: wrap src emacs-lisp
    (доліст (cmd (розділений рядок lcmds "\ n"))
      (якщо тільки (string = "" cmd)
        (принц
         (формат "% 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
Дуже розумне рішення! Дякуємо за публікацію!
Меліорат
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.