Emacs: Exportando bloques de código
2023-03-13
Índice
- Configurando Babel
- Definiendo bloques de código
- Ejecutando bloques de código
- Exportando bloques de código
- Referencia
Muchas veces cuando escribo un articulo para el blog, hago referencia a comandos o contenido de ficheros del sistema.
Una manera fácil de obtener el resultado de esos comandos o ficheros para crear el articulo es ejecutar el código en una ventana de la terminal, copiar y pegar la salida al fichero õrg
, pero gracias a una de las muchas cualidades de orgmode, podemos utilizar Babel para ejecutar bloques de código y exportarlo a un archivo.
Configurando Babel
A partir de Org 7.0, Babel se incluye como parte de Org, simplemente en nuestro fichero de configuración tenemos que activar los idiomas que deseamos usar con Babel.
El siguiente código en el archivo de configuración de Emacs activa los lenguajes lisp
, python
y la sheell
del sistema.
(org-babel-do-load-languages
'org-babel-load-languages
'((lisp . t)
(python . t)
(shell . t)
))
Babel soporta multitud de lenguajes de programación, puedes echarles un ojo en https://orgmode.org/worg/org-contrib/babel/languages/index.html#configure
Definiendo bloques de código
Empecemos con un ejemplo simple, vamos evaluar la salida del comando del sistema tree -L 1
, para ello podemos hacer uso de las plantillas predefinidas, teclea M x org-insert-structure-templatee
o C-c C-,
y selecciona s shell
,
Automáticamente nos crea la estructura del bloque #+begin_src shell
y #+end_src
, añadimos :results output code
a la cabecera y ponemos el código a evaluar dentro de esta estructura
#+begin_src shell :results output code
tree -L 1
#+end_src
Ejecutando bloques de código
Si pulsas C-c C-c
sobre la linea #+begin_src shell
o dentro del bloque, se ejecutará el código y el resultado se insertará en el fichero org
tree -L 1
#+begin_src shell
.
├── archetypes
├── blog.org
├── config.toml
├── content
├── data
├── layouts
├── public
├── resources
├── static
└── themes
9 directories, 2 files
#+end_src
output
muestra el resultado impreso en stdout (normamalmete la pantalla) durante la ejecución del código de ese bloque.
code
muestra el resultado encerrado en un bloque de código.
Exportando bloques de código
Como lo que quiero es poder exportar el código y el resultado a mi fichero markdown cuando hago uso de ox-hugo, utilizo el parámetro :exports
El argumento :exports
especifica si esa parte del archivo se exporta
both
exporta tanto el código como los resultados de la evaluación
El siguiente código en el fichero org
#+begin_src shell :results output code :exports both
tree -L 1
#+end_src
Cuando procedemos a exportarlo, C-c C-e
, nos pregunta si queremos evaluar el bloque de código, podemos contestar n si ya lo habíamos ejecutado.
Produce este resultado al ser exportado en ox-hugo
tree -L 1
.
├── archetypes
├── blog.org
├── config.toml
├── content
├── data
├── layouts
├── public
├── resources
├── static
└── themes
9 directories, 2 files
ejemplos con otros lenguajes
#+begin_src python :results output code :exports both
for i in range(2, 5):
print(i)
#+end_src
#+RESULTS:
#+begin_src python
2
3
4
#+end_src
Resultado del bloque de código exportado
for i in range(2, 5):
print(i)
2
3
4
Espero que te haya gustado, pasa un gran día 🐧