richterm, capturando la terminal a todo color

Siempre estoy haciendo programitas de línea de comando y siempre quiero mostrar como se ve el resultado de algun comando. Si bien es texto que puedo copiar y pegar, muchas veces prefiero tomar capturas de pantalla de la terminal para mostrar como se ve el resultado, especialmente si tiene colores o algun formato especial.

Cuando estaba escribiendo este post necesitaba una captura, y encontré una manera de hacerlo:

x.com//1983986531972116685

El truco que propuse ahí es usar rich-codex pero, a decir verdad, la CLI de esta herramienta es un bastante complicada para este caso súper común: sólo quiero ejecutar un comando y quedarme con un SVG listo para incrustar en un post o en la documentación.

Así que me armé una mini herramienta más simple: richterm.

¿Qué hace?

Ejecutás richterm <comando> y te genera rich_term_<timestamp>.svg con la salida ANSI, respetando todos los colores. También escribe la salida en stdout así el flujo normal de la terminal no se rompe.

En su caso más trivial, no tenés que acordarte de ninguna opción exótica. Ejemplo rápido:

uvx richterm python -m rich.tree

Listo, SVG fresquito en el directorio actual. Se ve así:

Tip: Para incrustar en markdown/html, en vez de una etiqueta <img> preferí, si podés, usar <object data="<path>" type="image/svg+xml"></object> así las referencias inline de fuentes del svg funcionan, resolviendo las ligaduras.

Si preferís instalarlo:

uv tool install richterm

Opciones mínimas:

  • -o archivo.svg si querés controlar el nombre.
  • --prompt para tunear el prompt con markup de Rich. Por ejemplo:

uvx richterm --prompt "[bold green]λ " git status --short - --hide-command si querés ocultar la línea de comando del render.

richterm como extensión de Sphinx

Además del CLI funciona como una extension de Sphinx, agregando la directiva richterm::.

En la docu uso la extensión incluída. En conf.py agregás "richterm.sphinxext" y listo. Después en cualquier página podés poner:

```richterm:: uv run -m rich
```

O su equivalente markdown si usás myst-parser:

```{richterm} uv run -m rich
```

Cuando compiles tu proyecto Sphinx ejecutará el comando e incrustará el SVG resultante en el HTML. Cero esfuerzo.

¿Cómo funciona?

Usa subprocess para ejecutar el comando y capturar la salida. Luego rich's from_ansi() para interpretar potenicales códigos ANSI y export_svg() para guardar el svg.

El repo es github.com/mgaitan/richterm. Feedbacks, issues, PRs ¡todo bienvenido! 🎨

PS: Si querés algo un poquito más sofisticado (¡svg animados!) fijate este otro post

Comentarios

Comments powered by Disqus