Cuaderno de GNUtas

Exportar una lista de entradas de Elfeed a formato Org

Para enterarme de lo que se cuece en blogs y demás publicaciones periódicas que disponen de feed uso mucho en Emacs el agregador/lector de feeds Elfeed, que es bastante competente, flexible y cumplidor. Hace poco se me ocurrió escribir esta serie de funciones para poder exportar a formato Org (en una ventana temporal) cualquier lista de entradas que tengamos marcadas en la ventana elfeed-search (la que nos permite acotar las entradas de las publicaciones suscritas mediante etiquetas de «leído»/«no leído», palabras clave, marcadores, etc.); es decir, cada encabezado es el título de la entrada, y bado éste va su contenido.

Basta con que marquemos aquellas entradas de la lista que queremos exportar, llamamos a la función exporta-entradas-elfeed y al momento obtenemos nuestras entradas en Org para poder exportarlas a LaTeX, HTML, etc.

Primero de todo, requerimos el paquete dash (nativo en Emacs), que nos permitirá intercalar dos listas:

(require 'dash)

Y definimos una serie de funciones previas:

(defun reemplaza (antes despues)
  (save-excursion
    (goto-char (point-min))
    (while (re-search-forward antes nil t)
      (replace-match despues t nil))))

(defun lineas-a-lista ()
  "Esta primera función almacena en una lista cada línea de un
  texto marcado como elemento de la lista"
  (narrow-to-region (region-beginning) (region-end))
  (split-string (buffer-string) "\n" nil))

(defun intercala-elfeed ()
  "intercala los títulos de la lista de entradas con su contenido"
  (setq lineas-b (lineas-a-lista))
  (setq lineas-c (-interleave lineas-b entradas-elfeed))
  (replace-regexp ".+" "" nil (region-beginning) (region-end))
  (deactivate-mark)
  (widen)
  (insert
   (mapconcat 'identity lineas-c "\n")))

(defun mi-elfeed-almacena-entradas ()
  "almacena los contenidos de cada entrada marcada en la lista de
Elfeed"
  (setq entradas-elfeed nil)
  (save-excursion
    (save-restriction
      (narrow-to-region (region-beginning) (region-end))
      (goto-char (point-min))
      (save-window-excursion
	(while
	    (re-search-forward "\\(^[[:digit:]]+-\\)" nil t)
	  (call-interactively 'elfeed-search-show-entry)
	  (add-to-list 'entradas-elfeed (buffer-string)
		       (switch-to-buffer "*elfeed-search*")))))))

Por último, nuestra función para exportar las entradas (en acción puede verse en la fig. 1):

(defun exporta-entradas-elfeed (desde hasta)
  "Exporta a formato Org una lista marcada de entradas de Elfeed"
  (interactive "r")
  (setq entradas-marcadas (substring (buffer-string) desde hasta))
  (mi-elfeed-almacena-entradas)
  (when (get-buffer "*entradas*")
    (kill-buffer "*entradas*"))
  (get-buffer-create "*entradas*")
  (set-buffer "*entradas*")
  (insert entradas-marcadas)
  (reemplaza "\\(^[[:digit:]]+-\\)" "** \\1")
  (mark-whole-buffer)
  (intercala-elfeed)
  (deactivate-mark)
  (org-mode)
  (goto-char (point-min))
  (insert "* Entradas")
  (temp-buffer-window-show "*entradas*"))

entradas-elfeed.png

Figura 1: Exportando un árbol de Org una lista de entradas marcadas en Elfeed

Publicado: 12/08/20

Última actualización: 12/08/20


Índice general

Acerca de...

Esta obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial 4.0 Internacional.

© Juan Manuel Macías
Creado con esmero en
GNU Emacs