久々に今日の作業 - message の実装

現在icompという縦型インラインを使ってその場にメッセージを表示するパッケージを作成中.
最近あまり触れてなかったけど, 久々にいじった..
正規表現はとりあえず後回し.
思い付いたのを実装してみた.



最初の構想では, 補完を縦型インラインを使ってやりたいってことで,
completing-readにあたるものを用意して, それを使って補完できるようにしようってことやった.
でも, 普通のmessage関数もこれでできれば良いんやない?と思って実装してみた.
# flymakeのエラー表示とかこれでできたら嬉しそうな気がした.
コードは, こんな感じ.

(defmacro icomp-message (str &rest objects)
  "Display a message a the point.
The message does *not* goes into the `Messages' buffer.
Return the message.
see also `message'."
  `(let ((msg (format ,str ,@objects))
         action)
     (unwind-protect
         (progn
           (icomp-inline-show-vertical msg icomp-inline-show-face)
           (setq action (read-key-sequence-vector "")))
       (icomp-inline-hide))
     (icomp-do-last-command action)
     msg))

message や format にあたるものをどうやって実装したらいいかが分かんなくて, ちょっと考えた.
真面目にやると大変そうだから, できれば避けたいなあとかうんうん唸ってたら, マクロ使えばいいんやね?と思ってやってみたらビンゴだった.
# マクロはいつも手探りだ.
現在は, message の仕様に合わせて, 最後に表示したメッセージを返すようにしてるけど,
そうすると関数の実行後にミニバッファに表示したメッセージが表示されて, インラインで表示する意味があまり無いような気がするのでやめると思う.
試してないけど, たぶん前に公開したバージョンのicompでもこのコードをそのまま使えば動くと思う.


なんとなくとってみたスクリーンショット.

ちなみに使用したコマンドは, ImageMagickに含まれる import コマンド.
こんな感じで実行した.

$ sleep 5; import -window root message.jpg

これで, 5秒後にスクリーンショットが撮られる.
デュアルスクリーンでもきっちりとれてビックリ.
# まあ, xorg.conf の設定を TwinView でやってるから, Xinerama を True にした場合だと違うのかもしれないけどね.
ちなみにこのスクショ, unwind-protectの使い方を調べて直す前だから, ちょっと間違ってる. 後処理の部分が.

更新時刻

2008年, 2月10日, 00:52