はじめに
Emacsを起動すると最初から開いている *scratch* バッファは、lisp-interaction-mode で動いています。Lispの式をその場で評価できる便利な場所ですが、ちょっとしたメモやアイデアの下書きを書くには少し勝手が違います。
「Lisp評価用の *scratch* はそのまま、org記法でメモできる別の作業場所が欲しいなぁ」
この記事では、そんなorg-mode専用のscratchバッファを開く最小構成の関数を紹介します。
完成形のコード
まずは全体です。これを init.el などに貼り付ければ動きます。
(defun my/org-scratch ()
"org-mode 用の scratch バッファを開く。"
(interactive)
(let ((buf (get-buffer-create "*org-scratch*")))
(with-current-buffer buf
(unless (derived-mode-p 'org-mode)
(org-mode)))
(pop-to-buffer-same-window buf)))
(global-set-key (kbd "C-c o s") #'my/org-scratch)
C-c o s を押すと *org-scratch* というバッファがorg-modeで開きます。これだけです。
コードの解説
短いコードですが、要素ごとに何をしているか見ていきます。
(interactive)
この一行があることで、M-x my/org-scratch やキーバインドから呼び出せる「コマンド」になります。逆にこれが無いと、対話的に呼び出せない単なる関数のままです。
get-buffer-create
(get-buffer-create "*org-scratch*")
指定した名前のバッファを返します。ポイントは、すでに同名のバッファが存在すればそれをそのまま返すところです。新規作成は初回だけなので、2回目以降に呼び出しても書きかけの内容は消えません。
with-current-buffer と derived-mode-p
(with-current-buffer buf
(unless (derived-mode-p 'org-mode)
(org-mode)))
with-current-buffer は、対象のバッファを一時的にカレントバッファにして処理を実行するためのマクロです。その中で derived-mode-p を使い、まだorg-modeになっていない場合だけ (org-mode) を呼んでいます。
unless で囲っているのは、すでにorg-modeのバッファに対して再度 (org-mode) を実行するのを避けるためです。メジャーモードを再設定するとバッファローカルな状態がリセットされてしまうことがあるので、必要なときだけ切り替えるようにしています。
pop-to-buffer-same-window
最後に作成したバッファを表示します。switch-to-buffer でも動きますが、pop-to-buffer-same-window のほうが表示の挙動を display-buffer-alist などで制御しやすく、行儀の良い選択とされています。
キーバインド
(global-set-key (kbd "C-c o s") #'my/org-scratch)
C-c o s に割り当てています。C-c に続く1文字+αはユーザー用に予約された領域なので、自分の設定を入れる場所として安心です。キーはお好みで変更してください。
使い方
C-c o s を押すだけで *org-scratch* が開きます。あとは通常のorg-modeと同じように、見出しやリスト、TODOなどを書けます。Lispを評価したくなったら、これまで通り *scratch* を使えば棲み分けができます。
注意点:内容は保存されない
このバッファはファイルに紐づいていないため、Emacsを終了すると内容は破棄されます。デフォルトの *scratch* と同じ挙動です。
一時的なメモには十分ですが、残したい内容を書くようになってきたら、実ファイルに紐づける運用に切り替えるのがおすすめです。たとえば最初から ~/org/scratch.org のような実ファイルを開くようにすれば、自動保存やバックアップの対象にもできます。このあたりは別記事で発展形として扱う予定です。
おわりに
たった数行ですが、「評価用」と「メモ用」を分けるだけで日々の使い勝手はぐっと良くなります。Emacsは小さな関数を一つ足すだけで自分好みに育てられるのが楽しいところです。ぜひ自分のキーバインドやテンプレートに合わせてアレンジしてみてください。