(defvar debug-function-list nil
"List of functions currently set for debug on entry.")
+(defvar debugger-outer-match-data)
(defvar debugger-outer-track-mouse)
(defvar debugger-outer-last-command)
(defvar debugger-outer-this-command)
(setq debugger 'debug)
;;;###autoload
(defun debug (&rest debugger-args)
- "Enter debugger. Returns if user says \"continue\".
+ "Enter debugger. To return, type \\<debugger-mode-map>`\\[debugger-continue]'.
Arguments are mainly for use when this is called from the internals
of the evaluator.
first will be printed into the backtrace buffer."
(message "Entering debugger...")
(let (debugger-value
- (debugger-match-data (match-data))
(debug-on-error nil)
(debug-on-quit nil)
(debugger-buffer (let ((default-major-mode 'fundamental-mode))
- (generate-new-buffer "*Backtrace*")))
+ (get-buffer-create "*Backtrace*")))
(debugger-old-buffer (current-buffer))
(debugger-step-after-exit nil)
;; Don't keep reading from an executing kbd macro!
(executing-macro nil)
;; Save the outer values of these vars for the `e' command
;; before we replace the values.
+ (debugger-outer-match-data (match-data))
(debugger-outer-track-mouse track-mouse)
(debugger-outer-last-command last-command)
(debugger-outer-this-command this-command)
(buffer-read-only t))
(message "")
(recursive-edit))))
- ;; So that users do not try to execute debugger commands
- ;; in an invalid context
- (kill-buffer debugger-buffer)
- (store-match-data debugger-match-data)))
+ ;; Kill or at least neuter the backtrace buffer, so that users
+ ;; don't try to execute debugger commands in an invalid context.
+ (if (get-buffer-window debugger-buffer 'visible)
+ ;; Still visible despite the save-window-excursion? Maybe it
+ ;; it's in a pop-up frame. It would be annoying to delete and
+ ;; recreate it every time the debugger stops, so instead we'll
+ ;; erase it but leave it visible.
+ (save-excursion
+ (set-buffer debugger-buffer)
+ (erase-buffer)
+ (fundamental-mode))
+ (kill-buffer debugger-buffer))
+ (store-match-data debugger-outer-match-data)))
;; Put into effect the modified values of these variables
;; in case the user set them with the `e' command.
(setq track-mouse debugger-outer-track-mouse)
(beginning-of-line))
(defun debugger-eval-expression (exp)
- (interactive "xEval: ")
+ "Eval an expression, in an environment like that outside the debugger."
+ (interactive
+ (list (read-from-minibuffer "Eval: "
+ nil read-expression-map t
+ 'read-expression-history)))
(save-excursion
(if (null (buffer-name debugger-old-buffer))
;; old buffer deleted
(standard-input debugger-outer-standard-input)
(standard-output debugger-outer-standard-output)
(cursor-in-echo-area debugger-outer-cursor-in-echo-area))
+ (store-match-data debugger-outer-match-data)
(prog1 (eval-expression exp)
+ (setq debugger-outer-match-data (match-data))
(setq debugger-outer-track-mouse track-mouse)
(setq debugger-outer-last-command last-command)
(setq debugger-outer-this-command this-command)
;;;###autoload
(defun debug-on-entry (function)
"Request FUNCTION to invoke debugger each time it is called.
-If the user continues, FUNCTION's execution proceeds.
-Works by modifying the definition of FUNCTION,
+If you tell the debugger to continue, FUNCTION's execution proceeds.
+This works by modifying the definition of FUNCTION,
which must be written in Lisp, not predefined.
Use \\[cancel-debug-on-entry] to cancel the effect of this command.
-Redefining FUNCTION also does that."
+Redefining FUNCTION also cancels it."
(interactive "aDebug on entry (to function): ")
(debugger-reenable)
(if (subrp (symbol-function function))
(if (nthcdr 5 contents)
(setq body (cons (list 'interactive (nth 5 contents)) body)))
(if (nth 4 contents)
- (setq body (cons (nth 4 contents) body)))
+ ;; Use `documentation' here, to get the actual string,
+ ;; in case the compiled function has a reference
+ ;; to the .elc file.
+ (setq body (cons (documentation function) body)))
(fset function (cons 'lambda (cons (car contents) body)))))))
(defun debug-on-entry-1 (function defn flag)
(terpri)
(setq list (cdr list))))
(princ "Note: if you have redefined a function, then it may no longer\n")
- (princ "be set to debug on entry, even if it is in the list."))))
+ (princ "be set to debug on entry, even if it is in the list."))
+ (save-excursion
+ (set-buffer standard-output)
+ (help-mode))))
;;; debug.el ends here