Software Design連載記事を掲載します。

株式会社技術評論社の許可を得て掲載しています。
草稿なので細かい部分は実際の記事とは異なることがあります。

他の記事は左下にある「■雑誌連載中(全文公開)」から見られます。

深遠なるorg-mode

 ども、るびきちです。今回はEmacs界随一とも言われるほど多機能なメジャーモードorg-modeを採り上げます。筆者は2008年から実に7年も使っているのですが、それでも全機能を使いこなせていません。開発はずっと活発に行われていて、まさに広大な世界を作っています。ただでさえ多機能なのに拡張パッケージも70以上MELPAに登録されています。最初にorg-modeを使うと、間違いなくあまりの多機能に圧倒されます。

 広大なorg-modeを真向から習得しようとすると挫折します。使いこなすコツは、大事な機能をしっかり押さえた上で、目的に沿った機能を見つけ出すことです。本来の目的を忘れてorg-modeを使うことが目的になってはいけません。org-modeはあくまでも目的に到達するための手段です。

 org-modeはEmacs標準添付なので即使えます。拡張子.orgのファイルを開くと自動的にorg-modeになります。普通のテキストファイルもそのままorg文書として扱えますが、見出しなどはorgの文法に従って書くと綺麗にHTML等の別フォーマットに変換できます。変換をしないのであれば全ての文法を覚える必要はなく、用途に応じて使う文法を限定して使えばいいです。例えば見出しは色がつくし移動が簡単なので、見出しだけ使う方法もアリです。

 org-modeを使えば例えば以下のようなことができます。本稿もorg-modeで書いています。

  • アウトラインプロセッサ
  • HTML、XML、LaTeXなどの文書作成
  • 即座にメモをとる
  • TODOリスト管理
  • 予定管理
  • 進捗管理
  • GTDシステム
  • 時間計測
  • プロジェクトの計画を練る
  • 文書内にコードを埋め込み、実行させる
  • 表作成
  • 表計算
  • ハイパーリンク
  • インライン画像を表示する
  • グラフ作成
  • 簡易データベース
  • ブログ執筆
  • サイト作成
  • 書籍執筆
  • データ用フォーマットとして使う
  • RSSを読む
  • スマートフォンと連携する
  • などなど…

 しかし、全機能を詳しく紹介すると電話帳なみの本になってしまうので、アウトライン・表作成・ハイパーリンク・メモ・予定・HTML変換にターゲットをしぼります。これだけでほとんどカバーできます。

アウトライン

 org-modeの始まりは、outline-modeを拡張したことです。モンスターのように巨大化したorg-modeも、基本はアウトラインプロセッサです。文章を書くときにはアウトラインを決めると書きやすいですが、他の機能もアウトラインが元になっているものが多いです。

見出し

 見出しはorg-modeの最も基本になるものです。見出しは行頭で1つ以上のアスタリスクとスペースで始めます。アスタリスクが多ければ多いほど深い階層になっていきます。

==

* H1
** H2-1
*** H3-1
*** H3-2
** H2-2

==

 見出しは手でアスタリスクとスペースを入力しても構いませんが、専用のコマンドが用意されています。現在の見出しと同じ階層の見出しを入力するにはM-RET、あるいはC-RETを使います。これらのコマンドは行頭で実行した場合は直前行に、行頭以外で実行した場合は「後」の行に見出しが挿入されます。

 M-RET とC-RET の違いは子見出しを飛び超えるか否かです。M-RET は飛び超えないで直後の行に、C-RET は飛び超えた先です。上の例でH1の後でM-RETを使うとH1の下、C-RETを使うとH2-2の下になります。

 見出しを入力した後でM-<left>とM-<right>で階層を変更します。子見出しを含めて変更するときはM-S-<left>、M-S-<right>を使います。

見出し間を移動する

 見出し行から見出し行へジャンプするコマンドがいくつか用意されています。

Table1: 見出し間移動コマンド

