Afficher des blocs de temps libres dans l'agenda du mode org

12

Je voudrais qu'il soit facile de trouver où sont les blocs de temps libres dans mon agenda en mode org.

Par exemple, si j'ai deux rendez-vous, un de 9h30 à 10h30 et un autre de 11h15 à 12h30, j'aimerais voir d'un coup d'œil que le bloc de 10h30 à 11h15 est libre.

En d'autres termes, je veux pouvoir distinguer le temps libre aussi facilement que cela se fait dans un agenda graphique tel que le calendrier Google.

Existe-t-il un moyen de rendre les blocs de temps vides faciles à voir? Peut-être pour coloriser les blocs vides qui sont plus longs qu'un certain nombre de minutes?

Scaramouche
la source
2
N'est-ce org-agenda-time-gridpas suffisant pour vos besoins? gnu.org/software/emacs/manual/html_node/org/…
lawlist
2
La grille n'est pas suffisante, car elle apparaît même lorsque le temps est occupé (par exemple, s'il y a une réunion de 9h30 à 10h30, il y aura une ligne de grille à 10h00). J'aimerais que les périodes occupées et non occupées soient faciles à distinguer.
scaramouche
1
J'ai réfléchi un peu plus à cette fonctionnalité. Je crois que le plus utile et le plus simple à mettre en œuvre serait de changer la couleur du bloc de temps (uniquement le nom du bloc de temps, par exemple, 8: 00-9: 00) pour les blocs de temps qui ont plus d'une quantité donnée de temps libre (par exemple, plus de 15 minutes). La couleur et le temps libre minimum doivent être configurables par l'utilisateur.
scaramouche
3
@scaramouche, un utilisateur de la liste de diffusion en mode org ( orgmode.org/worg/org-mailing-list.html ) vous demande si vous avez essayé calfw( emacswiki.org/emacs/Calfw ).
daveloyall
2
@daveloyall, merci beaucoup d'avoir pointé la discussion sur la liste de diffusion. Je viens d'essayer le veau (et c'est beau!), Mais il ne semble pas avoir la fonction que je veux (repérer visuellement les heures d'ouverture de la journée). Pour ceux qui veulent essayer calfw + org (hautement recommandé): obtenez calfw de Melpa, dans init.el, incluez (require 'calfw-org)et appelez le calendrier do M-x cfw:open-org-calendar.
Scaramouche

Réponses:

2

En raison de cette question de mon propre je regardais la fonction org-agenda-add-time-grid-maybequi crée la grille horaire. Le code affiché ici (qui n'est pas écrit par moi) supprime une ligne de grille si le temps est occupé comme demandé dans le commentaire du PO.

Comme vous, je voulais créer un bloc visuel d'une manière ou d'une autre. En mélangeant le code original de org-agenda-add-time-grid-maybeet les conseils de Michael Ekstrand postés dans l'autre thread, j'ai trouvé le code suivant pour org-agenda-add-time-grid-maybe. Il affichera les lignes de la grille dans une couleur différente (pour le moment j'utilise le visage org-archived) et les temps seront suivis d'une chaîne différente. Les deux peuvent être modifiés à votre guise.

(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)))

De toute évidence, il serait plus élégant d'utiliser des conseils, mais je ne pouvais pas savoir exactement où intervenir. La fonction elle-même parcourt chaque heure de grille (définie dans org-agenda-time-grid) et crée une nouvelle liste avec la grille finale comprenant les faces (nouvelle).

Fabien
la source
1
Utile, mais j'espère vraiment que quelqu'un trouvera une solution qui n'implique pas de remplacer directement une fonction dans org-agenda.
holocronweaver
Je suis absolument d'accord! Malheureusement, ma connaissance d'elisp et du code en mode org n'est pas suffisante pour trouver un conseil pratique. Peut-être que quelqu'un d'autre peut aider ici, peut-être en utilisant "mon" code.
Fabian