Hiển thị khối thời gian miễn phí trong chương trình nghị sự của chế độ org


12

Tôi muốn làm cho nó dễ dàng tìm thấy các khối thời gian miễn phí trong chương trình nghị sự của tôi ở đâu.

Chẳng hạn, nếu tôi có hai cuộc hẹn một lúc 9:30 sáng-10: 30 sáng và một 11:15 sáng 12:30 tối khác, tôi muốn thấy trong nháy mắt rằng khối 10:30 sáng-11: 15 sáng là miễn phí.

Nói cách khác, tôi muốn có thể phân biệt thời gian rảnh dễ dàng như được thực hiện trong một chương trình đồ họa như lịch Google.

Có cách nào để làm cho các khối thời gian trống dễ nhìn thấy không? Có lẽ để tô màu các khối trống dài hơn một số phút nhất định?


2
org-agenda-time-gridkhông đủ cho nhu cầu của bạn? gnu.org/software/emacs/manual/html_node/org/ cường
luật

2
Lưới điện là không đủ, vì nó hiển thị ngay cả khi thời gian bận rộn (ví dụ: nếu có cuộc họp 9:30 sáng-10: 30 sáng, sẽ có một đường lưới vào lúc 10:00 sáng). Tôi muốn thời gian bận rộn và không bận rộn để dễ phân biệt.
Scaramouche

1
Tôi đã nghĩ thêm một chút về chức năng này. Tôi tin rằng cách hữu ích và đơn giản nhất để thực hiện sẽ là thay đổi màu của khối thời gian (chỉ tên của khối thời gian, ví dụ: 8: 00-9: 00) cho những khối thời gian có nhiều hơn một lượng nhất định thời gian rảnh (ví dụ: hơn 15 phút). Cả màu sắc và thời gian rảnh tối thiểu phải là cấu hình người dùng.
Scaramouche

3
@scaramouche, một người dùng trong danh sách gửi thư ở chế độ org ( orgmode.org/worg/org-mailing-list.html ) hỏi bạn đã thử chưa calfw( emacswiki.org/emacs/Calfw ).
daveloyall

2
@daveloyall, cảm ơn rất nhiều vì đã chỉ vào cuộc thảo luận danh sách gửi thư. Tôi mới thử calfw (và nó rất đẹp!), Nhưng dường như nó không có chức năng tôi muốn (để phát hiện trực quan thời gian mở trong ngày). Đối với những người muốn thử calfw + org (rất khuyến khích): hãy lấy calfw từ Melpa, trong init.el, bao gồm (require 'calfw-org)và để gọi lịch làm M-x cfw:open-org-calendar.
Scaramouche

Câu trả lời:


2

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-maybetạ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-maybevà 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).


1
Hữu ích, nhưng tôi thực sự hy vọng ai đó đưa ra một giải pháp không liên quan trực tiếp đến chức năng ghi đè org-agenda.
holocronweaver

Tôi hoàn toàn đồng ý! Thật không may, kiến ​​thức về elisp và mã chế độ org của tôi không đủ để đưa ra một khiếm khuyết hoạt động. Có lẽ, người khác có thể giúp đỡ ở đây, có thể sử dụng một số mã "của tôi".
Fabian
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.