C-c C-p 前の見出し行へ
C-c C-n 後の見出し行へ
C-c C-b 同レベルの前の見出し行へ
C-c C-f 同レベルの後の見出し行へ
C-c C-u 1階層上の見出し行へ

 ちなみに、それなりの規模のorg文書は<f1> nで見られるEmacs NEWSです。outline-modeになっているのでM-x org-modeで強制的に切り替えればorg-modeのコマンドが使えます。Unix系OSでは読み込み専用になっている場合があるので、C-x C-qで編集可能な状態にします。その状態で見出し操作コマンドを試してみてください。

リスト

 リストは箇条書きをするときに使います。見出しでもできますが、リストを使えば目次にはなりません。見出しとリストの違いは、HTMLなどに変換したときの結果が異なることです。HTMLでいえば見出しはH1〜H6、リストはUL・OL&LI要素に相当します。

 行頭を「-」か「+」で始めると番号なしのリスト、「1.」か「1)」で始めると番号つきリストになります。番号つきリストでC-c C-cを押すと番号を1から順番に割り振り直してくれます。また、C-c -でリストの形式(-, +, 1., 1))を順番に変更します。

 リストはインデントすることで入れ子にできます。前の行がリストのとき、見出しと同様の方法で入力できます。以下は見出しをリストにしたものです。

==

- H1
  - H2-1
    - H3-1
    - H3-2
  - H2-2

==

折り畳む

 org-modeの重要な機能として見出し以下の折り畳み・展開があります。この機能を使うことで、長い文書の見通しがよくなります。見出しのみを表示することで、自然と目次になります。また、下位の見出しや本文を隠すことで、必要な部分のみを表示することができます。

20141207045422.png
Fig1: 上:折畳み前 下:折畳み後

 折畳み機能はこのような仕様です。繰り返し実行することで表示方法を切り替えられるのが特徴です。この書き方自体がネストしたリストになっています。

== ここはそのまま掲載してください

C-i (TAB)
現在の見出し以下を折り畳む・表示する

  1. 見出し以下を隠す
  2. 下位見出しを表示する
  3. 全体を表示する
  4. 1へ戻る
C-u C-i (S-TAB)
文書全体の見出しのみを表示・全部表示

  1. 最上位の見出しのみを表示する
  2. すべての見出しを表示する
  3. 全体を表示する
  4. 1へ戻る

==

 従来のoutline-modeでは折畳み関連のコマンドが無数に定義されているので、とても覚えきれません。見出し・リストの扱い、折畳み方法を知るだけでもorg-modeを使う意味が出てきます。

表作成

 org-modeには優れた表作成機能があり、見栄えのいい表を超簡単に作成できます。

 org-modeの表は文字で表現されているので、適切なフォントを使う必要があります。さもないと、文字ごとに幅が異なるため、表示がずれてしまいます。文字幅が揃っているフォント(等幅フォント)で、かつASCII文字と日本語文字が1:2であることが条件です。

 条件を満たせばどのフォントでも構いませんが、筆者はRictyというプログラマ向けのフォントを使っています。見やすいし、似た文字の判別がしやすいだけでなく、全角スペースが可視化されているのが特徴です。 https://github.com/yascentur/Ricty ライセンスの関係でインストールは面倒ですが、がんばって導入する価値はあります。導入できたら、フォントの設定をします。

