org-modeのアジェンダで無料の時間ブロックを表示する


12

組織モードのアジェンダで、時間の空きブロックがどこにあるかを簡単に見つけたいと思います。

たとえば、午前9時30分から10時30分と午後11時15分から12時30分までの2つのアポイントメントがある場合、10時30分から11時15分までのブロックが無料であることを一目で見たいです。

言い換えれば、Googleカレンダーなどのグラフィカルなアジェンダで行われるのと同じくらい簡単に自由時間を区別できるようにしたいのです。

空の時間ブロックを見やすくする方法はありますか?おそらく、指定された分数より長い空のブロックを色付けするのでしょうか?


2
org-agenda-time-gridニーズに十分ではありませんか? gnu.org/software/emacs/manual/html_node/org/...
lawlist

2
グリッドは十分ではありません。時間が忙しいときでも表示されます(たとえば、午前9時30分から午前10時30分までの会議がある場合、午前10時にグリッド線が表示されます)。忙しい時間と忙くない時間を区別しやすくしたいと思います。
scaramouche

1
この機能についてもう少し考えました。実装するのに最も便利で最も簡単なのは、指定された量を超えるタイムブロックのタイムブロックの色(タイムブロックの名前のみ、たとえば8:00〜9:00)を変更することです。自由時間(たとえば、15分以上)。色と最小空き時間の両方をユーザーが構成できるようにする必要があります。
scaramouche

3
@ scaramouche、org-modeメーリングリスト(orgmode.org/worg/org-mailing-list.html)のユーザーは、あなたが試したかどうかを尋ねますcalfwemacswiki.org/emacs/Calfw)。
-daveloyall

2
@daveloyall、メーリングリストの議論を指摘してくれてありがとう。calfwを試してみました(そしてそれは美しいです!)が、(1日の営業時間を視覚的に確認するために)必要な機能を備えていないようです。calfw + orgを試してみたい人(強く推奨):メルパからcalfwを入手し、in init.el、include (require 'calfw-org)、およびcalendar doを呼び出しますM-x cfw:open-org-calendar
-scaramouche

回答:


2

私自身のこの質問のために、私org-agenda-add-time-grid-maybeは時間グリッドを作成する関数を見ました。そこに投稿されたコード(私は作成していません)は、OPのコメントで要求されているように時間が忙しい場合、グリッド線を削除します。

あなたのように、私は何らかの方法で視覚的なブロックを作成したかったのです。の元のコードorg-agenda-add-time-grid-maybeと他のスレッドに投稿されたMichael Ekstrandによる欠点を組み合わせることで、次のコードを思い付きましたorg-agenda-add-time-grid-maybe。それは異なる色でグリッド線を出力します(私は今のところfaceを使用しています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コードに関する私の知識は、実用的な欠陥を思い付くには不十分です。おそらく、他の誰かがここで手伝うことができ、おそらく「私の」コードのいくつかを使用します。
ファビアン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.