[lice @ indent-region (buggy) + eval-defun]
[lice.git] / debugger.lisp
blobaf195f4cfe971fc07a7394e0aa9b2c8486e3847f
1 ;;; An interactive debugger for lice
3 (in-package #:lice)
5 (define-major-mode debugger-mode
6 (:name "Debugger"
7 :map (let ((m (make-sparse-keymap)))
8 (define-key m (kbd "q") 'debugger-invoke-top-level-restart)
9 m))
10 "debugger mode"
11 ;; empty init
14 (defun enter-debugger (condition old-debugger-value)
15 "Create a debugger buffer, print the error and any active restarts."
16 (declare (ignore old-debugger-value))
17 ;; make sure we're not in the minibuffer
18 (select-window (first (frame-window-list *current-frame*)))
19 (pop-to-buffer (get-buffer-create "*debugger*"))
20 (erase-buffer)
21 (set-major-mode debugger-mode)
22 (insert (format nil "Debugger~%~a~%~%~a~%~{~a~%~}" (backtrace-as-string) condition (compute-restarts)))
23 (recursive-edit)
24 ;; if we exit the recursive edit we'll fall into the regular debugger.
27 (defmacro with-lice-debugger (&body body)
28 `(let ((*debugger-hook* #'enter-debugger))
29 ,@body))
31 (defcommand debugger-invoke-top-level-restart ()
32 (when (get-buffer "*debugger*")
33 (kill-buffer (get-buffer "*debugger*")))
34 (invoke-restart (find-restart 'recursive-edit-top-level)))