Vì câu hỏi này của riêng tôi, tôi đã xem xét chức năng org-agenda-add-time-grid-maybe
tạo ra lưới thời gian. Mã được đăng ở đó (không phải do tôi viết) sẽ xóa đường lưới nếu thời gian bận theo yêu cầu trong bình luận của OP.
Giống như bạn, tôi muốn tạo ra một khối trực quan theo một cách nào đó. Bằng cách trộn lẫn mã gốc org-agenda-add-time-grid-maybe
và phần bị lỗi của Michael Ekstrand được đăng trong chủ đề khác, tôi đã đưa ra mã sau đây cho org-agenda-add-time-grid-maybe
. Nó sẽ xuất ra các đường lưới theo một màu khác (trong thời điểm tôi sử dụng mặt org-archived
) và thời gian sẽ được theo sau bởi một chuỗi khác. Cả hai có thể được thay đổi theo ý thích của bạn.
(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)))
Rõ ràng, sẽ là thanh lịch hơn khi sử dụng defadvice, nhưng tôi không thể tìm ra nơi chính xác để can thiệp. Hàm tự đi qua mỗi thời gian lưới (được đặt org-agenda-time-grid
) và tạo một danh sách mới với lưới cuối cùng bao gồm các mặt (mới).
org-agenda-time-grid
không đủ cho nhu cầu của bạn? gnu.org/software/emacs/manual/html_node/org/ cường