== フォントの設定
(set-face-font 'default "Ricty-15:bold")
==

 表を作成するには、行頭を「|」で始め、項目を「|」で区切ります。2行目からはTABを押せば自動的に次の項目へ移動してくれます。TABはレイアウト調整機能もついているので、項目がずれても心配いりません。

 境界線は行頭を「|-」で始めてTABを押すか、上の行でC-c -を押します。

== 表の例

品名 金額
パソコン 123456
1230

==

20141128091452.png
Fig2: 等幅フォントで綺麗な表!

 org-modeの表は作成が簡単なだけでなく、表計算機能も備わっています。また、文書中に書かれたEmacs Lispや他のプログラミング言語にデータとして渡して実行させることもできます(org-babel)。これらの話題は本稿の範囲を超えてしまうので触れません。筆者はorg-modeで家計簿をつけています。

ハイパーリンク

 org-modeにはハイパーリンク機能が備わっています。画像ファイルへのリンクを作成すると、インライン画像として表示してくれます。

 ハイパーリンクを作成するには、以下の2ステップです。ただし、ファイルやURLへのリンクを作成するときは、いきなり貼り付けられます。URL文字列はそのままリンクとみなされます。

  1. リンク先を取得する
  2. リンクを貼り付ける

 リンクはC-c C-oで辿ります。見出し行でC-c C-oを押すと、見出しに属する本文でのリンクを辿れます。複数個ある場合は選択肢が出てきます。

リンク先を取得する

 org-modeのハイパーリンク機能はあらゆる情報へのリンクを作成できます。その中でも一番大事なのはファイルへのリンクです。リンクしたい場所を指定するにはM-x org-store-linkを使います。このコマンドは重要なのでキーに割り当てておくべきです。C-c lに割り当てることを推奨しています。

==
(global-set-key (kbd "C-c l") 'org-store-link)
==

 ファイルに対してC-c lを実行したら、そのファイルの現在位置へのリンクを取得します。orgファイルへのリンクの場合は、現在の見出しへリンクされます。それ以外のファイルでは、現在行の文字列へのリンクになります。

 ファイルは変更され得ることに注意してください。行番号や文字のインデックスでリンクを作成すると、変更されたときにずれてしまいます。そのため、デフォルトでは現在行への文字列にリンクすることで前後の内容の変更に耐えられるようになっています。その代わり、現在行の文字列と同じ行が存在したり、現在行が変更されてしまうと望みの位置にジャンプしてくれなくなります。

 C-c lはファイル以外にもdiredやヘルプバッファなどにも対応しているので、いろんなバッファで試してみてください。リンクできるバッファを増やすための拡張パッケージもたくさんあります。

 ファイルバッファに対してC-u C-c l使うと、位置情報を記憶せず、単にそのファイルへのリンクになります。

リンクを作成する

 C-c lでリンク情報を取得したら、org-modeにおいてC-c C-lでそのリンクを貼り付けます。すると、リンクとリンクの説明文字列(HTMLでいうA要素の中身)を尋ねてきます。リンクは先程取得したリンクがデフォルトになります。リンクの説明もその行の文字列になるので、大抵の場合そのままRET RETでリンクを作成できます。説明文字列を省略すると、リンクそのものが表示されます

 URLへのリンクを作成するには、C-c C-lの後にURLを入力してください。

 位置情報なしでファイルへのリンクを作成するには、C-u C-c C-lを使います。ファイル名と説明文字列を尋ねてきます。説明文字列は省略できます。

 リンクを貼り付けると、表示内容と実際の内容が異なる状況になります。つまり、リンクとリンクの説明の情報が含まれているのに実際にはリンクの説明と下線が表示されています。emacsにはこのように見た目の内容を変更させる機能があります。リンクをリンクらしく表示してくれるのは、閲覧する上ではとても有り難いことですが、リンクを編集する際には困ったことになります。そこで、m-x visible-modeで実際の内容を表示させればよいです。

 あるいは、リンク上でC-c C-lを実行して編集することもできます。

インライン画像

 説明文字列を省略してローカルの画像ファイルへリンクすると、インライン画像として表示できるようになります。HTMLに変換したときもインライン画像になります。これによりHTML作成が簡単になるだけでなく、grep検索できるハイパーテキストとしても使えます。画像付きのメモも作成できるようになります。

 インライン画像を表示するにはC-c C-x c-vを使います。これはトグルになっているので、再度実行するとインライン画像が非表示になります。インライン画像の再描画はC-c C-x C-M-vです。

 常にインライン画像を表示させるには、次のように設定します。

==
(setq org-startup-with-inline-images t)
==

 ファイルごとに設定することもできます。ファイルのどこかに「#+STARTUP: inlineimages」という行を入れれば表示され、「#+STARTUP: noinlineimages」で非表示になります。

== インライン画像の例

org-modeのロゴ

file:org-mode-unicorn-logo.png

==

20141202070557.png
Fig3: インライン画像表示!

メモ・TODOリスト・予定管理

 org-modeは文書作成にとどまらず、日常生活を管理することもできます。素早くメモを取ったり、やるべきことや予定を書き加えたり、それらをTODOリスト・予定表という形でまとめたりします。筆者は長年、手帳の代わりにorg-modeで一元管理しています。多方面に柔軟なカスタマイズができるorg-modeは、スーパー電子手帳と言えます。

 新しい項目を書き加えるのはM-x org-capture (C-c c推奨)で行います。それによって書き加えられたメモはターゲットとなるファイルにひとまとめにされるので、後で一覧できます。

メモ・予定を書くための設定

 org-captureを使うには、最低限の設定をしておく必要があります。

 そして、どのようにメモを書き加えるのかは変数org-capture-templatesで設定するのですが、この変数はとても複雑怪奇な代物です。全貌をわかりやすく説明するのは不可能なので、以下の戦略に基いた設定を示しておくにとどめます。

  • メモにはTODO・予定用、任意のメモの2種類を用意する
  • TODO・予定用には先頭行に「TODO」が付く
  • 任意のメモには以下の情報を付記する
    • 現在時刻(%U)
    • regionがある場合はその内容(%i)
    • M-x org-capture起動時のファイルへのリンク(%a)
  • %?はテンプレート挿入後のカーソル位置

 予定表(org-agenda)の設定も予めやっておきます。変数org-agenda-custom-commandsも複雑なので深入りしないでおきます。

==

(global-set-key (kbd "C-c c") 'org-capture)
(global-set-key (kbd "C-c a") 'org-agenda)
;; org-captureで2種類のメモを扱うようにする
(setq org-capture-templates
      '(("t" "New TODO" entry
         (file+headline "~/org/todo.org" "予定")
         "* TODO %?\n\n")
        ("m" "Memo" entry
         (file+headline "~/org/memo.org" "メモ")
         "* %U%?\n%i\n%a")))
;; org-agendaでaを押したら予定表とTODOリストを表示
(setq org-agenda-custom-commands
      '(("a" "Agenda and TODO"
         ((agenda "")
          (alltodo "")))))
