EL BLOG DE LÁZARO


Emacs: Exportando bloques de código

13 de mar. de 2023 - #emacs

Índice

  1. Configurando Babel
  2. Definiendo bloques de código
  3. Ejecutando bloques de código
  4. Exportando bloques de código
  5. 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,

img

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

img

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.

img

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 🐧

Referencia

https://orgmode.org/manual/Exporting-Code-Blocks.html

, ,