理科系の勉強日記

Linux/Ubuntu/Mac/Emacs/Computer vision/Robotics

Emacs org-modeで快適タスク管理 入門

# 追記2017/1/24
#
# 前回の更新(2012)から時間が経過したので、記事の内容を一部変更しました。

What's org-mode

Org-modeは、ノートの保存,TODOリストの管理、プロジェクト計画のためのモードです。
高速で効率的なプレーンテキストのシステムを使ってファイルを編集します。
Org-modeは2003年にCarsten Dominik氏によって作られ、
2011年からBastien Guerry氏によって管理されています。(本家より)

本家
http://orgmode.org/
日本語版
http://orgmode.org/ja/index.html


デフォルトでもorg-modeが入っていると思います。M-x org-modeでorg-modeにした後にM-x org-versionでバージョンが確認すると、以下のように出力されました。

Org-mode version 8.2.10

Install

デフォルトで入っているのでインストールする必要はありません。M-x list-packagesでインストールしてもいいです。2012年に記事を書いたときは、本家からダウンロードしていたようです。

init.elにも少し設定を書いておきます。自分が書いている設定を載せておきます。
(init.elって何?という人はググってください。)

;;-------------;;
;; org-mode    ;;
;;-------------;;
;; path to org
;; 自分でインストールしていたころの名残。すでに不要
;; (setq load-path (cons "~/.emacs.d/org-7.9.2/lisp" load-path))

;; 画像をインラインで表示
(setq org-startup-with-inline-images t)

;; 見出しの余分な*を消す
(setq org-hide-leading-stars t)

;; LOGBOOK drawerに時間を格納する
(setq org-clock-into-drawer t)

;; .orgファイルは自動的にorg-mode
(add-to-list 'auto-mode-alist '("\\.org\\'" . org-mode))

;; org-directory内のファイルすべてからagendaを作成する
(setq my-org-agenda-dir "~/org/")
(setq org-agenda-files (list my-org-agenda-dir))

