【emacs】org-journal でライフログっぽいやつ

emacs の org-mode の仲間たちのなかに、org-journal というのがある。
 日記を書くためのモードらしい。一日に一枚、その日のファイルを生成して、エントリを作成すると時刻のスタンプとともに記録する場を設けてくれる。
 ライフログ的な使い方を想定したもののようである。
 ログをとるようなライフは送ってないが、使いはじめるとなかなか楽しい。

org-journal は elpa でインストールできる。

elpa
M-x package-list-packages

emacs や org-mode については、ググればたくさん出てくる。
 筆者もつたないながら記事を書いた。

🔗 Mac で emacs を使ってみる 2020年度版

🔗 【Macで文芸創作】Emacs の org-mode で文章を作成する

さっそく使ってみる

org-journal の github のページ で紹介されている設定を使って、さっそく試してみる。

🔗 PersonalDiary EmacsWiki

上記の URL に、ふたつの設定が紹介されている。下の設定は暗号化されたファイルを作成するものなので、今回は上の設定を使わせていただく。

上のほうのコードをまるっとコピペして、 ~/.emacs.d のなかに入れるのだが、冒頭のほうにあるディレクトリの設定は自分の好きな場所に変更したほうが良さそうだ。

(defcustom journal-dir "~/お好みの/パス/journal/" "Directory containing journal entries"

また、その下にある日付の設定も、Mac ではデフォルトだと変な感じになるので書き換えておく。

(defcustom journal-date-format "%Y-%m-%d"

さらに文章の折り返しが気になる場合は、 (turn-on-visual-line-mode) という行を探して、これをコメントアウトで無効にする。

;; (turn-on-visual-line-mode)

編集したものを journal.el かなんか名付けて、~/.emacs.d のなかに保存する。
 さらに ~/.emacs に、

(load "~/.emacs.d/journal.el")

と書きこんでロードする。
 emacs を再起動して C-c j でエントリを作成してみると、こんなふうになる。

org-journal text

その日の日付のテキストファイルが作成され、自動で大見出しに日時、小見出しに時刻を入力してくれる。なかなかいい感じだ。
 あとはここに、いま気になってることとか、情報とか、進めている作業とか、つまずいている部分とか、その解決方法とか、いろんなことを書くわけだ。
 C-x C-s で保存して、ふたたび C-c j でエントリを作ると、同じファイルの最下段に時刻がスタンプされて、カーソルもそこに移動している。なので、その日あったこととか、会ったひととか、愚痴とか映画の感想とかをメモして、ログを重ねていくのである。

設定ファイルを作る

上記した設定はかなりいいものだと思う。
 しかし編集モードが text-mode なのである。どうせなら、org-mode っぽいやつで編集したい。
 なので、org-journal の github のページ を参考に自分なりに設定ファイルを作ってみた。

(setq org-journal-dir "~/Library/Mobile Documents/com~apple~CloudDocs/org/journal/")
(setq org-journal-date-format "%Y-%m-%d, %A")
(setq org-journal-time-format "%R\n\n")
(setq org-journal-file-format "%Y%m%d.org")

(setq org-journal-find-file 'find-file)
(setq org-extend-today-until '3)
(global-set-key "\C-cj" 'org-journal-new-entry)
(add-hook 'visual-line-mode-hook
      '(lambda()
     (setq word-wrap nil)))

(defun org-journal-file-header-func ()
"Custom function to create journal header."
(concat
(pcase org-journal-file-type
      (`daily "#+STARTUP: content indent inlineimages"))))

(setq org-journal-file-header 'org-journal-file-header-func)
(require 'org-journal)

これを適用すると、こんな感じになる。

org-journal org

(setq org-journal-dir "~/Library/Mobile Documents/com~apple~CloudDocs/org/journal/")
 というのは、ファイルを保存する場所の設定だ。iCloud にしておくと、Windows でも編集できるようになって便利。

(setq org-journal-date-format "%Y-%m-%d, %A")
 というのは、ファイルの冒頭の大見出しの設定だ。%A というのは曜日らしい。

(setq org-journal-time-format "%R\n\n")
 というのは、時刻スタンプ。%R で「HH:MM」となるみたい。 \n は改行である。

(setq org-journal-file-format "%Y%m%d.org")
 というのは、生成されるファイル名の書式だ。この場合は「20200212.org」というような、日付のファイルが作られる。

(setq org-journal-find-file 'find-file)
 デフォルトでは、エントリを呼び出すと emacs の画面が上下にわかれて、下のほうに表示される。それを一画面にする設定。二画面に戻す場合はこの行を削除するか、 'find-file の部分を、 'find-file-other-window と書き換える。

(setq org-extend-today-until '3)
 デフォルトでは 0 時を過ぎると翌日になったということで、エントリを呼び出すと新規ファイルが生成される。これを午前 3 時までのばすための設定。深夜 3 時までは当日扱い、ということで昨日の日付のファイルに続きを書ける。

(global-set-key "\C-cj" 'org-journal-new-entry)
 エントリを C-c j で呼び出すための設定。デフォルトでは C-c C-j 、となっている。

(add-hook 'visual-line-mode-hook
      '(lambda()
     (setq word-wrap nil)))

行の折り返しの設定。デフォルトではいわゆるソフトラップというか、行がウィンドウの幅を越えると、手近な半角スペースで折り返すようになっている。半角スペースで単語を書き連ねていく英文だったらいいんだけど、日本語にはあわない。
 M-x visual-line-mode を実行するたびに、このソフトラップの有効、無効を切り替えできる。しかし、毎回それをやるのはいかにもダルい。

ということで検索したところ、解決に尽力された方の記事を見つけた。

🔗 Emacs で Markdown 編集時に gfm-mode にすると word wrap が効いてしまうのを抑制する

ありがとうございます。完璧に動作しております。

(defun org-journal-file-header-func ()
"Custom function to create journal header."
(concat
(pcase org-journal-file-type
      (`daily "#+STARTUP: content indent inlineimages"))))

(setq org-journal-file-header 'org-journal-file-header-func)

ヘッダの挿入。
 org-mode では文書の最初に、文書の体裁を決めるヘッダをつけられる。
  (defun ではじまる部分が関数のようで、そこで設定して、 setq ではじまる部分で実行しているものらしい(よくわからない)。
  #+STARTUP: に content と設定しておくと、文書を開いたとき大見出しの下の小見出しが畳まれずに列挙される。これを showall にすれば小見出しもすべて開くはずなんだけど、うまくいかない。
 しかたがないので、[ shift ] + [ tab ]でいちいち開いている。

indent というのは小見出しにインデントをつけてくれる。
 inlineimages というのは画像の表示を有効にするものだ。画像はリンクと同じで [[~/Pictures/image.png]] という感じで挿入できる。

(require 'org-journal)
 この require org-journal というのは一番最後に記述したほうがいいみたいだ。
 環境によるのかもしれないけど、筆者の場合はこれより下に書いた設定は反映されなかった。

また上には書いてないけど、 org-journal-file-type というのを設定すると、ひとつのファイルで一週間、ひと月、あるいは一年の記録をとることも出来る。

;; 一週間なら
(setq org-journal-file-type ‘weekly)
;; 一ヶ月なら
(setq org-journal-file-type ‘monthly)
;; 一年なら
(setq org-journal-file-type ‘yearly)
;; デフォルトは一日
(setq org-journal-file-type ‘daily)

という感じになるかと思う。

org-journal はカレンダーなどとも連携するらしい。まだ試してない。
 二日三日使ってみて、ライフログっていうより、モヤモヤした考えを整理するため、文章にして、そのまま書き捨てって感じの使い方になりつつある。なかなか楽しいのでおすすめだ。