本記事は Emacs Advent Calendar 2025 の12日目の記事です。
何を作ったか
Emacs Lisp 式の値を; =>というコメントをつけた部分に自動注釈するlispxmpというパッケージがあります。
2025年の年始にこれを以下のようにちょっとだけ改変したものを書きました。
これで行ったのは3つの小さな変更のみでした。
- clからcl-libへの変更
- defadviceからadvice-addへの変更
- region選択してそのなかでのみ実行する機能の追加
しかし、使っているうちにlispxmpの「コードに文法的な間違いがあると、置き換えに失敗して全体的にコードを破壊することがある」という根本的な欠陥が判明しました。
またSICPを読むにあたり、schemeのコードでも同じように自動注釈したくなってきました。
そこでこの2つを解決するためにlispxmp.elのコードをよみ、謎なところを書き直して、scheme(今回はracketしか試してないけれど)に対応したのが以下のコードとなります。
enhanced lispxmpでelispxmpのつもりです。
どうつくったか
elispexmp関数は(narrowingなどはさておき)以下を順に実行します。
(elispxmp-evaluate-with-temp-buffer buf mode))(elispxmp-insert-annotations)
1.でtemporary bufferに現在の内容をコピーして、評価用のheaderをつけて、全体を評価
2.で評価して得た内容を現在のbufferに書き込んでいく
という概要になります。結構力技です。
この手順はemacs lispでも、schemeでも同じです。実行するコマンドと、評価用のheaderが変わるだけです。評価用のheaderをつけるので、shcemeでtop levelにあるべきdefineなんかに注釈をつけようとするとエラーになります。
オリジナルは一旦該当箇所全部消して、評価結果をつけたテキストに置き換えていくような実装だったので、とまるとテキストが破壊されたりしていたようでした。マーカーつけたりとかなんかいろいろ複雑なことしていたのですが、必要性がよくわからなかったので、そういうことはしていません。
今回は(re-search-forward "\\(;+ *\\)=>.*$" nil t)で見つけて後ろに結果を書いていくだけです。
最後に
こういうのは言語勉強するときのツールとしては便利ですよね。REPLでも良いのですけどちょっとだけ快適性が上な気がします。
わりとやっつけツールなのでバグ(や考慮漏れ)はたくさんありそうな予感です。対応できるかはわかりませんが、ご指摘いただけると幸いです。