org-bulletsを改造した
org-modeの見出しをUTF-8の記号に変える「org-bullets」というのがある.
その記号を変えたり,インポート・エクスポート関数を作ったりしてみた.
見出し記号を変える
出来上がりは,こんな感じ.
所属しているプログラミングサークルでは,議事録等の見出しに使う記号が決まっている.
例えば,階層毎に□や◎,○などがある.
この階層化が便利で,サークル以外に研究室の議事録などでも使うようになった.
「org-bulletsでこの記号を使えるようにすれば,org-modeで議事録を書けるのでは?」
と思ったのがキッカケ.
記号の変更自体は簡単で,org-bullets-bullet-listという,見出し用記号のリストの中身を変えるだけ.
問題だったのは,「記号の先頭に空白を入れない」ということ.
org-bulletsの処理は以下のようになっている.
- ^\\*+ で検索
- 最後の*を階層に応じて記号に置換
- 置換した記号より前の*は消す
そのため,2番目の処理で全ての*を記号に置換するようにして,3番目の処理を削除した.
エクスポート関数
org-bulletsでは見掛け上変更しているだけなので,保存時はorg-modeの見出しになる.
そこで,org-bullets形式で保存できるようにエクスポート関数を作ってみた.
と言っても,org-bulletsの置換処理を流用しただけなんだけど….
工夫した所としては,以下の2つ.
- with-temp-bufferで一時バッファを作る
- 一時バッファ上で置換処理をしてファイル保存
with-temp-bufferは始めて使ったけど,current-bufferを変更せず処理できるのが良い.
インポート関数
エクスポートできるなら,インポートもできるなきゃダメでしょ!ということで実装した.
こちらでもwith-temp-bufferを使った.
一時バッファをにファイルを読み込んで置換して,current-bufferに挿入という形で実装している.
position関数の存在を知るまで,かなり時間がかかってしまった….
プルリク出した
ここまでの内容とは関係ないのだけど,プルリクも出してみた.
内容は,org-bullets-mode-hookにfont-lock-fontify-bufferを追加するというもの.
org-bulletsでは,font-lockを使って置換してるのだが,minor-mode起動時に置換が適用さればい場合があった.
(既にorg-modeで書いていて,途中でorg-bulletsを起動した場合など.)
そこで,起動時にfont-lockを適用させる関数を呼ぶことで,buffer全体にorg-bulletsを適用できるようにした.
まとめ
emacs lispほとんど書いたことなかったので,かなり調べながら作業した.
letとかdolistとかも初めて触って,便利だなーという感じ.
エクスポートは,可能ならorg-modeのexport engine(ox.el)使うようにしたい.