12FF5B8

hico_horiuchiの技術系な覚え書き.

org-bulletsを改造した

org-modeの見出しをUTF-8の記号に変える「org-bullets」というのがある.
その記号を変えたり,インポート・エクスポート関数を作ったりしてみた.

見出し記号を変える

出来上がりは,こんな感じ.

所属しているプログラミングサークルでは,議事録等の見出しに使う記号が決まっている.
例えば,階層毎になどがある.
この階層化が便利で,サークル以外に研究室の議事録などでも使うようになった.

「org-bulletsでこの記号を使えるようにすれば,org-modeで議事録を書けるのでは?」

と思ったのがキッカケ.

記号の変更自体は簡単で,org-bullets-bullet-listという,見出し用記号のリストの中身を変えるだけ.
問題だったのは,「記号の先頭に空白を入れない」ということ.
org-bulletsの処理は以下のようになっている.

  1. ^\\*+ で検索
  2. 最後の*を階層に応じて記号に置換
  3. 置換した記号より前の*は消す

そのため,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-hookfont-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)使うようにしたい.