Introducción

Podemos sincronizar el calendario de org-mode con un servidor cal-dav gracias org-caldav.

Como mínimo es necesario tener instalada la versión 24.3 de Emacs y según su desarrollador, org-caldav puede trabajar con los siguientes servidores CalDAV:

  • Owncloud y Nextcloud

  • Google Calendar: aunque es necesario registrar la aplicación en la Consola de Desarrollo de Google para la autentificacion OAuth2.

  • Radicale y Baikal

Personalmente lo he probado con Nextcloud y baikal , funcionando perfectamente en ambos servidores.

Antes de seguir, has de tener presente que org-caldav inserta en cada entrada un campo UID para identificar inequívocamente cada entrada del calendario

org-caldav-01.png.

Creando un nuevo calendario

Necesitamos conocer la url del calendario en el servidor

Para sincronizar el calendario de forma manual lo haremos mediante M-x org-caldav-sync , introduciremos el usuario y contraseña aunque podemos utilizar un fichero .authinfo para evitar esto.

Guardar usuario y contraseña cifrados

Creando el fichero

Podemos cifrar mediante claves gpg el usuario y contraseña en un fichero llamado .authinfo, (sustituye el numero de PUERTO y las X por tus datos)

1
machine SERVIDORR:PUERTO port http login XXXX password XXXXXX

Cifrado y ubicación del fichero

Una vez creado el fichero, lo ciframos, evidentemente deberás de tener creadas tus claves GPG pública y privada

  • Creando las claves

    Para crear tus par de claves

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    
    gpg --gen-key
    
    
    gpg (GnuPG) 2.2.11; Copyright (C) 2018 Free Software Foundation, Inc.
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.
    
    Nota: Usa "gpg --full-generate-key" para el diálogo completo de generación de clave.
    
    GnuPG debe construir un ID de usuario para identificar su clave.
    
    Nombre y apellidos: Carlos M
    Dirección de correo electrónico: hefistion@gmail.com
    Ha seleccionado este ID de usuario:
        "Carlos M <hefistion@gmail.com>"
    
    ¿Cambia (N)ombre, (D)irección o (V)ale/(S)alir? v
    Es necesario generar muchos bytes aleatorios. Es una buena idea realizar
    alguna otra tarea (trabajar en otra ventana/consola, mover el ratón, usar
    la red y los discos) durante la generación de números primos. Esto da al
    generador de números aleatorios mayor oportunidad de recoger suficiente
    entropía.
    Es necesario generar muchos bytes aleatorios. Es una buena idea realizar
    alguna otra tarea (trabajar en otra ventana/consola, mover el ratón, usar
    la red y los discos) durante la generación de números primos. Esto da al
    generador de números aleatorios mayor oportunidad de recoger suficiente
    entropía.
    gpg: clave XXXXXXXXXXX marcada como de confianza absoluta
    gpg: creado el directorio '/home/carlos-k/.gnupg/openpgp-revocs.d'
    gpg: certificado de revocación guardado como '/home/carlos-k/.gnupg/openpgp-revocs.d/XXXXXXXXXXX
    XXXXXXXXXXX.rev'
    claves pública y secreta creadas y firmadas.
    pub   rsa2048 2018-11-15 [SC] [caduca: 2020-11-14]
          XXXXXXXXXXXXXXXXXXXXXXXXXXX
    uid                      Carlos M <hefistion@gmail.com>
    sub   rsa2048 2018-11-15 [E] [caduca: 2020-11-14]

    Podemos listar las llaves con el comando

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    
    gpg -k
    gpg: comprobando base de datos de confianza
    gpg: marginals needed: 3  completes needed: 1  trust model: pgp
    gpg: nivel: 0  validez:   1  firmada:   0  confianza: 0-, 0q, 0n, 0m, 0f, 1u                       │
    gpg: siguiente comprobación de base de datos de confianza el: 2020-11-14                           │
    /home/carlos-k/.gnupg/pubring.kbx                                                                  │
    ---------------------------------                                                                  │
    pub   rsa2048 2018-11-15 [SC] [caduca: 2020-11-14]                                                 │
          4A906E4665F07F2DD9E0A559DEF186EA8C4275E3                                                     │
    uid        [  absoluta ] Carlos M <carlos70@protonmail.com>                                        │
    sub   rsa2048 2018-11-15 [E] [caduca: 2020-11-14]
  • Permisos

    Cambiamos los permisos

    1
    
    chmod 600 .authinfo
  • Cifrado

    Finalmente ciframos el fichero

    1
    
    gpg -e -r "Carlos M" .authinfo

