https://fotosycaptura.cl

Bitácora personal del capitán @fotosycaptura ✨

Organizándome con org-mode


Contexto

GNU Emacs
El editor GNU Emacs

He estado experimentando con emacs. Hace muchos años que intento usarlo pero nada me convencía, pensaba que con VIM estaba listo, pero... Hace unos días estaba leyendo y me enteré de ciertas características que, simplemente me hicieron replantearme la idea... Veamos que resultó...

Un poco de historia

Durante todos estos años he sido un usuario más en su mayoría al uso de Vim, con ciertos toques de VS Code. Sin embargo, en las últimas semanas me decidí a darle una nueva oportunidad a Emacs.

En las oportunidades anteriores, no había conseguido nada... Pero esta vez fue diferente... Me comprometí con más paciencia y curiosidad. El resultado ha sido... Mejor sigue leyendo...

Adaptándome a Emacs

Al principio, la interfaz gráfica me pareció extraña. Siempre que la he visto pensaba que era algo demasiado rudimentario. Casi al mismo nivel que el bloc de notas de cierto sistema operativo... Pero cuando toca consultar por las teclas de acceso directo, también llamado atajos, te das cuenta que, en comparación a Vim, es confuso...

Conceptos generales

Creo que lo primero, como para que no se me olvide más adelante es definir algunos conceptos para que no se me olvide más adelante. Había leído sobre su curva de aprendizaje, y creo que lo mejor para aprender a comenzar a usarlo es metiéndose, y no usando VIM para nada. Bueno, eso hice, me siento perdido... Pero eso no dura mucho, leyendo y practicando de inmediato hace que uno comience a soltarse...

Vamos con algunos conceptos.

  • Minibuffer: es esa área de trabajo.
  • Modos: de momento existen dos, los modos mayores (por ejemplo org-mode), donde hay teclas pre asignadas, sintaxis de colores y comandos específicos... Y los menores del tipo flyspell-mode, visual-line-mode, entre otros... Solo puede estar activo un modo mayor, los otros pueden ser varios...
  • M-algo: la tecla Meta la definen refiriéndose a la tecla ALT, mientras que el algo es un comando o una letra para referirse a una acción, por ejemplo M-g g se refiere a goto, es decir ir hacia una línea.
  • C-x C-s: esta combinación de teclas se refiere a la tecla CONTROL más la tecla x y luego nuevamente la tecla CONTROL más la tecla s. Esto guarda el documento actual que se tenga abierto en ese momento.
  • C-l: dependiendo de la línea donde se encuentre el cursor, es como para posicionar todo al comienzo, al medio o al final. Es como la z de VIM.

Org-mode: el descubrimiento

Es sin duda, lo que más me llamó la atención. Un modo que permite tomar notas, hacer tareas, visualizar todo esto en una agenda, repetir eventos... Al comienzo pensé, que enredado, todo en un puro archivo .org, pero luego pensé ¿Y si los separo? Y bueno, hice eso y quedó mucho mejor la organización, una planificación más clara.

Para comenzar, se abre con M-x y luego org-mode y se da ENTER.

Acá, es bien entretenido XD, todo es texto, osea, al estilo markdown, pero en vez de # se puede usar *

Después de eso, ya se puede definir si es una lista de cosas, actividades, etc... C-c a a para abrir la agenda. En mi caso, creé una carpeta org, y dentro de ella tengo archivos del tipo cumples.org, diario.org, eventos.org y por último inbox.org.

Creo que los nombres son súper claros, cumples para los cumpleaños, diario para las tareas diarias, eventos para los eventos del año, feriados, cosas por el estilo, y por último, inbox, donde voy colocando todo lo relacionado al trabajo en sí, es decir, las tareas.

¿Configuraciones?

Por supuesto, hubo que hacer ciertos ajustes. No fue muy difícil... La documentación ayuda bastante y en general, lo que uno quiere hacer ya otra persona lo intentó hacer antes, por lo que hay códigos de ejemplos por la Web... Pero dejaré aquí algunos códigos que utilicé para más o menos dejar configurado esto.

;; Este es un comentario

;; Activa líneas numeradas
(setq display-line-numbers-type t)
;; Mostrar números de línea en todos los buffers
(global-display-line-numbers-mode 1)