;; org-agendaで扱うファイルは複数可だが、
;; TODO・予定用のファイルのみ指定
(setq org-agenda-files '("~/org/todo.org"))
;; TODOリストに日付つきTODOを表示しない
(setq org-agenda-todo-ignore-with-date t)
;; 今日から予定を表示させる
(setq org-agenda-start-on-weekday nil)

==

メモを書き加える

 メモはC-c cを押して、どのメモにするかを選択します。「t」でTODO・予定、「m」で通常のメモです。メモの種類を選択したら、org-capture-templatesで設定されたテンプレートが展開され、メモ入力しやすい状態になります。

 メモ入力が完了したらC-c C-cで終了します。他の作業中でも滞ることなくメモが取れるように、メモ入力が完了したら元のウィンドウ構成に戻る親切設計です。C-c C-kでそのメモを破棄します。

TODOの状態を変更する

 TODO・予定用のメモにはアスタリスクの後にTODOと書かれていますが、それには意味があります。それはTODOキーワードといって、後で紹介するorg-agendaによって、「やることリスト」として表示できるのです。TODOキーワードはデフォルトではTODOとDONEの2種類です。

 TODOリストでそのタスク(TODOキーワード付きのメモ)が完了したらC-c C-tでTODOからDONEに変更します。繰り返し実行すると、TODO→DONE→キーワードなしの順で切り替わります。これはorg-agendaでも使えます。

予定・〆切を設定する

 org-modeでは、メモに日時を書き込めます。それによってorg-agendaで予定表としてまとめて表示できます。日時にはいくつかの種類があります。inactive日時以外はorg-agendaで表示されます。

Table2: 日時の種類

種類 入力方法 説明
active日時 C-c . org-agendaで表示される日時
inactive日時 C-c ! org-agendaで表示されない日時
行動予定日時 C-c C-s そのタスクを行う予定の日時
〆切日時 C-c C-d 〆切の日時

 日時の入力方法はフリーフォーマットで賢く判断してくれます。整数のみ入力した場合は今月または来月の日付になり、時刻のみ入力した場合は今日の時刻になります。Shift+矢印キーでカレンダーで日付を選択できます。

 C-c C-sで日時を入力するとSCHEDULEDと出ますが、これはそのタスクのために実際に自分が行動する日時を指定します。例えば10:00から始まる会議に行く時間が9:30だとしたら、C-c C-sで行動予定日時9:30を入力します。

 このようにいろいろな種類のTODOを入力してみました。

==

* [2016-09-23 金 14:37]a
  SCHEDULED: <2016-09-23 金>
* TODO [2016-09-23 金 14:37]a
* TODO [2016-09-23 金 09:11]
* <2016-10-01 土>a
* <2016-09-23 金 09:10>
* TODO [2016-09-23 金 09:10]
* TODO a
* <2016-10-10 月>hoge
* <2016-09-23 金 09:06>a
* TODO [2016-09-23 金 09:06]
todo

==

予定を一覧する

 TODOや予定をorgファイルに書き加えるだけでは一覧性がなく、見逃してしまいます。そこで、M-x org-agenda (C-c a推奨)を使うと「TODOリスト」や「予定表」という形にしてくれます。しかも複数のファイルに分散して書かれていても、ひとまとめにしてくれるという優れ物です。筆者は出先で多くのタスクをこなす必要があるときにはM-x lpr-bufferで印刷した紙を持ち歩いています。

 起動すると、メニューが現れてくるので、いろいろなことができることがわかります。ここでは週間予定表とTODOリストを表示させるのでaを押します。すると、*Org Agenda*には次のように表示されます。org-agenda上でもorg-modeでの多くのコマンドが使えます。

 org-agendaはとても深く、カスタマイズ項目もとても多いので紙面で紹介しきれないのが残念です。筆者も現役の設定になるまでには長年の試行錯誤がありました。

20141206052942.png
Fig4: C-c a aでagendaを起動!

他フォーマットに変換

 org-modeで書かれた文書は、org-export機能によりHTMLやLaTeXなど様々な形式に変換できます。orgフォーマットは読み書きしやすいので、定められたフォーマットの文書作成が簡単にできるようになります。

 使い方は、まずC-c C-eでorg-exportのメニューを開きます。そして、最初の1文字で変換形式、次の1文字でどのように変換結果を出力するかを指定します。

 HTMLへの変換する場合、最初の1文字は「h」です。次の1文字は表のように指定します。特にC-c C-e h oで変換結果をブラウザで確認できるのは便利です。見出しやリストや表が綺麗に整形されているのは一見の価値があります。

Table3: 変換後のHTML出力方法

H 変換結果を隣のウィンドウで表示
h 拡張子を.htmlにしたファイルに書き出して終了
o .htmlに書き出した後ブラウザで開く

 他にも多数の形式に変換できるし、拡張パッケージを導入すればさらにいろいろなことができます。筆者はorg2blogパッケージを使ってrubikitch.comを書いています。org-modeの機能性のおかげで毎日円滑にサイト更新ができています。

 ここまででorg-modeを駆け足で紹介しましたが、全機能からすれば本当に氷山の一角にしか過ぎません。それでも多目的に活躍できるモードであることは御理解いただけたでしょう。本稿がきっかけでorg-modeが使いこなせるようになれば幸いです。

 筆者は毎日Emacsの最新情報を http://rubikitch.com/ に書いています。メルマガに登録していただけると、無制限で個別サポートいたします。

本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。