;; TODO状態
(setq org-todo-keywords
      '((sequence "TODO(t)" "WAIT(w)" "NOTE(n)"  "|" "DONE(d)" "SOMEDAY(s)" "CANCEL(c)")))

;; DONEの時刻を記録
(setq org-log-done 'time)

;; ショートカットキー
(global-set-key "\C-cl" 'org-store-link)
(global-set-key "\C-cc" 'org-capture)
(global-set-key "\C-ca" 'org-agenda)
(global-set-key "\C-cb" 'org-iswitchb)

How to use

適当なディレクトリにhoge.orgなどというファイルを作りEmacsで開くと、モード行(テキストウィンドウとミニバッファの間の横棒)にOrgと表示され、org-modeで起動したことが確認できます。
f:id:kenbell1988:20170124231729p:plain


以下では、(自分がよく使う)org-modeの非常に簡単な機能について説明します。

レベル

"*"(アスタリスク)の個数でレベルを表現する事ができます。
f:id:kenbell1988:20170124231529g:plain
TABを押すと、カーソルより下のレベルを折りたたむことができます。アスタリスクの後ろに半角スペースを挟まないと認識されないことに注意してください。

改行するときに M-RET(returnキー)とすると、同じレベルのアスタリスクが自動的に付加されます。M-→、M-←で後からレベルを変えることもできます。

箇条書き,チェックボックス

org-modeでは箇条書きを簡単に書くこともできます。
f:id:kenbell1988:20170124231541g:plain

* 箇条書き
  - まずは「-」を記入
  - M-RETを入力
  - S-→,S-←で「-」を数字などに変化させる

最初にハイフン等で箇条書きを作れば、それ以降はM-RETでどんどんと作成することができます。レベルと同様、その後M-→、M-←で別の文字に切り替える事ができます。S-→、S-←を入力すると、箇条書きのマークをいろいろと変更できます。

さらにorg-modeではチェックボックスをつくることもできます。
f:id:kenbell1988:20170124231614g:plain

* チェックボックス[1/3]
  - [X] [/]と手入力 
  - [ ] 「-」を入力後,M-S-RETを入力しボックスを増やす
  - [ ]  ボックスの上でC-cとするとチェックが入る
    + [ ] 子もつくることができる
    + [ ] 子のチェックがうまると親にチェックが入る

箇条書きをはじめる前に[/]と書いておくことで、いくつのチェックボックスにチェックが入っているかを管理することができます。その後は先程と同様に箇条書き状態に移行し、今度はM-S-RETで改行すると自動的にチェックボックスが生成されます。チェックボックス上でC-cを入力するとチェックが入り、自動的に[1/3]などとなります。

タスク管理

レベルを表すアスタリスクの後ろにTODOやDONEなどをつけて、Emacs上でタスク管理ができるのもorg-modeの特徴です。

M-S-RET(Meta Shift return)で改行すると自動的に次の見出しにTODOがつきます。その状態でS-→やS-←を入力するとタスクの状態を遷移させることができます。デフォルトではTODOとDONEのみですが、以下を設定ファイルに記入することでWAIT状態が可能となります。"|"の左側が赤色で表示され未実施を表しています。

;; TODO状態
(setq org-todo-keywords
      '((sequence "TODO(t)" "WAIT(w)" "NOTE(n)""|" "DONE(d)" "SOMEDAY(s)")))

TODOの直後にある[#A]は,タスクの優先度を表しています。S-↑,S-↓キーで操作することができます。


また、スケジュールとデッドラインを設定することもできます。
f:id:kenbell1988:20170124232514g:plain
C-c C-s ---> SCHEDULED: <2012-11-15 木>
C-c C-d ---> DEADLINE: <2012-11-16 金>
これらを入力するとミニバッファにカレンダーが表示され、そこから日付を選ぶ。カレンダー上の移動はS-矢印キー、RETで決定します。

TODOをDONEにすると日付が入るのは、設定に以下を書いているからです。

;; DONEの時刻を記録
(setq org-log-done 'time)

個人的にはSCHEDULEの代わりに
C-c . ---> <2012-11-16 金>
C-u C-c . ---> <2012-11-16 金 22:11>
これらをよく使っています。

時間計測

f:id:kenbell1988:20170124231608g:plain
どのタスクにどれだけ時間を費やしたのかということを管理できるのもorg-modeの大きな特徴です。時間を計測したい見出し(アスタリスク)の中でC-c C-x C-iとするとタイムスタンプが押されます。タスク終了時にC-c C-x C-oとすると計測が完了し,以下のような形で記録される。
C-c C-x C-i ---> C-c C-x C-o

* 研究
** DONE [#A] 研究 [2/2]
   :LOGBOOK:
   CLOCK: [2012-11-15 木 14:50]--[2012-11-15 Thu 23:40] =>  8:50
   CLOCK: [2012-11-14 水 18:15]--[2012-11-14 水 19:03] =>  0:48
   CLOCK: [2012-11-14 水 15:45]--[2012-11-14 水 17:00] =>  1:15
   CLOCK: [2012-11-13 火 21:05]--[2012-11-13 火 21:42] =>  0:37
   CLOCK: [2012-11-13 火 18:06]--[2012-11-13 火 19:19] =>  1:13
   CLOCK: [2012-11-12 月 2:00]--[2012-11-12 月 11:10] =>  9:10
   :END:

一度Emacsを閉じるなど時計を止めずに作業を中断した場合は、手作業で時間を記入するとよいでしょう。コピペしてもいいですし、さきほどのC-u C-c .で時刻を記録してもいいです。(その場合は">"にカーソルを合わせて、上下矢印で"]"にしてください)そのときC-c C-cとすると矢印と作業時間を更新することができます。

また,そのタスク(ここでは研究)にどれだけの時間を費やしたのかという合計の値が見たい場合はC-c C-x C-dとすると以下のように表示されます。

* 研究...........................................................* 21:53
** DONE [#A] 研究 [2/2]
...
agenda

f:id:kenbell1988:20170124231630g:plain
日付や時刻を入力するとagendaで時間を管理することができるようになります。org-mode最大の魅力かと思います。先ほど設定ファイルに書いた設定のおかげで、指定したフォルダにあるすべての.orgファイルからagendaを自動で作成してくれます。

C-c aを入力すると(先ほど設定ファイルに書いたショートカットキー)ミニバッファに以下のようなメッセージが表示されます。

Press key for  an agenda command:
------------------------------
a   Agenda for current week or day
t   List of all TODO entries

...

表示に従ってaを押すと、一週間の曜日と,自分が設定したTODOやDONEした時刻などがタイムライン上に表示されます。

Week-agenda (W46):
Monday     12 November 2012 W46
  class:      16:30...... 量子計測
Tuesday    13 November 2012
  2012_11_09: Scheduled:  DONE [#A] シミュレーション学
  2012_11_09: Scheduled:  SOMEDAY [#B] 散髪
Wednesday  14 November 2012
  class:      10:30...... 生体機能工学 
  class:      13:00...... 電磁気
  class:      14:45...... 真空装置
  2012_11_09: Scheduled:  DONE [#A] 留学生用過去問
  2012_11_09: Scheduled:  友人とご飯
Thursday   15 November 2012
Friday     16 November 2012
  2012_11_09: Deadline:   DONE [#A] 奨学金書類
  2012_11_09: Deadline:   DONE [#A] 研究 [2/2]
  2012_11_09: Deadline:   TODO [#B] 歓迎会集金[14/15]
  2012_11_09: Deadline:   SOMEDAY [#B] 散髪
  2012_11_09: Deadline:   TODO [#C] 家賃
Saturday   17 November 2012
  2012_11_09: In  -1 d.:  TODO [#B] 歓迎会集金[14/15]
  2012_11_09: In   1 d.:  TODO [#B] TOEIC [0/3]
  2012_11_09: In  -1 d.:  TODO [#C] 家賃
Sunday     18 November 2012
  2012_11_09: Deadline:   TODO [#B] TOEIC [0/3]

さらにlを押すと

Saturday   17 November 2012
               8:00...... ----------------
              10:00...... ----------------
              12:00...... ----------------
              14:00...... ----------------
  2012_11_09: 14:54...... Closed:     DONE [#C] blogを書く
              16:00...... ----------------
              18:00...... ----------------
              20:00...... ----------------
              22:21...... now - - - - - - - - - - - - - - - - - - - - - - - - -

といった具合に、何時に何を行ったかということを表示することができます。カーソルを動かしてRETを入力すると、該当するorgファイルまでジャンプすることもできます。複数のファイルにわたってTODO管理をしている場合でも一つのタイムライン上に表示することができるため大変便利です。

時間計測2

f:id:kenbell1988:20170124232513g:plain
最後に、ある期間に何にどれだけの時間を費やしたのかということを表形式で出力する方法です。下記スクリプトを書いて、スクリプトのどこかにカーソルを置いた状態でC-c C-x C-uを入力します。このとき、tstartとtendの時間の間の時間をagendaに登録されているファイルから調べて合計してくれます。等幅フォントじゃないと表がずれることがあります。自分の環境ではMSゴシック+Consolasでうまく表示されています。

#+BEGIN: clocktable :maxlevel 10 :scope agenda :tags "" :tstart "2017-01-05" :tend "2017-01-25"
#+CAPTION: Clock summary at [2017-01-24 Tue 23:01]
#+END

おわりに

常にEmacsを起動している人にとってEmacs上でタスク管理を行うことはとても自然なことです。まずは基本的な操作で日常のタスクを管理するところからはじめて、徐々に扱う機能を増やしていけばいいと思います。

org-modeは覚えるべきキーバインドが多くてはじめは苦戦するかもしれませんが、ファイルの冒頭にチートシートを書いておけば迷ってもすぐに見返せて便利です。また、細かいところまで説明できませんでしたが、試行錯誤で身につくはずですので、楽しんで覚えていってください。