再表示機能が呼び出したLispコードでエラーが発生した場合、技術的な理由により、Emacsの通常のデバッグ機構は利用できなくなります。本サブセクションでは、このようなエラーからバックトレースを取得する方法について説明します。これは、エラーのデバッグに役立つはずです。
これらの指示は、例えば :eval モードライン構文(モードラインのデータ構造
を参照)や、以下のような再表示から呼び出されるすべてのフックで使用される Lisp フォームに適用されます。
fontification-functions(自動顔割り当てを参照)。
window-scroll-functions(ウィンドウのスクロールおよび変更時のフックを参照)。
なお、redisplayから呼び出されたフック関数でエラーが発生した場合、エラー処理によってその関数がフックから削除されている可能性がある点にご注意ください。そのため、バグを再現するには、add-hookなどを用いて何らかの方法でそのフックを再初期化する必要があります。
このような状況でバックトレースを生成するには、変数 backtrace-on-redisplay-error に nil 以外の値を設定してください。エラーが発生すると、Emacs はバックトレースをバッファ *Redisplay-trace*
にダンプしますが、自動的にウィンドウに表示することはありません。これは、デバッグ中の再表示を不必要に損なうのを防ぐためです。したがって、switch-to-buffer-other-frame や C-x 5
b といったコマンドを用いて、自身でバッファを表示する必要があります。
この変数を non-nil に設定すると、redisplay から呼び出された任意の Lisp
でエラーが発生した際にバックトレースが生成されるようになります。