org-mode 의제에서 무료 시간 블록 표시


12

내 조직 모드 의제에서 무료 시간 블록이 어디에 있는지 쉽게 찾을 수 있기를 원합니다.

예를 들어, 9:30 am-10:30am과 다른 11:15 am-12:30pm에 두 약속이 있으면 10:30 am-11:15am 블록이 한눈에 들어오고 싶습니다.

다시 말해, 구글 캘린더와 같은 그래픽 아젠다 에서처럼 자유 시간을 쉽게 구별 할 수 있기를 원합니다.

빈 시간 블록을 쉽게 볼 수있는 방법이 있습니까? 주어진 시간 (분)보다 긴 빈 블록을 채색 할 수 있습니까?


2
는 IS org-agenda-time-grid되지는 당신의 요구에 충분? gnu.org/software/emacs/manual/html_node/org/…
lawlist

2
시간이 바쁠 때에도 표시되므로 그리드가 충분하지 않습니다 (예를 들어, 9:30 am-10:30am 회의가있는 경우 10:00 am에 그리드 라인이 있음). 바쁜 시간과 바쁘지 않은 시간을 쉽게 구별하고 싶습니다.
scaramouche

1
이 기능에 대해 조금 더 생각했습니다. 구현하는 데 가장 유용하고 간단한 방법은 주어진 양보다 많은 시간 블록에 대해 시간 블록의 색상을 변경하는 것입니다 (예 : 8 : 00-9 : 00). 자유 시간 (예 : 15 분 이상). 색상과 최소 여유 시간은 모두 사용자가 구성 할 수 있어야합니다.
scaramouche

3
org-mode 메일 링리스트 ( orgmode.org/worg/org-mailing-list.html ) 의 사용자 인 @scaramouche 는 시도했는지 묻습니다 calfw( emacswiki.org/emacs/Calfw ).
daveloyall

2
@daveloyall, 메일 링리스트 토론을 지적 해 주셔서 감사합니다. 방금 calfw를 시도했지만 아름답습니다!하지만 원하는 기능이없는 것 같습니다 (하루에 열린 시간을 시각적으로 파악). calfw + org (강제로 권장)를 사용하려는 경우 : Melpa에서 calfw를 입수하여 init.el포함 (require 'calfw-org)하고 달력 do를 호출하십시오 M-x cfw:open-org-calendar.
scaramouche

답변:


2

때문에의 이 질문에 내 자신의 I의 기능 보았다 org-agenda-add-time-grid-maybe시간 그리드를 만듭니다. OP의 의견에 요청 된대로 시간이 바쁘면 거기에 게시 된 코드 (나에 의해 작성되지 않은)는 그리드 라인을 제거합니다.

당신처럼, 나는 어떤 방식으로 시각적 블록을 만들고 싶었습니다. org-agenda-add-time-grid-maybeMichael Ekstrand 의 원래 코드 와 defadvice를 다른 스레드에 게시하여에 대한 다음 코드를 생각해 냈습니다 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)을 거치며 면 (신규)을 포함하여 최종 그리드로 새 목록을 만듭니다.


1
유용하지만 실제로 누군가가의 함수를 직접 재정의하지 않는 솔루션을 제안하기를 바랍니다 org-agenda.
holocronweaver

나는 절대적으로 동의한다! 불행히도, elisp와 org-mode 코드에 대한 나의 지식만으로는 제대로 작동하지 않을 수 있습니다. 어쩌면 다른 누군가가 "내"코드를 사용하여 여기에서 도울 수있을 것입니다.
Fabian
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.