Org-modeとnotify-sendで、一歩進んだスケジュール管理をしよう

スケジュールの管理には、作成と参照があります。
Org-modeでのスケジュールの作成は、前回紹介した[「Org-modeで、ライフログを録ろう」](http://qiita.com/takushi1969/items/1653235191c0d1538a84)とさして違いはありません。ヘッドラインに、タイムスタンプを付けるだけです。
そして、スケジュールの参照には、Agenda viewを使う方法が一般的かと思います。

私も、これまで、Org-modeでスケジュールを管理してきました。しかし、日々の作業量に忙殺されて、スケジュールを忘れてしまうこともしばしばでした。
改善策を模索していたところ、「これだ!」と思えるものがありましたので、紹介します。

# 参考 #

この記事の作成にあたり、以下を参考とさせていただきました。
1. [EMACS-FU showing-popups](http://emacs-fu.blogspot.jp/2009/11/showing-pop-ups.html)

# 前提 #

[「Org-modeで、ライフログを録ろう」](http://qiita.com/takushi1969/items/1653235191c0d1538a84)に従って、Org-modeの環境が導入されていることを前提としています。

# スケジュールの作成 #

まず、Org-modeでスケジュールを作成方法を紹介します。

## 1. スケジュールの作成 ##

**C-c c j**とタイプして、スケジュールの作成を開始します。
ヘッドラインにスケジュールの内容を作成します。

![setScheduleTime.png](https://qiita-image-store.s3.amazonaws.com/0/59920/8a04a0e9-4bce-8650-dea9-a8d41645283d.png)

## 2. タイムスタンプの作成 ##

**C-u C-c .**とタイプして、タイムスタンプの作成モードに入ります。
以下に示すキー操作で、Calendarバッファの指定日付を移動させることができます。

| key          | 移動                    |
|:------------:|:-----------------------:|
| S- < left >  | 日付を1日前に移動する。   |
| S- < right > | 日付を1日後に移動する。   |
| S- < up >	   | 日付を1週間前に移動する。 |
| S- < down >  | 日付を1週間前に移動する。 |

![calendarbufferSmall.png](https://qiita-image-store.s3.amazonaws.com/0/59920/4ae5a8ed-f1cb-2b15-66d7-43ec37b99085.png)

スケジュールの日付に移動したら、リターンキーを押下して、日付を確定させます。
次に、ヘッドラインに挿入された日付の時間部分にカーソールを移動させて、時間を上書きします。
また、終了時間が決まっているのであれば、以下の例を参考にして、レンジ指定します。

	<2015-02-01 日 15:00-16:00>

![setTimeSmall.png](https://qiita-image-store.s3.amazonaws.com/0/59920/03d25cc1-d9d6-2111-6734-94a054c7f48e.png)

後は、必要に応じて、スケジュールの補足情報を記事の部分に記載してください。

# スケジュールの参照 #

Org-modeでは、**C-c a a**とタイプすることで、スケジュールを確認することができます。

![viewAgendaSmall.png](https://qiita-image-store.s3.amazonaws.com/0/59920/a4c6cfde-7a32-5b75-b5d7-abd180467582.png)

# 一歩進んだスケジュール管理 #

1日のスケジュールを1度確認したら忘れない人は、上記だけで問題ないのですが、私は物忘れが激しいので、そうも行きません。
そんな私でも、スケジュールの直前に画面通知の気づきを与えてもらえれば、少しは改善が期待できそうです。

それでは、Org-modeのスケジュールを画面通知できるようにしてみましょう。

## 準備 ##

### 1. パッケージの追加 ###

画面通知には、notify-sendコマンドを使用します。
notify-sendコマンドがインストールされていない場合は、以下のコマンドを実行してください。

`$ sudo apt-get install libnotify-bin`

### 2. $HOME/.emacs ###

$HOME/.emacsに以下のコードを追加してください。
コードの詳細は、コメントを参照してください。

```lisp:
;; The setting for appointment
; Org-modeのスケジュール管理に、カレンダーのアポイントメントを使用する。
; カレンダーのアポイントメントを使用することで、ユーザは、スケジュール
; の開始前に、通知を受けることが出来るようになる。
; 

; アポイントメントを動作させるための各種設定
(setq
 appt-display-format 'window
 appt-display-mode-line t
 )
(appt-activate 1)
(display-time)

; notify-sendコマンドのラッパ関数
(defun notify-wrapper (min-to-app new-time msg)
  "notify-sendコマンドのラッパ関数。
画面上にスケジュールの通知を行なう。
もし、ユーザがXウインドシステムを使用していない場合、
スケジュールは、Emacsのミニバッファ内に表示する。"
  (interactive)
  (let 
      ((title (format "予定まで%s分" min-to-app))
       (notify-icon "/usr/share/icons/gnome/32x32/status/appointment-soon.png"))
    (if (eq window-system 'x)
        (shell-command (concat "notify-send"
                               " -i " notify-icon
                               " '" title "'"
                               " '"  msg "'"))
      (message (concat title ": " msg)))))
  
; appointmentの表示に、notify-wrapperを使用する
(setq appt-disp-window-function (function notify-wrapper))

; Agenda viewを参照する都度、Org-modeのスケジュールをアポ
; イントメントに変換する。
(add-hook 'org-finalize-agenda-hook 'org-agenda-to-appt)
```

## 使用方法 ##

以下の手順を実行することで、Org-modeのスケジュールの画面通知を有効となります。

1. Emacsを起動
2. 新規スケジュールの追加

	追加するスケジュールがなければ、スキップしてください。
3. スケジュールの参照

	**C-c a a**をタイプし、Agenda viewバッファを参照する。

ex.画面通知の例
以下の例では、Agenda viewを参照していますが、一度、Agenda viewを参照した後は、どのバッファで作業していても、画面通知されるようになります。
![notifySmall.png](https://qiita-image-store.s3.amazonaws.com/0/59920/fd3bcab4-ff60-004f-1f4e-642302d0e7a8.png)

## 使用上の注意事項 ##

* **新規スケジュールを追加する場合は、"使用方法"の手順2と3を繰り返してください。**

	Agenda viewによるスケジュールの参照が、カレンダーのアポイントメントの変換のキックになっています。
* **Emacsは終了しないでください。**

	画面通知は、スケジュール参照を実行したEmacsが起動している間のみ有効です。

次回は、上記課題の解決方法を検討したいと思います。