GitHub

org-modeとは?.orgファイルの書き方とTODO管理・エクスポートの使い方

org-modeとは?.orgファイルの書き方とTODO管理・エクスポートの使い方

org-modeはEmacsに同梱される文書作成・タスク管理モードで、拡張子 .org のプレーンテキスト1枚に見出し・TODO・表・実行可能なコードをまとめて書けます。ただし既定値のまま使うと、Emacs Lisp以外のコードは実行できず、Markdown書き出しのメニューも出ません。この記事では Emacs 30.2 同梱の Org 9.7.11 と GNU ELPA 最新の Org 9.8.8(2026年7月25日公開)のソースを実際に開いて確認した既定値とキー操作を、記法の例とあわせて整理します。

まとめ:org-modeで最初に押さえる5点

  • 見出しは行頭のアスタリスクの数が階層。TABで折り畳み、S-TABで文書全体を一括操作する。
  • TODOは既定でTODOとDONEの2状態だけ(org-todo-keywords)。C-c C-t で切り替え、増やすときは #+TODO: 行を書く。
  • コードブロックの実行は既定でEmacs Lispのみ有効(org-babel-load-languages の既定値が ((emacs-lisp . t)))。PythonやShellは自分で有効化する。
  • エクスポートは C-c C-e。既定のバックエンドは ascii・html・icalendar・latex・odt で、Markdownは入っていない。
  • orgstruct-mode は Org 9.2 で削除済み。<s の展開も既定では無効で、現行は C-c C-, を使う。

以下、各項目を .org ファイルの実例と、9.8.8のソースで確認した既定値つきで見ていきます。

.orgファイルの中身と使用中のOrgバージョン確認

.org は独自バイナリではなく、ただのUTF-8テキストです。見出しもTODOも表も、行頭の記号だけで表現されているため、Emacsが無い環境でも中身を読めます。Emacsにはorg-modeが同梱されているので、拡張子を .org にして開けばそのまま org-mode が有効になります。

#+TITLE: 開発メモ
#+STARTUP: overview

* プロジェクトA
** TODO 設計レビューの日程調整          :work:
   SCHEDULED: <2026-08-20 Thu>
   :PROPERTIES:
   :Owner: 佐藤
   :END:
** DONE 見積もり提出

Emacs同梱版とELPA版で機能が食い違う点

使用中の版は M-x org-version で分かります。Emacs 30.2(2025年8月14日公開)に同梱されているのは Org 9.7.11、GNU ELPA で配布されている最新版は 9.8.8(2026年7月25日公開)。この差には実害があります。たとえば画像やリンクのプレビューは 9.8 で org-toggle-inline-images から org-link-preview(C-c C-x C-v)へ置き換わったため、9.8向けの解説をEmacs同梱のままの環境で試してもコマンドが見つかりません。新しい機能を追うなら M-x package-install RET org でELPA版を入れる、追わないなら同梱版の 9.7 系を前提に読む、と決めてしまうほうが混乱しません(2026年8月時点。Emacs 31 はプレテスト段階で、正式リリースは 30.2 が最新です)。

アウトラインの階層とTABでの折り畳み

org-modeの土台はアウトラインプロセッサです。見出しは行頭のアスタリスクとスペースで作り、アスタリスクの数がそのまま階層の深さになります。見出しの上で TAB(org-cycle)を押すと、その見出しだけが「折り畳み→子見出しのみ表示→全展開」と循環。文書全体を同じ順序で切り替えるのが S-TAB(org-shifttab)です。

ここで戸惑いやすいのが初期表示です。org-startup-folded の既定値は showeverything なので、ファイルを開いた直後は全展開になります。長い文書を目次のような状態で開きたいなら、ファイル先頭に #+STARTUP: overview を1行(content、show2levels なども指定可)。設定変数を触らずファイル単位で制御できるため、共有リポジトリの文書ではこちらが扱いやすい方法です。

箇条書きとチェックボックスによる小タスクの管理

