Zeigen Sie freie Zeitblöcke in der Agenda von org-mode an

12

Ich möchte es Ihnen leicht machen, die freien Zeitblöcke in meiner Organigramm-Agenda zu finden.

Wenn ich zum Beispiel zwei Termine habe, einen von 9:30 bis 10:30 Uhr und einen von 11:15 bis 12:30 Uhr, möchte ich auf einen Blick sehen, dass der Block von 10:30 bis 11:15 Uhr frei ist.

Mit anderen Worten, ich möchte in der Lage sein, Freizeit so einfach zu unterscheiden, wie dies in einer grafischen Agenda wie dem Google-Kalender der Fall ist.

Gibt es eine Möglichkeit, die leeren Zeitblöcke leicht sichtbar zu machen? Vielleicht, um die leeren Blöcke einzufärben, die länger als eine bestimmte Anzahl von Minuten sind?

Scaramouche
quelle
2
Reicht das org-agenda-time-gridnicht für Ihre Bedürfnisse aus? gnu.org/software/emacs/manual/html_node/org/…
Gesetzesliste
2
Das Raster reicht nicht aus, da es auch dann angezeigt wird, wenn die Zeit voll ist (wenn z. B. eine Besprechung zwischen 9:30 und 10:30 Uhr stattfindet, gibt es um 10:00 Uhr eine Rasterlinie). Ich möchte, dass geschäftige und nicht geschäftige Zeiten leicht zu unterscheiden sind.
Scaramouche
1
Ich habe ein bisschen mehr über diese Funktionalität nachgedacht. Ich glaube, dass die nützlichste und einfachste Implementierung darin besteht, die Farbe des Zeitblocks (nur den Namen des Zeitblocks, z. B. 8: 00-9: 00) für diejenigen Zeitblöcke zu ändern, die mehr als eine bestimmte Anzahl von haben Freizeit (z. B. mehr als 15 Minuten). Sowohl die Farbe als auch die Mindestfreizeit sollten vom Benutzer konfiguriert werden können.
Scaramouche
3
@scaramouche, ein Benutzer auf der Mailingliste im Organisationsmodus ( orgmode.org/worg/org-mailing-list.html ) fragt, ob Sie es versucht haben calfw( emacswiki.org/emacs/Calfw ).
daveloyall
2
@daveloyall, vielen Dank für den Hinweis auf die Mailinglistendiskussion. Ich habe gerade Kalb versucht (und es ist wunderschön!), Aber es scheint nicht die Funktion zu haben, die ich möchte (um offene Zeiten am Tag sichtbar zu machen). Für diejenigen, die calfw + org ausprobieren möchten (sehr empfehlenswert): Holen Sie sich calfw von Melpa init.el, schließen Sie ein (require 'calfw-org)und rufen Sie den Kalender auf M-x cfw:open-org-calendar.
Scaramouche

Antworten:

2

Aufgrund meiner eigenen Frage habe ich mir die Funktion angeschaut, die org-agenda-add-time-grid-maybedas Zeitraster erzeugt. Der dort gepostete Code (der nicht von mir geschrieben wurde) entfernt eine Gitterlinie, wenn die im Kommentar des OP angeforderte Zeit belegt ist.

Wie Sie wollte ich auf irgendeine Weise einen visuellen Block erstellen. Indem org-agenda-add-time-grid-maybeich den ursprünglichen Code von und den Defadvice von Michael Ekstrand, der in dem anderen Thread gepostet wurde, verwechselt habe, bin ich auf den folgenden Code für gekommen org-agenda-add-time-grid-maybe. Die Gitterlinien werden in einer anderen Farbe ausgegeben (für den Moment, in dem ich das Gesicht benutze org-archived), und auf die Zeiten folgt eine andere Zeichenfolge. Beide können nach Ihren Wünschen geändert werden.

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

Offensichtlich wäre es eleganter, defadvice zu verwenden, aber ich konnte nicht herausfinden, wo genau eingegriffen werden sollte. Die Funktion selbst durchläuft zu jeder eingestellten Rasterzeit org-agenda-time-grideine neue Liste mit dem endgültigen Raster einschließlich der Flächen (neu).

Fabian
quelle
1
Nützlich, aber ich hoffe wirklich, dass jemand eine Lösung findet, bei der eine Funktion in nicht direkt überschrieben wird org-agenda.
Holocronweaver
Ich stimme absolut zu! Leider reichen meine Kenntnisse von elisp und dem Org-Mode-Code nicht aus, um eine funktionierende Defadvice zu entwickeln. Vielleicht kann jemand anderes hier helfen und möglicherweise "meinen" Code verwenden.
Fabian