19.1.2 Отладка ошибок Redisplay

Когда в коде Lisp происходит ошибка, вызванная redisplay, обычные механизмы отладки Emacs становятся непригодными по техническим причинам. В этом разделе описывается, как получить трассировку стека для такой ошибки, что должно быть полезно для ее отладки.

Эти указания применимы к формам Lisp, используемым, например, в конструкциях строки режима :eval (см. Структура строки режима), а также во всех хуках, вызываемых из redisplay, таких как:

Обратите внимание, что если у вас была ошибка в функции хука, вызванной из redisplay, обработка ошибок могла удалить эту функцию из хука. Таким образом, вам, возможно, потребуется как-то переинициализировать этот хук, возможно, с помощью add-hook, чтобы иметь возможность воспроизвести ошибку.

Чтобы сгенерировать трассировку стека в этих обстоятельствах, установите переменную backtrace-on-redisplay-error в значение, отличное от nil. Когда произойдет ошибка, Emacs выведет трассировку стека в буфер *Redisplay-trace*, но не отобразит ее автоматически в окне. Это делается для того, чтобы избежать ненужного повреждения отлаживаемого redisplay. Таким образом, вам придется отобразить буфер самостоятельно, с помощью такой команды, как switch-to-buffer-other-frame C-x 5 b.

Переменная: backtrace-on-redisplay-error

Установите эту переменную в значение, отличное от nil, чтобы включить генерацию трассировки стека при возникновении ошибки в любом Lisp, вызванном из redisplay.