見出しにするまでもない項目は、ハイフンで始める箇条書きにします。項目の行末で M-RET(org-meta-return)を押せば同じ深さの項目が追加され、番号付きリストなら番号が振り直されます。項目に [ ] を書くとチェックボックスになり、その上で C-c C-c を押すと [X] と交互に切り替わります(org-toggle-checkbox)。

** TODO リリース準備 [1/3]
   - [X] 変更履歴の更新
   - [ ] タグの付与
   - [ ] リリースノートの下書き

見出しに書いた [1/3] は進捗クッキーで、子項目のチェック状態に応じて自動更新されます。割合で見たいときは [%] を書きます。TODOキーワードを付けるほどでもない細かい作業を、1つの見出しの下にまとめて潰していく用途に向いています。

リンクの挿入と文書間のジャンプ

リンクは [[リンク先][表示テキスト]] の形式で、URLだけでなくファイルパス、他の見出し、行番号も指定できます。手で書かずに C-c C-l(org-insert-link)で補完付き入力ができ、リンク上で C-c C-o(org-open-at-point)を押すと、URLならブラウザ、ファイルならEmacsのバッファで開きます。

- [[https://orgmode.org/org.html][Org Manual]]
- [[file:~/org/spec.org::*API設計][API設計の節]]
- [[*リリース準備][同じファイル内の見出しへ]]

後述する初期設定で C-c l に割り当てる org-store-link は、いま開いているバッファの位置を控えておくコマンドです。参照元のファイルで C-c l、メモ側で C-c C-l と押せば、リンクが貼られます。複数の .org ファイルを相互参照させ始めると、この2つが最も使うキーになります。

TODOキーワード・タグ・プロパティによるタスク管理

状態を増やすTODOキーワードの定義

見出しの上で C-c C-t(org-todo)を押すと状態が切り替わります。org-todo-keywords の既定値は ((sequence "TODO" "DONE")) なので、素の状態では2値しかありません。「着手待ち」「レビュー中」を分けたいときは、ファイル先頭に次の行を書きます。

#+TODO: TODO(t) WAIT(w@/!) | DONE(d!) CANCELED(c@)

縦棒の左が未完了、右が完了扱いの状態です。括弧内の1文字目は素早く選ぶためのキー。続く ! はタイムスタンプ、@ はメモ(タイムスタンプ付き)の記録指定で、スラッシュの前がその状態に入るとき、後が出るときを表します。w@/! なら、WAIT に入るときメモを求め、WAIT から抜けるときタイムスタンプを残す指定になります。書き換えた #+TODO: 行の上にカーソルを置いて C-c C-c を押すと設定が読み直されます。C-c C-c はカーソル位置で働きが変わるコマンドで、設定行では再読み込み、チェックボックス上では切り替え、表の中では再計算として動きます。

タグとプロパティによる分類

タグは見出しの行末に :work:urgent: のようにコロンで挟んで並べます。手入力せずに C-c C-q(org-set-tags-command)を使えば補完が効き、既存タグの一覧から選べます。担当者や見積工数のように「キーと値」で持たせたい情報は、タグではなく C-c C-x p(org-set-property)でプロパティにします。プロパティは見出し直下の :PROPERTIES: ドロワーに格納され、後述するアジェンダの絞り込み条件にも使えます。

予定日とアジェンダ表示の前提設定

予定日は C-c C-s(org-schedule)、締切は C-c C-d(org-deadline)で入れます。これらを横断表示するのがアジェンダですが、初期状態のままでは開けません。org-agenda-files の既定値が nil(対象ファイルなし)で、さらに C-c a は Org が設定するキーではないためです。公式マニュアルは初期設定ファイルに次の3行を書くことを勧めています。

(global-set-key (kbd "C-c l") #'org-store-link)
(global-set-key (kbd "C-c a") #'org-agenda)
(global-set-key (kbd "C-c c") #'org-capture)

これに加えて、アジェンダの対象ディレクトリを自分で指定します。

(setq org-agenda-files '("~/org/"))

この指定を入れて初めて、C-c a のアジェンダに予定が並びます。「org-modeのアジェンダに何も出ない」という詰まり方は、機能の問題ではなく、対象ファイル未設定とキー未割り当てという2つの初期状態が原因であることがほとんどです。なお3行目の C-c c(org-capture)は、作業を中断せずにメモやTODOを決まったファイルへ放り込むためのコマンドで、書き込み先を指定しない場合は org-default-notes-file の既定値 ~/.notes が使われます。

表の自動整形・計算とCSVの読み書き

表はパイプ区切りで1行書き、TAB を押すだけで罫線が自動整形されます。既存のテキスト範囲を選んで C-c |(org-table-create-or-convert-from-region)を押せば、区切り文字を判定して表に変換。計算は表の下に #+TBLFM: 行を1本置き、C-c * で再計算です。

| 項目       | 単価 | 数量 | 金額 |
|------------+------+------+------|
| ライセンス | 1200 |    5 | 6000 |
| 保守       | 3000 |    1 | 3000 |
#+TBLFM: $4=$2*$3

列は $1 から始まる番号で参照し、@2$3 のように行と列を組み合わせた指定も可能です。外部データとやり取りするときは M-x org-table-import でCSVやTSVを表として取り込み、M-x org-table-export で書き出します。表計算ソフトを開かずに集計まで済ませたい軽い用途なら、この2つで往復できます。

org-babelでのコードブロック実行と結果の埋め込み

コードブロックは #+begin_src と #+end_src で囲み、ブロック内で C-c C-c を押すと実行され、結果が #+RESULTS: として文書に書き戻されます。ブロック内で C-c '(org-edit-special)を押せば、その言語の専用バッファが開いて補完やインデントが効きます。

#+begin_src python :results output
  print("hello from org-babel")
#+end_src

#+RESULTS:
: hello from org-babel

ただし上の例は、そのままでは動きません。org-babel-load-languages の既定値が ((emacs-lisp . t)) で、Emacs Lisp以外は無効だからです。使う言語を初期設定ファイルで明示的に有効化します。

(org-babel-do-load-languages
 'org-babel-load-languages
 '((emacs-lisp . t)
   (python . t)
   (shell . t)))

もう1つの既定値 org-confirm-babel-evaluate は t で、実行のたびに確認を求めます。煩わしいからと nil にする設定例が広く出回っていますが、これは推奨できません。.orgファイルは他人から受け取ることもあり、開いてエクスポートしただけで中のシェルコマンドが走る状態を作ることになるからです。無効化するなら、自分が書いたファイルだけを対象に判定する関数を org-confirm-babel-evaluate に渡す形にとどめるべきでしょう。対応言語は増えており、Org 9.8 では .NET SDK を使うC#用の ob-csharp が本体に入りました(.NET SDK を使わない旧実装は org-contrib 側に残っています)。

HTML・LaTeX・Markdownへのエクスポート

書き出しは C-c C-e(org-export-dispatch)でメニューを開き、バックエンドと出力先を1文字ずつ選びます。HTMLファイルなら h のあと h、LaTeX経由のPDFなら l のあと p です。

ここで見落としやすいのが、Markdownがメニューに出ないことです。org-export-backends の既定値は (ascii html icalendar latex odt) で、Markdown用の ox-md は含まれていません。GitHubのREADMEを .org から生成したい場合などは、初期設定ファイルに (require 'ox-md) を書くのが確実です。org-export-backends に md を足す方法もありますが、この変数は org.el の読み込み前に設定するか customize 経由で変更する必要があり、読み込み後に素の setq を実行しても反映されません。LaTeX経由のPDF出力については、Org側の設定に加えてTeX処理系のインストールが別途必要です(LaTeXとは?読み方・TeXとの違い・使い方を初心者向けにわかりやすく解説で導入手順を扱っています)。

主要キーバインド一覧(Org 9.8.8)

ここまでに出たキーを、9.8.8の org-keys.el の定義どおりに並べます。上3つ以外はすべて org-mode のバッファ内でのみ有効です。

キー コマンド 働き
C-c l org-store-link リンク位置の記憶(要設定)
C-c a org-agenda アジェンダ(要設定)
C-c c org-capture メモの投入(要設定)
TAB org-cycle 見出しの折り畳み
S-TAB org-shifttab 文書全体の折り畳み
M-RET org-meta-return 見出し・項目の追加
C-c C-t org-todo TODO状態の切替
C-c C-q org-set-tags-command タグ入力
C-c C-x p org-set-property プロパティ設定
C-c C-s org-schedule 予定日の設定
C-c C-d org-deadline 締切の設定
C-c C-w org-refile 見出しの移動
C-c C-l org-insert-link リンク挿入
C-c C-o org-open-at-point リンクを開く
C-c | org-table-create-or-convert-from-region 表への変換
C-c * org-ctrl-c-star 表の再計算
C-c ‘ org-edit-special コードの別バッファ編集
C-c C-, org-insert-structure-template ブロックの雛形挿入
C-c C-e org-export-dispatch エクスポート
C-c C-x C-v org-link-preview 画像等のプレビュー(9.8)

古い解説を見分ける:Org 9.2以降で消えた記法

org-modeの日本語解説には2018年以前の情報が大量に残っており、そのまま初期設定ファイルに写しても動きません。実際に9.8.8のソースを展開して確認したところ、次の記述は現在の実装と食い違っています。

古い解説の記述 現行(Org 9.8.8) 変わった版
orgstruct-mode 削除済み(代替: orgalist.el) 9.2
orgstruct++-mode 削除済み(代替: outshine) 9.2
ラジオリスト 削除済み(ラジオ表は残存) 9.2
<s のあとTAB 既定で無効(C-c C-, を使う) 9.2
org-toggle-inline-images org-link-preview へ置換 9.8

特に orgstruct-mode は、旧版の解説記事が章を割いて紹介している割に、Org のリリースノートの 9.2 節に「OrgStruct minor mode と radio lists の仕組みをコードベースから削除した」と明記されている機能です。9.8.8 の Lisp ファイル群を検索しても、定義は1件も残っていません。代替として公式が挙げているのは GNU ELPA の orgalist.el と MELPA の outshine です。一方 <s のほうは完全な削除ではなく、(require 'org-tempo) を初期設定ファイルに書けば従来どおり展開できます。手元の設定が動かないときは、まず記事の公開年とOrg 9.2(2018年)の前後を確認するのが早道です。

よくある質問

.orgファイルとは何ですか?

org-modeで扱うプレーンテキストファイルです。見出しはアスタリスク、タグはコロン、表はパイプというように、すべて行頭の記号で構造を表すため、テキストエディタやGitの差分でもそのまま読めます。専用アプリが無くても内容を失わない点が、独自形式のノートアプリとの最大の違いです。

org-modeを使うのに追加インストールは必要ですか?

不要です。Emacs本体に同梱されており、Emacs 30.2ではOrg 9.7.11が入っています。より新しい機能を使いたい場合のみ M-x package-install RET org でGNU ELPA版(最新は2026年7月25日公開の9.8.8)に更新します。

TODOキーワードは自分で増やせますか?

増やせます。ファイル先頭に #+TODO: TODO(t) WAIT(w) | DONE(d) のように書き、その行の上で C-c C-c を押して読み直させてください。すべてのファイルに適用したい場合は初期設定ファイルで org-todo-keywords を設定します。縦棒の右側が完了状態として扱われます。

コードブロックを実行しても結果が出ないのはなぜですか?

org-babel-load-languages の既定値がEmacs Lispのみを有効にしているためです。org-babel-do-load-languages で使用する言語を有効化してください。実行前に確認を求められるのは org-confirm-babel-evaluate の既定値が t だからで、これは受け取った.orgファイルが勝手にコマンドを実行しないための安全弁です。

org-modeとObsidianのようなノートアプリはどちらを選ぶべきですか?

Emacsを日常のエディタとして使っていないなら、org-modeを選ぶ理由は薄いです。キー操作と初期設定ファイルの記述を覚えるコストが、ノート機能そのものより大きくなります。逆にEmacs上でコードを書き、そのままコードブロックを実行して結果を文書に残したいなら、GUIのノートアプリでは代替が効きません。判断軸は「同期やスマホ対応が要るか」ではなく「編集環境をEmacsに寄せるか」です。

関連記事

お気に入りに入れた記事の一覧

資料請求

RELATED POSTS 関連記事

目次