evalした結果がそんな遠くで大丈夫か? 大丈夫だ。問題ない。

非同期なプログラムを書き始めると、タイミングの関係もあってprintデバッグに頼ることが多い。アプリの動作時はmessageや独自のログバッファに出力している。

一方で、書きながら実験したり、ちょっと実行したいときには eval-last-sexp をよく使っている。しかしながら、2つ問題がある。ひとつは、画面が広いと実行したい式と結果が表示される場所が遠すぎること。もう一つの問題は、 message関数ではミニバッファの1行分しか表示されないため、流れの内容を確認するためにはバッファを切り替える必要があること。

何度も書いて試したいのに、毎回目の長距離移動やバッファ切り替えは辛いので、popup.el(id:m2ymさん)を使って改善してみることにした。



右上で eval-last-sexp すると、左下のミニバッファに結果が出てくる

popup.elは内部ではすごい泥臭いことが行われているにもかかわらず、ミラクルな実装で確実に動作し、使いやすいシンプルなAPIとしてラップされている。すごい。

ということで、結果を単に表示するだけなら簡単に実装できた。



カーソールのすぐ近所に結果が表示される

非同期のメッセージも欲しかったので、モードレスダイアログのような感じで出しっぱなしにして、ポーリングで適当に制御するようにした。



非同期で表示されるメッセージも追加される

elisp以外にも、その場でevalするようなものにはすぐに応用できそう。


以下コード。ライセンスはGPL3です。