xrdp のログイン画面をちょっとだけカスタマイズして依頼、ちょいちょいLinux環境を触っている。
久し振りにEmacsの設定を見直していると、Xresoucesを編集するときのメジャー・モードがエラーを吐く。 もともと Debianのemacs-goodies-elというパッケージにあったものだった。
手直しをしてみたが、今どきはEmacsにbuild-inのconf-modeを使うのが良いらしい。 というわけで、せっかくエラーを解消したのだが無駄になってしまった。
なのだが、せっかくなので自分の記録として残しておく。
目次
エラーの原因
エラーが出るのはマクロの書き方が古かったせいと思われる。以下のようにすればエラーは解消される。
(defmacro xrdb-safe (&rest body)
"Safely execute BODY, return nil if an error occurred."
`(condition-case nil
(progn ,@body)
(error nil)))
このマクロはエラー処理の部分で、中身について調べたことをメモしておく:
- &rest は残りの引数を配列(例えば(1 2 3)のように)として受け取る。
condition-caseはエラー回避のときに使われる形式。
(condition-case エラー変数 非トラップ本体 エラーハンドラ)
“非トラップ本体”を評価して、エラーが起きなければ、その値を返し、エラー・ハンドラは無視される。 エラーが起きた場合は、エラーの状態を示すシンボルをエラー変数に代入して、エラー・ハンドラの処理が実行される。
今の場合はbodyは (and (mark) (region-beginning)) (and (mark) (region-end))
そして今の場合は、エラーが起きても無視する。
- バッククォートの中での@はリストの中身を展開して参照する
- @の前の,(カンマ) はカンマの後だけを評価する。(今の場合は bodyの中を展開して参照する)
参考にしたページ
- とほほのLISP入門 – とほほのWWW入門
- condition-case (Programming in Emacs Lisp)
- Emacs Lispで例外処理 – Shohei Yoshida’s Diary
YaTeXの作者の本は分かりやすく書かれている。