Emacs. Org Babel
Org Babel.
Содержание
1 Общая информация
- Org Babel используется для работы с исходным кодом разных языков программирования внутри org-mode.
- Исходный код задаётся в блоке
#+BEGIN_SRC...#+END_SRC
. - Для редактирования и форматирования блока исходного кода используется соответствующий основной режим Emacs, включающий функции, специально разработанные для исходного кода на этом языке.
- Для выполнения компиляции блока исходного кода можно использовать соответствующий компилятор.
- Важной особенностью управления блоками исходного кода в org-mode является возможность передавать переменные, функции и результаты друг другу, используя общий синтаксис для блоков исходного кода на любом языке.
- Документация: https://org-babel.readthedocs.io/
2 Структура блока кода
- Исходный код может быть в блоке исходного кода и непосредственно в строке.
- Блок исходного кода:
#+NAME: <name> #+BEGIN_SRC <language> <switches> <header arguments> <body> #+END_SRC
- Блок встроенного кода:
src_<language>[<header arguments>]{<body>}
- Основные элементы:
#+NAME: <name>
: опциональное название блока исходного кода.#+BEGIN_SRC … #+END_SRC
: обязательные ограничители блока.<language>
: обязательный идентификатор языка исходного кода в блоке.<switches>
: опциональная настройка кодового блока.<header arguments>
: опциональные аргументы заголовка. Управляют многими аспектами выполнения и экспорта блоков кода.<body>
: исходный код.
3 Исполнение кода блоков
3.1 Исполнение исходного кода
Org захватывает результаты выполнения блока кода и вставляет их в файл Org сразу после блока кода.
Точка вставки находится после новой строки и ключевого слова
RESULTS
(оно создаётся, если его не было).По умолчанию Org разрешает выполнение только блоков кода Emacs Lisp.
Выполнение блоков кода:
C-c C-c
илиC-c C-v e
на кодовом блоке вызывает функциюorg-babel-execute-src-block
, которая выполняет код в блоке, собирает результаты и вставляет их в буфер.Содержимое блока кода может быть исполнено из другого места файла.
Вызов можно выполнить с помощью ключевого слова:
#+CALL: <name>(<arguments>) #+CALL: <name>[<inside header arguments>](<arguments>) <end header arguments>
Можно использовать встроенные вызовы:
... call_<name>(<arguments>) ... ... call_<name>[<inside header arguments>](<arguments>)[<end header arguments>] ...
- В этом случае результат представляется на основе переменной
org-babel-inline-result-wrap
, для которой по умолчанию задано значение=%s=
для получения дословного текста.
- В этом случае результат представляется на основе переменной
Параметры вызова:
<name>
: имя блока кода. Если блок находится в другом файле, имя предваряется именем файла, за которым следует двоеточие.<arguments>
: аргументы, передаваемые в блок кода.<inside header arguments>
: внутренние аргументы заголовка в именованном блоке кода.<end header arguments>
: влияют на результаты, возвращаемые блоком кода.
3.2 Ограничение на исполнение кода
- Аргумент заголовка
eval
может ограничивать выполнение определённых блоков кода (в основном для обеспечения безопасности):never
илиno
: никогда не исполнять код;query
: запрашивает у пользователя разрешение на исполнение исходного кода;never-export
илиno-export
: не исполнять исходный код при экспорте;query-export
: запрашивает у пользователя разрешение на исполнение исходного кода во время экспорта.
- Запрос на выполнение управляется переменной
org-confirm-babel-evaluate
. - Чтобы отключить запрос на выполнение, следует установить:
(setq org-confirm-babel-evaluate nil)
4 Экспорт блоков кода
- Можно экспортировать код из блоков babel, результаты выполнения блока кода.
- Аргумент заголовка
:exports
должен указывать, экспортируется ли эта часть файла:code
(:exports code
) : Обычно является значением по умолчанию. Код включается в экспортируемый файл.results
(:exports results
) : Результаты выполнения кода включаются в экспортируемый файл.both
(:exports both
) : И код, и результаты выполнения включаются в экспортируемый файл.none
(:exports none
) : Ни код, ни результаты выполнения не включаются в экспортируемый файл.
- Чтобы не выполнять блоки кода для ускорения экспорта, используется аргумент заголовка
:eval never-export
. - Для отключения исполнения кода глобально следует установить переменную
org-export-use-babel
в значениеnil
.
5 Экспорт рисунков svg
- При экспорте результатов вычисления, являющимися фигурами в формате
svg
, можно внедрить код в текст. - Для этого нужно добавить к результату атрибут:
#+attr_html: :inlined t
6 Задание конфигурации в свойствах
6.1 Аргументы заголовка уровня буфера
- Строка
#+PROPERTY:
, расположенная в любом месте буфера, влияет на весь файл. Она устанавливает глобальное свойство. - Для babel свойства задаются для
header-args
. - Сгенерить все блоки исходного кода в файле:
#+PROPERTY: header-args :tangle yes
- Можно указать несколько аргументов:
#+PROPERTY: header-args :results output :cache yes
- Можно объединять свойства (накопленные значения):
#+PROPERTY: header-args:R :exports results #+PROPERTY: header-args:R+ :width 800
6.2 Аргументы заголовка поддерева
- Блок
:PROPERTIES:
действителен только для данного дерева (и поддеревьев):* Outline heading :PROPERTIES: :header-args: :results output :cache yes :END:
6.3 Аргументы заголовка блока кода
- Можно параметры указывать непосредственно в блоке кода:
#+header: :exports code :var data=2 #+begin_src emacs-lisp ... some code ... #+end_src