org-modeでの詳細なスケジュール設定方法

emacsでorg-modeを利用していて、ちょっと複雑なスケジュールを設定したい時に困ったので、調べたことをメモしておきます。 org-modeのFAQ によれば、以下のような指定ができるようです。

org-modeで複雑な予定を設定する。

1) 長期間に渡る予定 <日付>と<日付>を -- でつなぐ。

 * 休暇
 <2009-03-20 Fri>--<2009-04-01 Wed>

 限られた期間のスケジュールは・・・

 ** 授業 7:00pm-9:00pm
   <%%(org-class 2009 2 16 2009 4 20 1 10)>

 ・・・という書き方もあります。最後の 1 と 10 で、それぞれ月曜日、第10週を例外としています。

 例外とする週を設定できるのは便利ですが、1年の通算週での指定なのが、少し不便かも。

2) 毎週繰り返される予定 日程にどういう周期で繰り返されるのかを設定。

 * 定例ミーティング
 <2009-01-20 Tue 14:00 +1w>

  例の場合、+1w で毎週の繰り返し、+3dなら3日ごとの繰り返し、+1mなら1ヶ月ごとの繰り返し。   指定方法は、+1wの他に .+1wという形式もあるようですが、2つの違いが今ひとつわかってないかも。(^^;

3) 週末以外に繰り返される予定の設定方法。

 ** 毎日の会議
 <%%(memq (calendar-day-of-week date) '(1 2 3 4 5))>

 例は、土日以外に実施される予定。

4) 毎月第3水曜日に繰り返す設定。

 * 月例会議
  <%%(diary-float t 3 3)>

5) ある期間の特定の曜日のスケジュール設定。

 ** 授業 7:00pm-9:00pm
   <%%(and (= 1 (calendar-day-of-week date)) (diary-block 2 16 2009 4 20 2009))>

  例は、2009年の2月16日から4月20日の毎週月曜日を指定した場合。   曜日は、日曜 = 0、月曜 = 1・・・で指定。

 もっと複雑な・・・

** 授業 7:00pm-9:00pm
   <%%(unless (diary-block 3 9 2009 3 13 2009) (and (= 1 (calendar-day-of-week date)) (diary-block 2 16 2009 4 20 2009)))>

 ・・・といった設定もできるようですが、あまり複雑にすると何を設定したのか把握しづらいかも。(^^;

 その他の例も、org-FAQで紹介されていますが、個人的には上の設定くらいで十分かも。

[おまけ]Macの通知センターを使って予定を通知する方法

 mac の場合 terminal-notifier を導入すると、mac の通知センターからも予定を通知してくれるようになるので便利です。(emacsの設定は、以下を参照)

;; 予定を通知センターで表示
(setq appt-time-msg-list nil)    ;; clear existing appt list
(setq appt-display-interval '10) ;; warn every 10 minutes from t - appt-message-warning-time
(setq
  appt-message-warning-time '10  ;; send first warning 10 minutes before appointment
  appt-display-mode-line nil     ;; don't show in the modeline
  appt-display-format 'window)   ;; pass warnings to the designated window function
(appt-activate 1)                ;; activate appointment notification

(org-agenda-to-appt)             ;; generate the appt list from org agenda files on emacs launch
(run-at-time "24:01" 3600 'org-agenda-to-appt)           ;; update appt list hourly
(add-hook 'org-finalize-agenda-hook 'org-agenda-to-appt) ;; update appt list on agenda view

;; set up the call to terminal-notifier
(Defvar my-notifier-path "terminal-notifier")  
(defun my-appt-send-notification (title msg)
  (shell-command 
   (concat my-notifier-path " -message " msg
           " -title " title
           " -sender org.gnu.Emacs -active org.gnu.Emacs"
           " -sound Funk")))

;; designate the window function for my-appt-send-notification
(defun my-appt-display (min-to-app new-time msg)
  (my-appt-send-notification 
    (format "'Appointment in %s minutes'" min-to-app)
    (format "'%s'" msg)))

;; Call function my-appt-display before function appt-display-window.
(advice-add 'appt-disp-window :before 'my-appt-display)

; 保存時にorg-agenda-to-apptを実行
(add-hook 'org-mode-hook
      (lambda() (add-hook 'before-save-hook
                          'org-agenda-to-appt t)))