packages for diary in emacs
Table of Contents
Last modified: 20250806T2107+0900
emacsの日誌パッケージの比較検討。 (この文書の内容は、その時々に使っているパッケージの変化に伴って、さまざまに変化しています。)
1. org-journal
org-journal は、org-modeをベースにした日誌作成・閲覧用の独立パッケージ。
いつでもどこでも、 C-c j
で日誌を起動してメモを取ることができる。
1.1. org-journal-mode
org-journalを起動して日誌を書いている状態で、以下のキーが有効。
C-c C-f |
次の日誌へ |
C-c C-b |
前の日誌へ |
C-c C-j |
現在のファイルに新しいエントリーを挿入 |
C-c C-s |
検索 |
1.2. calendar-mode
org-journalは、 M-x calendar
で起動するemacsのcalendarと連携している。calendarを起動してそのバッファに移動した状態で、以下のキーが有効。
j m |
カレンダーの中でカーソル位置の日誌をマークする |
j r |
カーソルがある日付の日誌を新しいバッファで開き、そこにカーソルを移動する |
j d |
上と同じだがカーソルは移動しない |
j n |
カーソルがある日付のファイル(なければ作成)に新しいエントリーを追加 |
j s w |
今週を検索 |
j s m |
今月を検索 |
j s y |
今年を検索 |
j s f |
すべての日誌を検索 |
j s F |
未来の日誌を検索 |
[ |
前の日誌へ |
] |
後の日誌へ |
1.3. 運用
1.3.1. 2024年1月
デフォルトでは、
(setq org-journal-time-format "%R") (setq org-journal-time-prefix "** ")
となっていて、
** 13:20 秘密会議
会議の内容
のように、新しいエントリーが、第2レベルのヘッダーとして、時刻と共に作成される。しかし、業務日誌や研究日誌は、その日の終わりや、一段落したときに、振り返ってまとめて付けるものだから、この時刻は不要。また、必ずしもヘッダーは必要ないので、この二つの変数は両方とも空にする。
(setq org-journal-time-format "") (setq org-journal-time-prefix "")
その上で、日誌ファイルを、日常生活の記録、業務記録、研究記録の三つの部分に分け、それぞれについて記録する。やり方は、まず、次のような内容のテキストファイルを用意して、 org-journal-dir
に置く。
** life ** work ** research
そして、このファイルを読み込む関数を次のように作成して、
(defun org-journal-date-format-func () "Custom function to journal date header" (insert-file-contents "./template_for_daily") )
ヘッダーが作られたときにこの関数が実行されるようにフックを設定する。
(add-hook 'org-journal-after-header-create-hook 'org-journal-date-format-func)
こうすると、毎日、最初にエントリーを作成したときに、 template_for_daily
が読み込まれた状態で、新しいファイルが作成される。(ただし、 org-journal-file-type
は 'daily
。)
そうすると毎日のファイルは以下のような形式で蓄積されていく。
* 202401 ** life - オムレツを焼く - 出勤。サミットで白身魚フライ海苔弁当を買う。 - Xに電話 ** work - 会議 - 書類提出 - 面談 ** research - あの本のどこそこ - あの論文を第2章まで
時間があれば、 M-x calendar
( [F2]にバインドしている)でカレンダーを起動して、 [
と ]
で日付を行ったり来たりしながら過去の日誌を見直す。calendar-modeを参照
1.4. 2024年6月下旬
業務日誌はcalendar / diaryにしたので、通常の日誌はデフォルトに戻す。ただし、新しいエントリーに時刻が付くのは煩わしいので、 C-c j
で日誌ファイルを開くごとに時刻を挿入し、その後は通常の -
によるリストにする。これは、転記先でhtmlに変換するため。
(setq org-journal-time-format "%R") (setq org-journal-time-prefix "** ") (defun org-journal-entry-format-func () "Custom function to journal entry" (insert "\n- ") ) (add-hook 'org-journal-after-entry-create-hook 'org-journal-entry-format-func)
毎日のファイルの見た目は以下のようになる。
* 20240621 ** 10:04 - 出汁巻き玉子。 - 雨が降っていて、ときおり土砂降りになる。 - 某講演会の報告書を提出。 ** 21:09 - ジムは中止。雨がしっかり降っているし、体調的にも、無理して行くことはないと感じる。 - standard-theme.elを試してみる。 - 夕食は豚肩ロースのタマネギとキノコ炒め。
2. calendarのdiary
emacsに標準装備されている。シンプルで柔軟な書式、読み直すための表示機能(fancy-display)が備わっている。検索機能は付いていないが、そもそも一つのdiaryファイルに書き込んでいるので、それを検索すればよい。
他のパッケージと異なり、org-modeをベースにしているわけではないが、しかし、以下のようにして、日誌ファイルをorgファイルにすれば、org-mode (org-roam, denote, etc) の機能を利用できる。
2.1. diary-file
標準では、 /.emacs.d/diary
に記録されるが、変数 diary-file
にファイルを指定すると、そこに記録される。たとえば、
(setq diary-file "~/Dropbox/calendar/my_diary.txt")
などと指定することができる。この機能を使って、例えば以下のように、denote形式のファイルをdiary-fileに指定すると、denoteの機能が使えるようになる。
(setq diary-file "~/Dropbox/org/20250717T145138--diary-file-for-calendar__2025.org")
2.2. 入力
入力コマンドは、 M-x calendar
でカレンダーを表示した状態で、以下のキーを叩く。通常の日誌は、 i d
。後述するように、 org-agenda-diary-file
の値を diary-file
に設定すれば、org-agenda viewから i
でその日の記録を書けるようになる。
i d | diary-insert-entry | その日の日誌を入力 |
i w | diary-insert-weekly-entry | 毎週繰り返す予定を入力 |
i m | diary-insert-monthly-entry | 毎月繰り返す予定を入力 |
i y | diary-insert-yearly-entry | 毎年繰り返す予定(記念日など)の入力 |
また、calendarバッファで s
を叩けば、 diary-file
本体が開く。 i d
を使う場合には、後述の org-agendaとの関係に注意する必要がある。
cf. 32.10.4 Commands to Add to the Diary
calendar / diaryでは、とくに、定期的な予定の入力が簡単。
5/11 太郎の誕生日 Thursday 16:00 木曜会
などと書ける。これをorg-modeで書くと、
* 太郎の誕生日 <2000-05-11 +1y> * 木曜会 <2024-05-02 Thursday 16:00 +1w>
などとなり、やや煩瑣である。
2.3. 表示
calendar /diary 以外の日誌パッケージは、基本的に、記録時に、日付フォーマットやその他の文字列をカスタマイズできるなど、書き込みを重視して、表示の方は、日誌ファイルの内容をそのまま表示するが、calendar / diary は発想が逆で、書き込みはごくシンプルなフォーマットにして、表示するために fancy diary displayという独立したプログラムを使う。表示コマンドが入力されると、このプログラムは diary-file
全体を走査して、目的の日の記録を見つけだし、時刻順に並べて表示する。
カレンダーを表示した状態で、 d
で一日分が表示される。引数で表示する日数を指定できる。たとえば C-u 3 d
で三日分が表示される。
このとき、右手のカーソルキーでカレンダー上の日付を動かし、左手の d
で表示させるという操作が快適。
2.4. org-agendaとの併用
このようなcalendarのdiaryは、 org-agenda-include-diary
を t
にすることで、org-agenda viewに表示される。行頭に時刻があれば、タイムライン上に表示される。
(setq org-agenda-include-diary t)
2.4.1. tips
calendar/diaryの書式では、日付の行の下に、一つ以上のスペースを空けて入力された内容は、すべてその日付の一つのエントリーだと見なされ、org-agenda viewにも、そのすべての内容が表示される。これが少し邪魔と感じる場合には、日付の下に、行頭にスペースを空けないで左詰めで書けば、それは、その日付の内容とは見なされないので、org-agenda viewにも表示されない。ただし、 calendar
から d
で表示されるfancy displayにも表示されなくなる。
2.4.2. org-agenda-diary-file
org-agendaと併用する場合は、 org-agenda-diary-file
の値に注意すること。これに、以下のように具体的なorgファイル名を指定すると、calendarやorg-agenda viewで i
を叩いたときに org-agenda-diary-entry
が起動し、そのorgファイルに書き込まれる。
(setq org-agenda-diary-file "~/Dropbox/org/agenda.org")
他方、以下のように、その値を diary-file
に指定すると、calendarとorg-agenda viewで diary-insert-entry
が起動して diary-file
に書き込まれる。
(setq org-agenda-diary-file 'diary-file)
3. org-capture
org-captureは柔軟なので、日誌用のテンプレートを作ることもできる。
(setq org-capture-templates '( ("j" "Journal" entry (file+datetree "~/Dropbox/org/journal.org") "* %?" :empty-lines 1) ) )
たとえば、このように設定すると、ターゲットのファイルの中に、以下のようなツリー状の構造でテキストが蓄積される。
* 2024 ** 2024-05 May *** 2024-05-11 Saturday **** 1st entry of diary bra bra bra **** 2nd entry of diary bro bro bro
4. org-roam
emacsのノート整理分野で一世を風靡した(現在もおそらくトップ)org-roamだが、日誌を書くためのコマンドも用意されている。新しいエントリーは、org-captureを使って入力し、終了コマンドで、本体の日誌ファイルに追記される。この点、日誌ファイルそれ自体を編集するorg-journalやdenoteとは操作性が異なる。
作業のログを取ると言うよりは、その時々の随想のようなものを、特にタイトルやテーマを決めずに書きためていくのに向いている。
読み直すためには、denoteと同じように、特別なコマンドで前日とか次の日とかに移動しながら読むことになるが、ここはorg-journalのように、calendarと連携させて欲しいところ。
5. denote
denoteでは、denote-journalを使って日誌が書ける。というよりも、 _journal
というキーワードを各ファイルに付加するだけで、denoteのシンプルなファイル管理システムの中に日誌も取り込んでしまう。calendarやorg-journalにはない独自の発想で、これはこれでアリなのかもしれない。
日常の些細なことを記録して、あとで見直して楽しむ、という使い方ではなく、日誌といえどもしっかりした内容のある独立したノートだ、という発想。
calendarとの連動はあるが、カーソルの日の内容を表示したり、新たな内容を書き込んだりする最低限の機能になっている。
6. 比較のまとめ
日誌には二つのタイプがある。日々のタイムラインを簡潔に書き留めるタイプと、しっかりした内容のまとまった文章を書くタイプである。
前者に向いているのは、calendar / diary 。 i d
で書き込んで、 d
で表示するという一連の動作が非常に軽快で心地よい。
後者に向いているのは、denote-journal や org-roam-dailies。こちらは、日誌パッケージというよりも、大規模なノート管理システムの中に、日誌も取り込むという発想。充実した検索機能、タグやキーワードでの整理ができる。
こうなると老舗のorg-journalのポジションが難しい。機能が充実しているのと引き換えに、やや柔軟性に欠けるところがある。denoteやorg-roamとの連携もできないことはないが今ひとつ。ちなみに sed
などのツールを使えば、 calendar / diary への移行は難しくない。
タイムライン重視の軽快なメモ | calendar / diary |
本格日誌システム | org-journal |
日誌といえどもorgノート | org-capture, denote-journal, org-roam-dailies |
7. 変遷の記録
7.1. 2024年5月初旬
- 予定の管理は一元化することが鉄則であり、分散させると忘れるリスクが高まる。その意味で、予定は日誌とは別に管理することが望ましい。org-journalは、予定管理としても使えるが、これは極力避ける方針にする。
- 予定は、これまで通り
agendaYY.org
というファイルにまとめる。YYの部分は、西暦下二桁。入力は、org-captureまたはcalendarから行う。 - 日誌は、上記三つの選択肢があるので、それぞれ使い分けたい。ちょうど、現在、「生活上の記録」「業務上の記録」「研究日誌」という三つの分類で日誌をつけているので、この三つに対応させられないか。
- 研究日誌。基本的に研究日誌はメタノートであって、ノートの実体は別のところにある。いつ何を読んだか、何を書いたか、などを記録するものなので、簡易的なメモで十分。
- 生活上の記録。こちらは定番なので変更なし。
- calendar/diaryで作成する研究日誌がメタノートならば、denoteやorg-roamは、ノート本体を書くためにある。denote-journal を使って、あえてdenoteで日誌を付ける意味や場面は、まだ思い浮かばない。
7.2. 2024年5月下旬 この使い分けを1ヶ月使ってみた
- calendar / diary は研究日誌として確かに優れている。
C-c a a
でorg-agenda view
を開いたときに、i
ですぐにメモできる。そして、その内容が、org-agenda view
の一番下に表示されるので、確認しやすく、記憶にも残りやすい。 diary-file
は、通常のdenoteファイルを一つ作り、それにmetanote
index
research
journal
diary
といったキーワードを付けて、そのファイル名を変数diary-file
に格納する。デフォルトは/.emacs.d/diary
だが、このように分離させると、denoteなどで扱いにくい。研究日誌をdenoteのファイルにしておけば、本体となるメモやノートとのハイパーリンクなどが自由に使える。
(setq diary-file "~/Dropbox/org/20240524T103226--research-journal__diary_index_journal_metanote_research.org")
7.3. 2024年8月 org-roam-dailiesに揺れる
- org-roam-dailiesが意外といい感じではないかと思っている。テーマや主題を決めずに、随想のようなものを書き溜めるのに向いている。denote-journalも同じ。
7.4. 2025年1月 denote-journalが最適解だという気がしている
- このところ、denote-journal を使っていて、今後は、org-journalからこちらに移行しようと思っている。
- 使ってみてわかったのだが、むしろ日誌だけを別のシステムにする方が効率が悪い。いろいろとパッケージを使ってみたいというのなら別の話だが、日誌を含めて書いたものをすべて一つのシステムで管理するのは快適。
- とくに、日誌の中に、その日に作成したり編集したりしたノートへのリンクを置いておくのは自然なこと。これがストレスなくできるのはすばらしい。
- これで、calendarと連動して閲覧できれば文句ないんだが。現状だと、dired-previewを使用してdiredから読むことになるが、org-journalの
C-c C-b
やC-c C-f
のように、日誌ファイルから直接前の日や次の日に移動できないのがもどかしいことがある。(バージョンアップでcalendarとの連動機能が実装されたが、あまり快適ではない。)
7.5. 2025年7月 一周回ってcalendarのdiaryが最強
- denote-journalをしばらく使ったが、上に書いた「もどかしさ」がやはり致命的で、結局、日誌を読み直す機会が減った。
dired
の機能を使えば、あるいは、dired-preview-mode
を使えばもっと簡単に読み直せるが、その少しの手間がこの種のシステムには痛い。 - 閲覧性について、最も優れているのはcalendarのdiary機能だろう(cf. 33.10 The Diary)。calendarを表示させた状態で、矢印キーやカーソル移動コマンドで柔軟に日付を選び、
d
で表示させる。このとき、Fancy Dary Displayを使うのがポイント。 - 重要なのは、
diary-file
にdenote形式のファイルを指定すること。これによって、通常のdenoteファイルと同じようにリンクやバックリンクが使え、org-journalのような孤立が避けられる。 - 過去5年分くらいの日誌ファイルをdiary fileに変換して、1.5Mくらいになったが、動作は軽快。悩んでいる人は、一度、騙されたと思ってcalendarのdiary機能を試してみることをお勧めする。
- org-agendaと連携させると、agenda viewから
i
でdiaryファイルが開き、また、記録した内容が agenda viewのタイムライン上に表示される。予定を確かめるときに日誌が目に入るのは好みが分かれるかもしれないが、自分としては嫌いじゃない。