diff options
| author | Karl Heuer | 1997-12-04 04:42:31 +0000 |
|---|---|---|
| committer | Karl Heuer | 1997-12-04 04:42:31 +0000 |
| commit | 8c1cd093df5cfa60b3941f869bae60e94936e1d7 (patch) | |
| tree | 4c1e9b08be43ac82f0750401232446e87edc3594 | |
| parent | 83afd62c8723f5197b0485f431b742b3b03d00ea (diff) | |
| download | emacs-8c1cd093df5cfa60b3941f869bae60e94936e1d7.tar.gz emacs-8c1cd093df5cfa60b3941f869bae60e94936e1d7.zip | |
(debugger-mode-hook): New user variable.
(debugger-env-macro): New general purpose macro for all debugger
functions; separated from `debugger-eval-expression'.
(debugger-eval-expression): Use `debugger-env-macro'.
(debugger-record-buffer): New variable.
(debugger-record-expression): New user function , key "R".
(debugger-mode): Now runs hook `debugger-mode-hook'.
| -rw-r--r-- | lisp/emacs-lisp/debug.el | 126 |
1 files changed, 83 insertions, 43 deletions
diff --git a/lisp/emacs-lisp/debug.el b/lisp/emacs-lisp/debug.el index 9d46bda6869..f7b8e31b714 100644 --- a/lisp/emacs-lisp/debug.el +++ b/lisp/emacs-lisp/debug.el | |||
| @@ -28,6 +28,10 @@ | |||
| 28 | 28 | ||
| 29 | ;;; Code: | 29 | ;;; Code: |
| 30 | 30 | ||
| 31 | (defvar debugger-mode-hook nil | ||
| 32 | "*Hooks run when `debugger-mode' is turned on.") | ||
| 33 | |||
| 34 | |||
| 31 | (defvar debug-function-list nil | 35 | (defvar debug-function-list nil |
| 32 | "List of functions currently set for debug on entry.") | 36 | "List of functions currently set for debug on entry.") |
| 33 | 37 | ||
| @@ -315,52 +319,61 @@ Applies to the frame whose line point is on in the backtrace." | |||
| 315 | (insert ? ))) | 319 | (insert ? ))) |
| 316 | (beginning-of-line)) | 320 | (beginning-of-line)) |
| 317 | 321 | ||
| 322 | |||
| 323 | |||
| 324 | (put 'debugger-env-macro 'lisp-indent-function 0) | ||
| 325 | (defmacro debugger-env-macro (&rest body) | ||
| 326 | "Run BODY in original environment." | ||
| 327 | (` | ||
| 328 | (save-excursion | ||
| 329 | (if (null (buffer-name debugger-old-buffer)) | ||
| 330 | ;; old buffer deleted | ||
| 331 | (setq debugger-old-buffer (current-buffer))) | ||
| 332 | (set-buffer debugger-old-buffer) | ||
| 333 | (let ((track-mouse debugger-outer-track-mouse) | ||
| 334 | (last-command debugger-outer-last-command) | ||
| 335 | (this-command debugger-outer-this-command) | ||
| 336 | (unread-command-char debugger-outer-unread-command-char) | ||
| 337 | (unread-command-events debugger-outer-unread-command-events) | ||
| 338 | (last-input-event debugger-outer-last-input-event) | ||
| 339 | (last-command-event debugger-outer-last-command-event) | ||
| 340 | (last-nonmenu-event debugger-outer-last-nonmenu-event) | ||
| 341 | (last-event-frame debugger-outer-last-event-frame) | ||
| 342 | (standard-input debugger-outer-standard-input) | ||
| 343 | (standard-output debugger-outer-standard-output) | ||
| 344 | (cursor-in-echo-area debugger-outer-cursor-in-echo-area) | ||
| 345 | (overriding-local-map debugger-outer-overriding-local-map) | ||
| 346 | (overriding-terminal-local-map | ||
| 347 | debugger-outer-overriding-terminal-local-map) | ||
| 348 | (load-read-function debugger-outer-load-read-function)) | ||
| 349 | (store-match-data debugger-outer-match-data) | ||
| 350 | (prog1 (progn (,@ body)) | ||
| 351 | (setq debugger-outer-match-data (match-data)) | ||
| 352 | (setq debugger-outer-load-read-function load-read-function) | ||
| 353 | (setq debugger-outer-overriding-terminal-local-map | ||
| 354 | overriding-terminal-local-map) | ||
| 355 | (setq debugger-outer-overriding-local-map overriding-local-map) | ||
| 356 | (setq debugger-outer-track-mouse track-mouse) | ||
| 357 | (setq debugger-outer-last-command last-command) | ||
| 358 | (setq debugger-outer-this-command this-command) | ||
| 359 | (setq debugger-outer-unread-command-char unread-command-char) | ||
| 360 | (setq debugger-outer-unread-command-events unread-command-events) | ||
| 361 | (setq debugger-outer-last-input-event last-input-event) | ||
| 362 | (setq debugger-outer-last-command-event last-command-event) | ||
| 363 | (setq debugger-outer-last-nonmenu-event last-nonmenu-event) | ||
| 364 | (setq debugger-outer-last-event-frame last-event-frame) | ||
| 365 | (setq debugger-outer-standard-input standard-input) | ||
| 366 | (setq debugger-outer-standard-output standard-output) | ||
| 367 | (setq debugger-outer-cursor-in-echo-area cursor-in-echo-area) | ||
| 368 | ))))) | ||
| 369 | |||
| 318 | (defun debugger-eval-expression (exp) | 370 | (defun debugger-eval-expression (exp) |
| 319 | "Eval an expression, in an environment like that outside the debugger." | 371 | "Eval an expression, in an environment like that outside the debugger." |
| 320 | (interactive | 372 | (interactive |
| 321 | (list (read-from-minibuffer "Eval: " | 373 | (list (read-from-minibuffer "Eval: " |
| 322 | nil read-expression-map t | 374 | nil read-expression-map t |
| 323 | 'read-expression-history))) | 375 | 'read-expression-history))) |
| 324 | (save-excursion | 376 | (debugger-env-macro (eval-expression exp))) |
| 325 | (if (null (buffer-name debugger-old-buffer)) | ||
| 326 | ;; old buffer deleted | ||
| 327 | (setq debugger-old-buffer (current-buffer))) | ||
| 328 | (set-buffer debugger-old-buffer) | ||
| 329 | (let ((track-mouse debugger-outer-track-mouse) | ||
| 330 | (last-command debugger-outer-last-command) | ||
| 331 | (this-command debugger-outer-this-command) | ||
| 332 | (unread-command-char debugger-outer-unread-command-char) | ||
| 333 | (unread-command-events debugger-outer-unread-command-events) | ||
| 334 | (last-input-event debugger-outer-last-input-event) | ||
| 335 | (last-command-event debugger-outer-last-command-event) | ||
| 336 | (last-nonmenu-event debugger-outer-last-nonmenu-event) | ||
| 337 | (last-event-frame debugger-outer-last-event-frame) | ||
| 338 | (standard-input debugger-outer-standard-input) | ||
| 339 | (standard-output debugger-outer-standard-output) | ||
| 340 | (cursor-in-echo-area debugger-outer-cursor-in-echo-area) | ||
| 341 | (overriding-local-map debugger-outer-overriding-local-map) | ||
| 342 | (overriding-terminal-local-map | ||
| 343 | debugger-outer-overriding-terminal-local-map) | ||
| 344 | (load-read-function debugger-outer-load-read-function)) | ||
| 345 | (store-match-data debugger-outer-match-data) | ||
| 346 | (prog1 (eval-expression exp) | ||
| 347 | (setq debugger-outer-match-data (match-data)) | ||
| 348 | (setq debugger-outer-load-read-function load-read-function) | ||
| 349 | (setq debugger-outer-overriding-local-map overriding-local-map) | ||
| 350 | (setq debugger-outer-overriding-terminal-local-map | ||
| 351 | overriding-terminal-local-map) | ||
| 352 | (setq debugger-outer-track-mouse track-mouse) | ||
| 353 | (setq debugger-outer-last-command last-command) | ||
| 354 | (setq debugger-outer-this-command this-command) | ||
| 355 | (setq debugger-outer-unread-command-char unread-command-char) | ||
| 356 | (setq debugger-outer-unread-command-events unread-command-events) | ||
| 357 | (setq debugger-outer-last-input-event last-input-event) | ||
| 358 | (setq debugger-outer-last-command-event last-command-event) | ||
| 359 | (setq debugger-outer-last-nonmenu-event last-nonmenu-event) | ||
| 360 | (setq debugger-outer-last-event-frame last-event-frame) | ||
| 361 | (setq debugger-outer-standard-input standard-input) | ||
| 362 | (setq debugger-outer-standard-output standard-output) | ||
| 363 | (setq debugger-outer-cursor-in-echo-area cursor-in-echo-area))))) | ||
| 364 | 377 | ||
| 365 | (defvar debugger-mode-map nil) | 378 | (defvar debugger-mode-map nil) |
| 366 | (if debugger-mode-map | 379 | (if debugger-mode-map |
| @@ -379,7 +392,33 @@ Applies to the frame whose line point is on in the backtrace." | |||
| 379 | (define-key debugger-mode-map "h" 'describe-mode) | 392 | (define-key debugger-mode-map "h" 'describe-mode) |
| 380 | (define-key debugger-mode-map "q" 'top-level) | 393 | (define-key debugger-mode-map "q" 'top-level) |
| 381 | (define-key debugger-mode-map "e" 'debugger-eval-expression) | 394 | (define-key debugger-mode-map "e" 'debugger-eval-expression) |
| 382 | (define-key debugger-mode-map " " 'next-line))) | 395 | (define-key debugger-mode-map " " 'next-line) |
| 396 | (define-key debugger-mode-map "R" 'debugger-record-expression) | ||
| 397 | )) | ||
| 398 | |||
| 399 | |||
| 400 | (defvar debugger-record-buffer "*Debugger-record*" | ||
| 401 | "*Buffer name for expression values, for \\[debugger-record-expression].") | ||
| 402 | |||
| 403 | (defun debugger-record-expression (exp) | ||
| 404 | "Display a variable's value and record it in `*Backtrace-record*' buffer." | ||
| 405 | (interactive | ||
| 406 | (list (read-from-minibuffer | ||
| 407 | "Record Eval: " | ||
| 408 | nil | ||
| 409 | read-expression-map t | ||
| 410 | 'read-expression-history))) | ||
| 411 | (let* ((buffer (get-buffer-create debugger-record-buffer)) | ||
| 412 | (standard-output buffer)) | ||
| 413 | (princ (format "Debugger Eval (%s): " exp)) | ||
| 414 | (princ (debugger-eval-expression exp)) | ||
| 415 | (terpri)) | ||
| 416 | |||
| 417 | (with-current-buffer (get-buffer debugger-record-buffer) | ||
| 418 | (save-excursion | ||
| 419 | (forward-line -1) | ||
| 420 | (message | ||
| 421 | (buffer-substring (point) (progn (end-of-line) (point))))))) | ||
| 383 | 422 | ||
| 384 | (put 'debugger-mode 'mode-class 'special) | 423 | (put 'debugger-mode 'mode-class 'special) |
| 385 | 424 | ||
| @@ -398,14 +437,15 @@ which functions will enter the debugger when called. | |||
| 398 | 437 | ||
| 399 | Complete list of commands: | 438 | Complete list of commands: |
| 400 | \\{debugger-mode-map}" | 439 | \\{debugger-mode-map}" |
| 401 | (kill-all-local-variables) | 440 | (kill-all-local-variables) |
| 402 | (setq major-mode 'debugger-mode) | 441 | (setq major-mode 'debugger-mode) |
| 403 | (setq mode-name "Debugger") | 442 | (setq mode-name "Debugger") |
| 404 | (setq truncate-lines t) | 443 | (setq truncate-lines t) |
| 405 | (set-syntax-table emacs-lisp-mode-syntax-table) | 444 | (set-syntax-table emacs-lisp-mode-syntax-table) |
| 406 | ;; Since we must handle bytecode... | 445 | ;; Since we must handle bytecode... |
| 407 | (setq enable-multibyte-characters nil) | 446 | (setq enable-multibyte-characters nil) |
| 408 | (use-local-map debugger-mode-map)) | 447 | (use-local-map debugger-mode-map) |
| 448 | (run-hooks 'debugger-mode-hook)) | ||
| 409 | 449 | ||
| 410 | ;;;###autoload | 450 | ;;;###autoload |
| 411 | (defun debug-on-entry (function) | 451 | (defun debug-on-entry (function) |