Emacs の org-mode でスケジュール管理をしよう！

# はじめに
  1 年前の Emacs Advent Calendar で org-mode の基本について紹介しました。

  [TODO リストとメモ書きにだけ Emacs を使ってみませんか？](http://qiita.com/akisute3@github/items/8e45d97abc2d4fce8780)

  読んでくださった人はいるでしょうか？ この記事を読んで Emacs や org-mode を使い始めたという人がいればとても嬉しいです！

  今回は以前の内容を踏まえ、org-mode の TODO リストの機能をもっと便利にするいくつかの機能について紹介したいと思います。

## この記事で紹介する機能
   - TODO, DONE 以外の状態の追加
   - 優先度、カテゴリ、タグの設定
   - サブタスクの管理、進捗の表示
   - スケジュール (予定日、締め切り) の設定
   - 複数の TODO リストの一括表示 (org-agenda)

## 対象読者
   以下のような方々に読んでもらいたいです。

   - 去年の org-mode 紹介記事を読んで Emacs, org-mode を使い始めた人
   - 普段 Emacs を使っているが、TODO の管理には org-mode 以外を使用している人
   - org-mode の TODO は使っているが、複数のファイルに散らばっている TODO の管理に困っている人
   - org-mode でスケジュール管理をしてみたいが、機能が多すぎて何から始めればよいかわからない人

   Emacs や org-mode について全くの初心者という方は、先に [去年の記事](http://qiita.com/akisute3@github/items/8e45d97abc2d4fce8780) を読んでもらうのがオススメです。Windows に Emacs をインストールする方法やファイルの開き方といった基本についても少し触れています。

   今回も、去年と同様、覚えるキーができるだけ少なくなるように説明することを心がけています。これから使ってみようという人は、とりあえずここに書かれているキーだけ覚えて使ってみて、慣れてきたら他の便利なキーを徐々に覚えていくのがいいでしょう。

   Emacs のオススメ環境は Linux ですが、この記事の内容であれば Windows でも十分利用可能です。それを示すために、スクリーンショットや GIF アニメーションでは Windows の Emacs 24.3、org-mode 7.8.11 を使用しています。Linux でも当然動きますし、基本的な機能しか説明していないのでおそらく org-mode 8.0 以降でも同じ操作で利用できます。

# todo リストを強化する
  前回は説明しなかった org-mode の TODO に関連する様々な機能を紹介していきます。

  これらの機能のうち、必要ない機能は別に使わなくても構いません。ただ、この後に紹介する TODO 一括表示で役に立つものも多いので、知らなかった人はぜひ試してみてください。

  なお、ここで紹介している様々な機能は、結局はテキストの文字列のため、挿入キーなどを使用せずに自分で適切な位置に同じ文字列を入力しても機能します。

## 状態の追加
   org-mode の TODO リストにはデフォルトで TODO, DONE という 2 つの状態が定義されています。

   これらの状態はファイル先頭に以下のような定義を記述することで自由に変更することができます。

```
#+TODO: TODO FEEDBACK VERIFY | DONE CANCELED
```

   間の `|` は未完了と完了の区切りになります。

   ![status.gif](https://qiita-image-store.s3.amazonaws.com/0/1637/5710b258-2af4-860e-5072-977651d66b36.gif)

   (アニメーション途中の `M-x org-mode-restart` はファイル先頭の設定を反映させるコマンドです。ファイルを開き直しても設定を有効化できます。)

## 優先度の導入
   TODO に優先度を付けたい場合があると思います。そんなときは `Shift-<up>` や `Shift-<down>` で優先度を設定することができます。

   デフォルトでは A, B, C の 3 つの優先度が用意されています。優先度を設定していない TODO は、優先度 B として扱われます。

   ![priority.gif](https://qiita-image-store.s3.amazonaws.com/0/1637/ad9a7c44-0701-7597-5700-3a8544cde01a.gif)

## サブタスク、進捗集計
   タスク名の後ろに `[%]` や `[/]` を記述すると、1 段下の TODO リスト (サブタスク) の進捗を表示することができます。サブタスクの状態を変更すると進捗は自動で更新されます。

   ![sub1.gif](https://qiita-image-store.s3.amazonaws.com/0/1637/198fad86-55aa-308e-7d54-e0a5a84e67a7.gif)

   ただし、サブタスクのサブタスクといった 2 段以上下の TODO リストの進捗も合わせて集計したい場合は、サブタスクの親となる見出しの直下に以下の設定を記述する必要があります。

```
:PROPERTIES:
:COOKIE_DATA: recursive
:END:
```

   ![sub2.gif](https://qiita-image-store.s3.amazonaws.com/0/1637/64f270ec-35c0-bb5b-f2b3-d4e8e5c870e2.gif)

## タグやカテゴリによる分類
   カテゴリはファイル毎に付けられる分類です。ファイル先頭に以下のような設定を記述します。

```
#+CATEGORY: Thesis
```

   また、ファイル単位ではなく TODO 単位の分類としてタグを付けることも可能です。

   タグは TODO の上で `C-c C-c` で追加・編集が可能です。1 つの TODO に複数のタグを付ける場合は、各タグを `:` で区切って入力して下さい。

   ![tag.gif](https://qiita-image-store.s3.amazonaws.com/0/1637/21c0d77d-a99b-915f-792b-0b8f5fccf4a0.gif)

## 締め切りや作業予定日の管理
   TODO 毎に締め切り (DEADLINE) や作業予定日 (SCHEDULED) を指定することが可能です。

   締め切りを入力する場合は `C-c C-d` を、作業予定日を入力する場合は `C-c C-s` を入力します。

   これらのキーを入力すると、カレンダーが表示されます。 `Shift-<方向キー>` でカーソルを移動できるので、入力したい日付までカーソル移動して `Enter` を押してください。

   ![timestamp.gif](https://qiita-image-store.s3.amazonaws.com/0/1637/b4174f49-04ce-1804-077c-c7d04e93ae1a.gif)

# todo を確認する
  複数のファイルの様々なところに TODO が散らばっていると確認が大変です。

  そんな場合は org-agenda が便利です。複数ファイルにまたがった TODO を様々な形式 (ビュー) で表示することが可能になります。

## org-agenda の設定
   org-agenda を使用するためには、どのファイルを TODO リストとして扱うかを Emacs に事前に教えてやらないといけません。そのためには Emacs の設定ファイルに、以下のような設定を記述する必要があります。

```elisp
(setq org-agenda-files '("d:/emacs-24.2-20121208/data/todo.org"
                         "d:/emacs-24.2-20121208/data/list.org"
                         "d:/emacs-24.2-20121208/data/work.org"))
```

   `" "` で囲んでいるのが対象としたいファイルのパスです。同じような形式でいくつでも記述していくことができます。

   普段から Emacs を使用している人であれば、いわゆる .emacs のお好きなところにお書き下さい。

   もし Emacs の設定の書き方がわからなければ、下のアニメーションのように `C-x C-f` で出現する `Find file:` に `~/.emacs.d/init.el` と記述して Enter で開いたファイルに書けば大丈夫です。

![config.gif](https://qiita-image-store.s3.amazonaws.com/0/1637/818687cb-8e3a-89d9-2b23-183b82a16485.gif)


   また、ついでに org-agenda を開くためのキーバインドも設定しておきましょう。

   以下が一般的に使用されている `C-c a` を org-agenda に割り当てる設定です。これも先程の設定の上か下に追記してください。

```elisp
(global-set-key (kbd "C-c a") 'org-agenda)
```

   これらの設定が記述し終わったら、設定を反映するために Emacs を再起動してください。

   以下、`C-c a` で org-agenda を起動できることが前提として説明します。

## org-agenda を開く
   キーの設定をすると、org-agenda に登録されているファイルを開いている状態で `C-c a` を入力したときに org-agenda のメニューが開くようになります。ここから各キーで様々なビューに飛ぶという仕組みです。

   org-agenda にはいくつものビューがありますが、ここでは「これさえ覚えておけばどうにかなる」というビューを 1 つだけを紹介します。org-agenda メニューで `n` を押してください (ファイルを開いた直後であれば `C-c a n` ですね)。

![agenda.png](https://qiita-image-store.s3.amazonaws.com/0/1637/43257f6b-da96-40b1-ff05-698d6b75e10a.png)

   このビューは、org-agenda に登録されているファイルの全ての TODO と今週の予定を 1 つの画面にまとめて表示できるというものです。

   上部の週予定では締め切りや作業予定日をまとめて確認できます。後何日で締め切りがくるかも表示されています。

   下部の全 TODO リストでは状態やカテゴリ、タグも表示されています。優先度を設定していれば、優先度順に並び換えて表示してくれます。

   また、実はこの画面で各 TODO の編集も可能だったりします。ただ、これ以上の機能は色々と複雑なので、最初は TODO の確認のために使うだけでいいでしょう。それだけでも十分役に立つと思います。

# あとがき
  色々と説明しましたが、紹介したキーバインドは、優先度変更の `Shift-<up>/<down>`、タグ編集の `C-c C-c`、締め切り設定の `C-c C-d`、作業予定日設定の `C-c C-s`、org-agenda の `C-c a n` の 5 種類、たったこれだけです。

  この程度であれば使い始めるのもそこまで難しくないのではないでしょうか？ これでも覚えるのが面倒であれば、自分にとって重要でない機能は排除してしまっても大丈夫です。まずは簡単な優先度あたりから使い始めてみるのがいいでしょう。

  もし次回があれば、次は org-mode の表計算のやり方でも説明しようかなとか考えてたりします。ただのテキストファイルで表計算……org-mode ヤバすぎです。

  明日は @MitsutakaTakeda さんです！