Mostrar bloques de tiempo libres en la agenda del modo org

12

Me gustaría facilitar encontrar dónde están los bloques de tiempo libres en mi agenda del modo org.

Por ejemplo, si tengo dos citas, una de 9:30 a.m. a 10:30 a.m. y otra de 11:15 a.m. a 12:30 p.m., me gustaría ver de un vistazo que el bloque de 10:30 a.m. a 11:15 a.m. es gratuito.

En otras palabras, quiero poder distinguir el tiempo libre tan fácilmente como se hace en una agenda gráfica como el calendario de Google.

¿Hay alguna manera de hacer que los bloques de tiempo vacíos sean fáciles de ver? ¿Quizás para colorear los bloques vacíos que son más largos que un número dado de minutos?

Scaramouche
fuente
2
¿ org-agenda-time-gridNo es suficiente para sus necesidades? gnu.org/software/emacs/manual/html_node/org/…
lawlist
2
La cuadrícula no es suficiente, ya que se muestra incluso cuando el tiempo está ocupado (por ejemplo, si hay una reunión de 9:30 a.m. a 10:30 a.m., habrá una línea de cuadrícula a las 10:00 a.m.). Me gustaría que los tiempos ocupados y no ocupados sean fáciles de distinguir.
scaramouche
1
He pensado un poco más sobre esta funcionalidad. Creo que lo más útil y sencillo de implementar sería cambiar el color del bloque de tiempo (solo el nombre del bloque de tiempo, por ejemplo, 8: 00-9: 00) para aquellos bloques de tiempo que tienen más de una cantidad dada de Tiempo libre (por ejemplo, más de 15 minutos). Tanto el color como el tiempo libre mínimo deben ser configurables por el usuario.
scaramouche
3
@scaramouche, un usuario en la lista de correo del modo org ( orgmode.org/worg/org-mailing-list.html ) pregunta si lo ha intentado calfw( emacswiki.org/emacs/Calfw ).
daveloyall
2
@daveloyall, muchas gracias por señalar la discusión de la lista de correo. Acabo de probar calfw (¡y es hermoso!), Pero no parece tener la función que quiero (detectar visualmente los horarios abiertos en el día). Para aquellos que quieran probar calfw + org (muy recomendable): obtenga calfw de Melpa, in init.el, include (require 'calfw-org)y llame al calendario M-x cfw:open-org-calendar.
scaramouche

Respuestas:

2

Debido a esta pregunta , miré la función org-agenda-add-time-grid-maybeque crea la cuadrícula de tiempo. El código publicado allí (que no está escrito por mí) elimina una línea de la cuadrícula si el tiempo está ocupado como se solicita en el comentario del OP.

Como tú, quería crear un bloque visual de alguna manera. Al mezclar el código original org-agenda-add-time-grid-maybey el desajuste de Michael Ekstrand publicado en el otro hilo, se me ocurrió el siguiente código org-agenda-add-time-grid-maybe. Producirá las líneas de la cuadrícula en un color diferente (por el momento que uso la cara org-archived) y los tiempos serán seguidos por una cadena diferente. Ambos se pueden cambiar a su gusto.

(defun org-agenda-add-time-grid-maybe (list ndays todayp)
  "Add a time-grid for agenda items which need it.

LIST is the list of agenda items formatted by `org-agenda-list'.
NDAYS is the span of the current agenda view.
TODAYP is t when the current agenda view is on today."

  (catch 'exit
   (cond ((not org-agenda-use-time-grid) (throw 'exit list))
         ((and todayp (member 'today (car org-agenda-time-grid))))
         ((and (= ndays 1) (member 'daily (car org-agenda-time-grid))))
         ((member 'weekly (car org-agenda-time-grid)))
         (t (throw 'exit list)))
   (let* ((blocks (mapcar (lambda (x)
                            (let ((start (get-text-property 1 'time-of-day x))
                                  (dur (get-text-property 1 'duration x)))
                              (cond
                               ((and start dur) (cons start
                                                      (org-time-from-minutes
                                                       (truncate
                                                        (+ dur (org-time-to-minutes start))))))
                               (start start)
                               (t nil))))
                          list))
          (have (delq nil (mapcar
                           (lambda (x) (get-text-property 1 'time-of-day x))
                           list)))
          (string (nth 3 org-agenda-time-grid))
          (gridtimes (nth 1 org-agenda-time-grid))
          (req (car org-agenda-time-grid))
          (remove (member 'remove-match req))
          new time)
     (if (and (member 'require-timed req) (not have))
         ;; don't show empty grid
         (throw 'exit list))

     (while (setq time (pop gridtimes))
       (unless (and remove (member time have))
         (let* ((windows (delq nil blocks))
                (hit nil))
           (dolist (busy windows)
             (unless hit
               (when (and (>= time (car busy))
                          (< time (cdr busy)))
                 (setq hit t))))
           (setq time (replace-regexp-in-string " " "0" (format "%04s" time)))
           (if hit
               (progn
                 (push (org-agenda-format-item
                        (concat string " dito") string nil "" nil
                        (concat (substring time 0 -2) ":" (substring time -2)))
                       new)
                 (put-text-property 2 (length (car new)) 'face 'org-archived (car new)))
             (progn
               (push (org-agenda-format-item
                      nil string nil "" nil
                      (concat (substring time 0 -2) ":" (substring time -2)))
                     new)
               (put-text-property 2 (length (car new)) 'face 'org-time-grid (car new))))
           (setq hit nil))))

     (when (and todayp org-agenda-show-current-time-in-grid)
       (push (org-agenda-format-item
              nil org-agenda-current-time-string nil "" nil
              (format-time-string "%H:%M "))
             new)
       (put-text-property
        2 (length (car new)) 'face 'org-agenda-current-time (car new)))

     (if (member 'time-up org-agenda-sorting-strategy-selected)
         (append new list)
       (append list new)))))

(defun org-time-to-minutes (time)
  "Convert an HHMM TIME to minutes."
  (+ (* (/ time 100) 60) (% time 100)))

(defun org-time-from-minutes (minutes)
  "Convert a number of MINUTES to an HHMM time."
  (+ (* (/ minutes 60) 100) (% minutes 60)))

Obviamente, sería más elegante usar defadvice, pero no pude averiguar exactamente dónde intervenir. La función en sí pasa por cada tiempo de cuadrícula (establecido org-agenda-time-grid) y crea una nueva lista con la cuadrícula final que incluye caras (nuevo).

Fabian
fuente
1
Útil, pero realmente espero que a alguien se le ocurra una solución que no implique anular directamente una función org-agenda.
holocronweaver
¡Estoy absolutamente de acuerdo! Desafortunadamente, mi conocimiento de elisp y el código del modo de organización no es suficiente para crear un dispositivo que funcione. Tal vez, alguien más pueda ayudar aquí, posiblemente usando algo de "mi" código.
Fabian