Показать свободные блоки времени в повестке дня в режиме org

12

Я бы хотел, чтобы было легко найти свободные блоки времени в моей повестке дня в режиме орг.

Например, если у меня есть две встречи, одна из которых 9:30 утра - 10:30 утра, а другая - 11:15 утра - 12:30 вечера, я хотел бы сразу увидеть, что блок 10:30 утра - 11:15 утра свободен.

Другими словами, я хочу иметь возможность различать свободное время так же легко, как это делается в графической программе, такой как календарь Google.

Есть ли способ сделать пустые отрезки времени легко видимыми? Возможно, раскрасить пустые блоки, которые длиннее заданного количества минут?

негодник
источник
2
Есть org-agenda-time-gridне достаточно для ваших нужд? gnu.org/software/emacs/manual/html_node/org/...
lawlist
2
Сетки недостаточно, так как она отображается, даже когда время занято (например, если в 9:30 - 10:30 встреча будет, в 10:00 будет линия сетки). Я бы хотел, чтобы разное время было легко различать.
Скарамуш
1
Я подумал немного больше об этой функциональности. Я считаю, что наиболее полезным и простым для реализации было бы изменение цвета временного блока (только имя временного блока, например, 8: 00-9: 00) для тех временных блоков, которые имеют более заданного количества свободное время (например, более 15 минут). И цвет, и минимальное свободное время должны настраиваться пользователем.
Скарамуш
3
@scaramouche, пользователь из списка рассылки org-mode ( orgmode.org/worg/org-mailing-list.html ) спрашивает, пытались ли вы calfw( emacswiki.org/emacs/Calfw ).
Давелоял
2
@daveloyall, большое спасибо за указание на обсуждение списка рассылки. Я только что попробовал calfw (и это прекрасно!), Но у него, похоже, нет нужной мне функции (чтобы визуально определять время открытия в течение дня). Для тех, кто хочет попробовать calfw + org (настоятельно рекомендуется): получите calfw от Melpa, in init.el, include (require 'calfw-org)и позвоните в календарь do M-x cfw:open-org-calendar.
Скарамуш

Ответы:

2

Из-за этого моего собственного вопроса я посмотрел на функцию, org-agenda-add-time-grid-maybeкоторая создает временную сетку. Размещенный там код (который я не написал) действительно удаляет линию сетки, если время занято, как того требует комментарий ОП.

Как и вы, я хотел каким-то образом создать визуальный блок. org-agenda-add-time-grid-maybeСмешав оригинальный код и defadvice от Michael Ekstrand, опубликованный в другом потоке, я придумал следующий код для org-agenda-add-time-grid-maybe. Он выведет линии сетки другого цвета (на данный момент я использую грань org-archived), а за временем последует другая строка. Оба могут быть изменены по вашему вкусу.

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

Очевидно, что было бы более элегантно использовать defadvice, но я не мог понять, где именно вмешаться. Сама функция проходит через каждое время сетки (устанавливается org-agenda-time-grid) и создает новый список с конечной сеткой, включая грани (новые).

Fabian
источник
1
Полезно, но я действительно надеюсь, что кто-то придумает решение, которое не предполагает непосредственного переопределения функции org-agenda.
holocronweaver
Я абсолютно согласен! К сожалению, мои знания elisp и кода режима org недостаточны, чтобы придумать работающую defadvice. Может быть, кто-то еще может помочь здесь, возможно, используя некоторый «мой» код.
Фабиан