https://fotosycaptura.cl

Bitácora personal del capitán @fotosycaptura ✨

Marcadores con emacs y firefox


Contexto

Marcadores con Emacs

Una de las ventajas de tener todo tu flujo de trabajo en Emacs es poder centralizar también tus lecturas, notas y enlaces interesantes. En este artículo te muestro cómo crear un botón en Firefox que te permita agregar la URL de la pestaña activa directamente a un archivo de marcadores en Emacs, sin ventanas intermedias, gracias a org-protocol.

¿Por qué debería?

Uhm, a lo largo de mi vida he ocupado lo primero que había, ya sea marcadores, o favoritos - así se llamaban en IE -, y digamos que, con el tiempo, nacieron otros servicios para poder tener estos enlaces o URL en la nube... En ese entonces ocupaba un servicio llamado del.icio.us o algo así creo que se llamaba... No me acuerdo bien en el momento de redactar estas líneas, pero ese servicio murió hace muchos años ya...

Entonces, por ejemplo con el auge de los navegadores y el ofrecimiento de servicios, disponen de guardar muchas cosas en sus propios servidores... Y por supuesto en esto están los marcadores... Pero, ¿y si esos enlaces los usan para ofrecerte publicidad? ¿O si venden esa información para hacer un perfil sobre ti y finalmente ofrecer publicidad? Y quizás cuantas cosas más...

Y no se en tu caso, pero yo preferiría no más publicidad... Ya es suficiente...

Así que, ¿Qué mejor que manejarlos directamente desde org-mode con Emacs?

Activar org-protocol en Emacs

Primero, necesitamos que Emacs pueda recibir llamadas externas. Esto se logra habilitando el servidor integrado y cargando org-protocol.

Agrega lo siguiente a tu configuración:

;; Activa org-protocol y servidor
(require 'org-protocol)
(server-start)

;; Archivo destino
(defconst my/bookmarks-file "~/org/bookmarks.org")

(defun my/add-link-directly (info)
  "Guardar un enlace recibido por org-protocol STORE-LINK en `my/bookmarks-file`."
  (let* ((link (or (plist-get info :link)
                   (plist-get info :url)))
         (desc (or (plist-get info :description)
                   (plist-get info :title)
                   link
                   "Sin título"))
         (file (expand-file-name my/bookmarks-file)))
    (unless (file-exists-p file)
      (with-temp-file file
        (insert "#+title: Bookmarks\n\n")))
    (with-current-buffer (find-file-noselect file)
      (goto-char (point-max))
      (insert (format "* [[%s][%s]]\nADDED: %s\n\n"
                      link desc (format-time-string "%Y-%m-%d %H:%M")))
      (save-buffer)))
  nil)

(add-to-list 'org-protocol-protocol-alist
             '("Guardar enlace directo"
               :protocol "store-link"
               :function my/add-link-directly))

Esto crea una función que recibe el enlace y lo guarda en ~/org/bookmarks.org, sin pasar por el sistema de org-capture.

Registrar el esquema org-protocol:// en Linux

Para que el navegador pueda llamar a Emacs, hay que decirle al sistema operativo que maneje las URLs con el esquema org-protocol.

Crea el archivo /usr/share/applications/org-protocol.desktop con el siguiente contenido:

[Desktop Entry]
Name=org-protocol
Exec=emacsclient %u
Type=Application
Terminal=false
MimeType=x-scheme-handler/org-protocol;

Luego, desde una terminal ejecuta lo siguiente:

xdg-mime default org-protocol.desktop x-scheme-handler/org-protocol

Crear el botón en Firefox (bookmarklet)

Bueno, recomiendo Firefox porque es el navegador que suelo usar, no uso ningún otro por principios, a excepción de links, o eww si es necesario...

Luego de haber aclarado eso, entonces lo que tienes que hacer es lo siguiente... De hecho, ahora viene la parte divertida: el botón mágico.

  • Abre tu barra de marcadores.
  • Crea un nuevo marcador con el nombre que quieras, por ejemplo: Guardar en Emacs.
  • En el campo URL, pega este código:
javascript:(function(){
  var url=location.href, title=document.title;
  location.href='org-protocol://store-link?url='
    +encodeURIComponent(url)+'&title='
    +encodeURIComponent(title);
})();

Guarda los cambios, y listo. Ese marcador actuará como un botón que dispara la acción directamente en Emacs.

Probando el flujo completo

Abre cualquier sitio que quieras guardar, haz clic en tu nuevo botón y observa cómo Emacs registra el enlace al final del archivo bookmarks.org, con su título y la fecha de agregado.

El resultado que verás será algo más o menos así:

* [[https://fotosycaptura.cl][Fotos y Captura]]
ADDED: 2025-11-02 16:37

¿Y cómo es que funciona todo esto?

Detrás de todo lo anterior, más o menos ocurre lo siguiente:

  • El bookmarklet en JavaScript toma la URL y el título de la pestaña activa.
  • Luego se llama a org-protocol://store-link?..., un esquema personalizado.
  • Linux redirige esa llamada a Emacs mediante emacsclient.
  • org-protocol interpreta los parámetros y ejecuta la función my/add-link-directly, función que se agregó en el init.el o como en mi caso custom.el.
  • El enlace se guarda directamente en el archivo de Org.

Como puedes observar, es un flujo rápido y completamente local.

Ventajas

  • Sin ventanas de confirmación: todo se guarda directo.
  • Integrado en tu sistema: no dependes de extensiones externas.
  • Funciona en Firefox, aunque en teoría, debería de funcionar en cualquier navegador que permita bookmarklets.
  • Los enlaces quedan en texto plano dentro de tu flujo de org-mode, nada de que en la nube o servicios de terceros que venden tus datos o que por abc motivo, dejen de existir...

Conclusión

Con unos pocos ajustes en Emacs y un pequeño script en Firefox, puedes transformar tu navegador en una herramienta que colabora directamente con tu flujo de trabajo en texto plano. Para quienes trabajamos con org-mode, esta integración resulta natural: cada clic se convierte en conocimiento archivado, listo para buscar, enlazar o reanudar más adelante desde Emacs.