From 5fc58d8323b63d83804aed17f19cb362e032f62d Mon Sep 17 00:00:00 2001 From: "Richard M. Stallman" Date: Fri, 19 Sep 2003 14:31:15 +0000 Subject: [PATCH] (edebug-var-status, edebug-restore-status): New functions. (edebug-enter, edebug-outside-excursion): Use them. --- lisp/emacs-lisp/edebug.el | 75 ++++++++++++++++++++++++++++----------- 1 file changed, 55 insertions(+), 20 deletions(-) diff --git a/lisp/emacs-lisp/edebug.el b/lisp/emacs-lisp/edebug.el index 41b473f6d3f..2f26fce27cb 100644 --- a/lisp/emacs-lisp/edebug.el +++ b/lisp/emacs-lisp/edebug.el @@ -2241,8 +2241,10 @@ error is signaled again." ;; Save the outside value of executing macro. (here??) (edebug-outside-executing-macro executing-kbd-macro) - (edebug-outside-pre-command-hook pre-command-hook) - (edebug-outside-post-command-hook post-command-hook)) + (edebug-outside-pre-command-hook + (edebug-var-status 'pre-command-hook)) + (edebug-outside-post-command-hook + (edebug-var-status 'post-command-hook))) (unwind-protect (let (;; Don't keep reading from an executing kbd macro ;; within edebug unless edebug-continue-kbd-macro is @@ -2267,10 +2269,11 @@ error is signaled again." edebug-next-execution-mode nil) (edebug-enter edebug-function edebug-args edebug-body)) ;; Reset global variables in case outside value was changed. - (setq executing-kbd-macro edebug-outside-executing-macro - pre-command-hook edebug-outside-pre-command-hook - post-command-hook edebug-outside-post-command-hook - ))) + (setq executing-kbd-macro edebug-outside-executing-macro) + (edebug-restore-status + 'post-command-hook edebug-outside-post-command-hook) + (edebug-restore-status + 'pre-command-hook edebug-outside-pre-command-hook))) (let* ((edebug-data (get edebug-function 'edebug)) (edebug-def-mark (car edebug-data)) ; mark at def start @@ -2291,6 +2294,30 @@ error is signaled again." (funcall edebug-body)) ))) +(defun edebug-var-status (var) + "Return a cons cell describing the status of VAR's current binding. +The purpose of this function is so you can properly undo +subsequent changes to the same binding, by passing the status +cons cell to `edebug-restore-status'. The status cons cell +has the form (LOCUS . VALUE), where LOCUS can be a buffer +\(for a buffer-local binding), a frame (for a frame-local binding), +or nil (if the default binding is current)." + (cons (variable-binding-locus var) + (symbol-value var))) + +(defun edebug-restore-status (var status) + "Reset VAR based on STATUS. +STATUS should be a list you got from `edebug-var-status'." + (let ((locus (car status)) + (value (cdr status))) + (cond ((bufferp locus) + (if (buffer-live-p locus) + (with-current-buffer locus + (set var value)))) + ((framep locus) + (modify-frame-parameters locus (list (cons var value)))) + (t + (set var value))))) (defun edebug-enter-trace (edebug-body) (let ((edebug-stack-depth (1+ edebug-stack-depth)) @@ -3511,8 +3538,9 @@ Return the result of the last expression." (executing-kbd-macro edebug-outside-executing-macro) (defining-kbd-macro edebug-outside-defining-kbd-macro) - (pre-command-hook edebug-outside-pre-command-hook) - (post-command-hook edebug-outside-post-command-hook) + ;; Get the values out of the saved statuses. + (pre-command-hook (cdr edebug-outside-pre-command-hook)) + (post-command-hook (cdr edebug-outside-post-command-hook)) ;; See edebug-display (overlay-arrow-position edebug-outside-o-a-p) @@ -3552,13 +3580,18 @@ Return the result of the last expression." edebug-outside-executing-macro executing-kbd-macro edebug-outside-defining-kbd-macro defining-kbd-macro - edebug-outside-pre-command-hook pre-command-hook - edebug-outside-post-command-hook post-command-hook edebug-outside-o-a-p overlay-arrow-position edebug-outside-o-a-s overlay-arrow-string edebug-outside-c-i-e-a cursor-in-echo-area - ))) ; let + ) + + ;; Restore the outside saved values; don't alter + ;; the outside binding loci. + (setcdr edebug-outside-pre-command-hook pre-command-hook) + (setcdr edebug-outside-post-command-hook post-command-hook) + + )) ; let )) (defvar cl-debug-env nil) ;; defined in cl; non-nil when lexical env used. @@ -3676,14 +3709,13 @@ Print result in minibuffer." (edebug-safe-prin1-to-string (car values))))) (defun edebug-eval-last-sexp () - "Evaluate sexp before point in the outside environment; -print value in minibuffer." + "Evaluate sexp before point in the outside environment; value in minibuffer." (interactive) (edebug-eval-expression (edebug-last-sexp))) (defun edebug-eval-print-last-sexp () - "Evaluate sexp before point in the outside environment; -print value into current buffer." + "Evaluate sexp before point in the outside environment; insert the value. +This prints the value into current buffer." (interactive) (let* ((edebug-form (edebug-last-sexp)) (edebug-result-string @@ -3698,12 +3730,15 @@ print value into current buffer." ;;; Edebug Minor Mode -;; Global GUD bindings for all emacs-lisp-mode buffers. -(define-key emacs-lisp-mode-map "\C-x\C-a\C-s" 'edebug-step-mode) -(define-key emacs-lisp-mode-map "\C-x\C-a\C-n" 'edebug-next-mode) -(define-key emacs-lisp-mode-map "\C-x\C-a\C-c" 'edebug-go-mode) -(define-key emacs-lisp-mode-map "\C-x\C-a\C-l" 'edebug-where) +(defvar gud-inhibit-global-bindings + "*Non-nil means don't do global rebindings of C-x C-a subcommands.") +;; Global GUD bindings for all emacs-lisp-mode buffers. +(unless gud-inhibit-global-bindings + (define-key emacs-lisp-mode-map "\C-x\C-a\C-s" 'edebug-step-mode) + (define-key emacs-lisp-mode-map "\C-x\C-a\C-n" 'edebug-next-mode) + (define-key emacs-lisp-mode-map "\C-x\C-a\C-c" 'edebug-go-mode) + (define-key emacs-lisp-mode-map "\C-x\C-a\C-l" 'edebug-where)) (defvar edebug-mode-map (let ((map (copy-keymap emacs-lisp-mode-map))) -- 2.39.2