;; Usar UTF-8
(prefer-coding-system 'utf-8)

;; Quita el tutorial del inicio
(setq inhibit-startup-message t)

;; ------------------------------
;; Configuración básica Org-Mode
;; ------------------------------

;; Agregar archivo org a la agenda
(setq org-agenda-files '("~/org/inbox.org" "~/org/eventos.org" "~/org/cumples.org"))

;; Usar org-mode para archivos .org
(setq auto-mode-alist
      (append '(("\\.org$" . org-mode)) auto-mode-alist))

;; Activar indentación visual y modos útiles al abrir org-mode
(add-hook 'org-mode-hook
          (lambda ()
            (org-indent-mode)
            (visual-line-mode)
            (variable-pitch-mode) ; letra proporcional para mejor legibilidad
            (auto-fill-mode)))

;; Usar TAB para plegar y desplegar secciones
(setq org-hide-leading-stars t)
(setq org-startup-folded 'content)

;; Configuración básica de TODOs
(setq org-todo-keywords
      '((sequence "TODO(t)" "IN-PROGRESS(i)" "WAITING(w@/!)" "|" "DONE(d!)" "CANCELLED(c@)")))

;; Cambiar color de TODOs
(setq org-todo-keyword-faces
      '(("TODO" . "tomato")
        ("IN-PROGRESS" . "orange")
        ("WAITING" . "yellow")
        ("DONE" . "lime green")
        ("CANCELLED" . "gray")))

;; Carpeta principal de notas y agenda
(setq org-directory "~/org/")
(setq org-default-notes-file "~/org/inbox.org")

;; Activar captura rápida de ideas
(global-set-key (kbd "C-c c") 'org-capture)

;; Ver agenda
(global-set-key (kbd "C-c a") 'org-agenda)

;; Habilitar tiempo de reloj y log de tareas
(setq org-log-done 'time)

(setq org-log-repeat 'time) ;; Guarda cuándo se marcó como DONE

(defun abrir-inbox ()
  (interactive)
  (find-file "~/org/inbox.org"))

(global-set-key (kbd "C-c i") 'abrir-inbox)

(defun abrir-diario ()
  "Abrir la bitácora diaria y crear una entrada con fecha actual si no existe."
  (interactive)
  (let ((archivo "~/org/diario.org")
        (fecha (format-time-string "%Y-%m-%d %A")))
    (find-file archivo)
    (goto-char (point-max))
    (unless (search-backward fecha nil t)
      (insert (format "\n* %s\n\n" fecha))
      (save-buffer))))

(global-set-key (kbd "C-c j") 'abrir-diario)

;; Establecer idioma de exportación a español
(setq org-export-default-language "es")

;; Personalizar etiquetas comunes en español
(setq org-export-language-setup
      '(("es" "Autor" "Fecha" "Índice" "Notas de pie de página")))

;; Para que no genere respaldos automáticamente
(setq make-backup-files nil)

;; Se agrega otro repo
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/"))

Bueno, en general con esta configuración quedarán algunas teclas configuradas para acceso rápido. Estas las configuré para mi, pero puedes usar las que mejor te hagan sentido. He intentado documentar lo que hace cada línea. En general lisp es algo confuso para algunos por el tema de los paréntesis, pero no es complejo una vez que se tiene cierta noción, aunque emacs use un dialecto, es bastante similar al que conozco de clisp. Si eres programador, ahí te dejé los enlaces por si quieres aprender o conocerlo. Si solo eres un usuario y no te interesa, sigue adelante...

En esta configuración, también desactivé los archivos de respaldos, estos que terminan en ~, porque al usar pelican, y detectar archivos duplicados me quedaría la escoba al momento de generar las páginas estáticas...

C-c j: abre el diario, este archivo lo uso a modo de bitácora para anotar cosas que he ido realizando y que no se me olviden las cosas. Como por todo hay que hacer informe, acá me dejo unos apuntes de lo realizado día a día. Entonces así no me pierdo.

C-c a a: abre la agenda y se pueden ver los días de la semana y las actividades, las tareas en progreso...

C-c i: abre el inbox, digamos que es mi bandeja de entrada de tareas y actividades. Es diferente del diario porque acá estas tienen fechas límites, fechas programadas y algunos otros puntos que son importantes para la gestión en sí.

Por ejemplo, al abrir el archivo inbox (teclas C-x C-f ~/org/inbox.org o usando C-c i), se puede comenzar a escribir una tarea comenzando con un * o presionando shift+enter, que pondrá el * al comienzo. Dependiendo de cuantos asteriscos hayan juntos será el nivel de la tarea, su profundidad por así decirlo, imagina una lista típica, mientras más apegadas al borde izquierdo son me mayor jerarquía mientras que más hacia la derecha, están contenidas...

* Tarea 1
**.Subtarea de la tarea 1
   - También esto es una tarea dentro de Subtarea, puede ser una nota, en fin...

Si por ejemplo, tuvieras el contenido anterior, y te posicionas encima de Tarea 1, y luego presionas las teclas C-c C-t, puedes definir si es una tarea, es decir le agrega las palabras TODO - de hacer en inglés -, y puedes también poner en progreso,esperando, finalizado, por supuesto, todo eso en inglés. Siempre se recomienda tener al menos una poca noción de ello.

Para setear una fecha para lo de programado - SCHEDULED -, pues C-c C-s, donde se abrirá una especie de calendario, donde se ingresará la fecha a mano si es diferente, y solo enter si es el mismo día. Para especificar la hora bastará con agregar un espacio y la hora en formato 24 hrs, es decir, 2025-08-06 09:00 o si tiene una hora de término sería 2025-08-06 09:00-10:00 y luego pulsar la tecla ENTER, con eso quedaría configurado.

* Tarea de ejemplo
** DONE Búsqueda de documento para una actividad
CLOSED: [2025-08-05 ma. 14:56] SCHEDULED: <2025-08-05 ma.>

- State "DONE"       from "IN-PROGRESS" [2025-08-05 ma. 14:56]

Otra de las cosas que me llamó la atención fue:

¿Correo en modo texto? Gnus: centralizando el correo y las noticias

Bueno, sí, es posible. Hay que configurar algo llamado gnus. Configuré mi cuenta de Gmail mediante un archivo .authinfo.gpg con cifrado usando GnuPG. Y con eso pude:

  • Leer y enviar correos directamente desde Emacs.
  • Archivar mensajes (B m hacia [Gmail]/Todos).
  • Eliminar mensajes (E y luego x para aplicar).
  • Usar etiquetas como # para marcar múltiples mensajes.
  • Acceder a grupos de noticias mediante Gwene y Eternal September.

Además, habilité la firma automática de correos...

Acá te dejo el archivo de configuración que usé para gnus, deberías de dejarlo en la ruta de .emacs.d/.gnus.el, como para tener todo ordenadito digo yo...

;; Usa authinfo.gpg
(setq auth-sources '("~/.emacs.d/.authinfo.gpg"))

;; Tu nombre y correo
(setq user-full-name "Tu nombre")
(setq user-mail-address "tu-correo@gmail.com")

;; Configuración IMAP para Gmail
(setq gnus-select-method
      '(nnimap "gmail"
               (nnimap-address "imap.gmail.com")
               (nnimap-server-port 993)
               (nnimap-stream ssl)))

;; SMTP con Gmail
(setq message-send-mail-function 'smtpmail-send-it)
(setq smtpmail-smtp-server "smtp.gmail.com")
(setq smtpmail-smtp-service 587)
(setq smtpmail-stream-type 'starttls)
(setq smtpmail-debug-info t) ; Para ver errores si ocurre algo

;; Noticias
(setq gnus-secondary-select-methods
      '((nntp "news.gwene.org")))

Bueno, con esta configuración ya es posible de iniciar gnus... Para ello, bastará con que uses M-x gnus y se iniciará. Algo que no he dicho, es que el archivo authinfo obviamente tendrás que tener las credenciales para tu cuenta de correo, que obviamente encriptarás con gnupg, esto es harina de otro costal y por supuesto, hay muchos tutoriales para configurar eso...

Llegados a este punto... Puedo decir que estoy contento, ya he hecho muchas cosas... ^_^... Incluso, he logrado ejecutar jupyter notebook en org-mode...

¿Lo recomiendo? Sólo si quieres complicarte la vida... XDDD

Lo recomendaría sólo si tienes tiempo suficiente para aprender, y que por cosas de la vida, tener muchas ventanas te distraen... Aunque, a la fecha de redacción de esta publicación, el sistema operativo de M$ ya trae algo llamado asistente de concentración, que en realidad lo que hace es silenciar las notificaciones para evitar que seas interrumpido...

En mi caso personal, me alegró poder tener (casi) todo configurado en un solo lugar.

Así es como se ve todo en la parte de la agenda...

La agenda en emacs
La agenda. Lo cierto es que a pesar de lo minimalista que se ve, es tremendamente funcional... Y práctico.

¿Cierto que se ve bonito?