เพราะคำถามของฉันนี้ฉันจึงดูฟังก์ชั่นorg-agenda-add-time-grid-maybe
ที่สร้างตารางเวลา รหัสที่โพสต์นั้น (ซึ่งไม่ได้เขียนโดยฉัน) จะลบเส้นกริดหากเวลาไม่ว่างตามที่ร้องขอในความคิดเห็นของ OP
เช่นเดียวกับคุณฉันต้องการที่จะสร้างบล็อกภาพในบางวิธี โดยการผสมขึ้นรหัสต้นฉบับของorg-agenda-add-time-grid-maybe
และ defadvice โดยไมเคิล 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)))
เห็นได้ชัดว่ามันจะดูสง่างามกว่าที่จะใช้ข้อเสีย แต่ฉันไม่สามารถคิดได้ว่าจะเข้าไปแทรกแซงที่ไหน ฟังก์ชั่นของตัวเองจะต้องผ่านทุกตารางเวลา (ตั้งค่าในorg-agenda-time-grid
) และสร้างรายการใหม่ที่มีตารางสุดท้ายรวมถึงใบหน้า (ใหม่)
org-agenda-time-grid
ไม่เพียงพอสำหรับความต้องการของคุณ gnu.org/software/emacs/manual/html_node/org/…