Ubicación

Podemos crear el .authinfo en $home del usuario, aunque podemos configurar nuestro fichero .emacs.d para indicar la ubicación del fichero

1
(setq auth-sources '("~/.gnupg/shared/authinfo.gpg"))

Listo ahora ya no pide los datos de conexión, solo necesitaremos introducir la contraseña de nuestra clave GPG para que Emacs descifre el fichero y permita la conexión con le servidor CalDAV

Configuración

Debemos configurar nuestro fichero emacs.d, yo utilizo la tecla de función F3 para efectuar la sincronización manual del calendario, también la podemos efectuar M-x org-caldav-sync.

:files son las ficheros que contienen los eventos que se sincronizaran con el calendario remoto

:inbox es el fichero que donde se descargan los eventos del calendario remoto

org-caldav-02.png.

Yo voy a sincronizar solo las citas para los dispositivos móviles los proyectos los manejo desde org-mode

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
(use-package org-caldav
  :ensure t
  :bind ([f3] . org-caldav-sync)
  :preface
  :custom
  ;; Calendarios a utilizar
  (org-caldav-url "http://BAIKAL-SERVER-URL/cal.php/calendars/USUARIO")
  (org-caldav-calendars
      '((:calendar-id "default"
                      :files ("~/.personal/agenda/diario.org")
                      :inbox "~/.personal/agenda/diario-ibx.org")
  ))
  (org-caldav-backup-file "~/.personal/calendario/org-caldav-backup.org")
  (org-caldav-save-directory "~/.personal/calendario/")
  (org-icalendar-alarm-time 1)
)

Hacks

A continuación pongo una serie de funciones para la sincronización automática y el auto-guardado del calendario

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
;; sincroniza al cerrar, también pide guardar después de sincronizar
;; no se pierden cambios
(defun org-caldav-sync-at-close ()
    (org-caldav-sync)
    (save-some-buffers))

;; sincronización retardada; espera hasta que emacs haya estado inactivo
;; "x" segundos antes de sincronizar. El retraso es importante porque caldav-sync
;; puede tardar cinco o diez segundos, de esta manera, espera hasta que hayas estado
;; inactivo un tiempo para evitar molestar.
(defvar org-caldav-sync-timer nil
     "Temporizar `org-caldav-push-timer' se usa para reprogramarse a si mismo, o nil.")

(defun org-caldav-sync-with-delay (secs)
      (when org-caldav-sync-timer
      (cancel-timer org-caldav-sync-timer))
(setq org-caldav-sync-timer
          (run-with-idle-timer
           (* 1 secs) nil 'org-caldav-sync)))

;; Esto asegura que los elementos de las tareas pendientes puedan aparecer en el calendario
(setq org-icalendar-include-todo t)
;; Esto garantiza que todos las "deadlines" se muestren y se muestren como fechas de vencimiento
(setq org-icalendar-use-deadline '(event-if-todo event-if-not-todo todo-due))
;; Esto garantiza que los elementos "dedlines" se muestren y se muestren como horas de inicio
(setq org-icalendar-use-scheduled '(todo-start event-if-todo event-if-not-todo))
;; hook de guardado con retraso, con un temporizador de inactividad de cinco minutos
(add-hook 'after-save-hook
  (lambda ()
      (when (eq major-mode 'org-mode)
        (org-caldav-sync-with-delay 300))))
;; Añade hook para el cierre de emacs
(add-hook 'kill-emacs-hook 'org-caldav-sync-at-close)

Fuente: