Показуйте вільні блоки часу в порядку денному org-mode


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/…
закон

2
Сітки недостатньо, оскільки вона відображається навіть тоді, коли час зайнятий (наприклад, якщо відбудеться зустріч о 9:30 до 10:30, в 10:00 буде лінія сітки). Мені б хотілося, щоб час у напружений та не зайнятий час було легко відрізнити.
scaramouche

1
Я трохи більше подумав про цю функціональність. Я вважаю, що найкориснішим та найпростішим для реалізації було б змінити колір часового блоку (лише назва часового блоку, наприклад, 8: 00-9: 00) для тих часових блоків, у яких більше заданої кількості вільний час (наприклад, більше 15 хвилин). І колір, і мінімальний вільний час повинні бути налаштовані користувачем.
scaramouche

3
@scaramouche, користувач у списку розсилки в органічному режимі ( orgmode.org/worg/org-mailing-list.html ) запитує, чи ви спробували calfw( emacswiki.org/emacs/Calfw ).
daveloyall

2
@daveloyall, велике спасибі за вказівку на обговорення списку розсилки. Я просто спробував теля (і це прекрасно!), Але, схоже, не має функції, яку я хочу (візуально помітити відкриті часи в день). Для тих, хто хоче спробувати telefw + org (настійно рекомендується): отримати теля від Melpa init.el, включити (require 'calfw-org), включити та зателефонувати в календар M-x cfw:open-org-calendar.
scaramouche

Відповіді:


2

Через власне це питання я роздивився функцію, org-agenda-add-time-grid-maybeяка створює часову сітку. Код, розміщений там (який не написаний мною), видаляє лінію сітки, якщо час зайнятий, як вимагається в коментарі ОП.

Як і ви, я хотів якимось чином створити візуальний блок. Змішуючи оригінальний код org-agenda-add-time-grid-maybeта дефадрік Майкла Екстранда, розміщеного в іншій темі, я придумав наступний код для 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)))

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


1
Корисно, але я дуже сподіваюсь, що хтось придумає рішення, яке не передбачає прямої зміни функції org-agenda.
holocronweaver

Я абсолютно згоден! На жаль, мої знання про elisp та код org-mode недостатньо, щоб придумати робочий дезадаптер. Можливо, хтось ще може допомогти тут, можливо, використовуючи якийсь "мій" код.
Фабіан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.