* lisp/emacs-lisp/edebug.el (edebug--display): Move protective let-binding

so it applies in the right buffer.

Fixes: debbugs:16410
This commit is contained in:
Stefan Monnier 2014-01-13 21:51:52 -05:00
parent d1eaf34b2f
commit fd7fde1590
2 changed files with 128 additions and 120 deletions

View file

@ -2405,9 +2405,7 @@ MSG is printed after `::::} '."
(edebug-outside-d-c-i-n-s-w
(default-value 'cursor-in-non-selected-windows)))
(unwind-protect
(let ((overlay-arrow-position overlay-arrow-position)
(overlay-arrow-string overlay-arrow-string)
(cursor-in-echo-area nil)
(let ((cursor-in-echo-area nil)
(unread-command-events nil)
;; any others??
)
@ -2468,136 +2466,141 @@ MSG is printed after `::::} '."
(edebug-stop)
;; (discard-input) ; is this unfriendly??
))
;; Now display arrow based on mode.
(edebug-overlay-arrow)
(cond
((eq 'error arg-mode)
;; Display error message
(setq edebug-execution-mode 'step)
(edebug-overlay-arrow)
(beep)
(if (eq 'quit (car value))
(message "Quit")
(edebug-report-error value)))
(edebug-break
(cond
(edebug-global-break
(message "Global Break: %s => %s"
edebug-global-break-condition
edebug-global-break-result))
(edebug-break-condition
(message "Break: %s => %s"
edebug-break-condition
edebug-break-result))
((not (eq edebug-execution-mode 'Continue-fast))
(message "Break"))
(t)))
;; Make sure we bind those in the right buffer (bug#16410).
(let ((overlay-arrow-position overlay-arrow-position)
(overlay-arrow-string overlay-arrow-string))
;; Now display arrow based on mode.
(edebug-overlay-arrow)
(t (message "")))
(cond
((eq 'error arg-mode)
;; Display error message
(setq edebug-execution-mode 'step)
(edebug-overlay-arrow)
(beep)
(if (eq 'quit (car value))
(message "Quit")
(edebug-report-error value)))
(edebug-break
(cond
(edebug-global-break
(message "Global Break: %s => %s"
edebug-global-break-condition
edebug-global-break-result))
(edebug-break-condition
(message "Break: %s => %s"
edebug-break-condition
edebug-break-result))
((not (eq edebug-execution-mode 'Continue-fast))
(message "Break"))
(t)))
(if (eq 'after arg-mode)
(progn
;; Display result of previous evaluation.
(if (and edebug-break
(not (eq edebug-execution-mode 'Continue-fast)))
(sit-for edebug-sit-for-seconds)) ; Show message.
(edebug-previous-result)))
(t (message "")))
(cond
(edebug-break
(cond
((eq edebug-execution-mode 'continue)
(sit-for edebug-sit-for-seconds))
((eq edebug-execution-mode 'Continue-fast) (sit-for 0))
(t (setq edebug-stop t))))
;; not edebug-break
((eq edebug-execution-mode 'trace)
(sit-for edebug-sit-for-seconds)) ; Force update and pause.
((eq edebug-execution-mode 'Trace-fast)
(sit-for 0))) ; Force update and continue.
(if (eq 'after arg-mode)
(progn
;; Display result of previous evaluation.
(if (and edebug-break
(not (eq edebug-execution-mode 'Continue-fast)))
(sit-for edebug-sit-for-seconds)) ; Show message.
(edebug-previous-result)))
(unwind-protect
(if (or edebug-stop
(memq edebug-execution-mode '(step next))
(eq arg-mode 'error))
(progn
;; (setq edebug-execution-mode 'step)
;; (edebug-overlay-arrow) ; This doesn't always show up.
(edebug--recursive-edit arg-mode))) ; <----- Recursive edit
(cond
(edebug-break
(cond
((eq edebug-execution-mode 'continue)
(sit-for edebug-sit-for-seconds))
((eq edebug-execution-mode 'Continue-fast) (sit-for 0))
(t (setq edebug-stop t))))
;; not edebug-break
((eq edebug-execution-mode 'trace)
(sit-for edebug-sit-for-seconds)) ; Force update and pause.
((eq edebug-execution-mode 'Trace-fast)
(sit-for 0))) ; Force update and continue.
;; Reset the edebug-window-data to whatever it is now.
(let ((window (if (eq (window-buffer) edebug-buffer)
(selected-window)
(get-buffer-window edebug-buffer))))
;; Remember window-start for edebug-buffer, if still displayed.
(if window
(progn
(setcar edebug-window-data window)
(setcdr edebug-window-data (window-start window)))))
(unwind-protect
(if (or edebug-stop
(memq edebug-execution-mode '(step next))
(eq arg-mode 'error))
(progn
;; (setq edebug-execution-mode 'step)
;; (edebug-overlay-arrow) ; This doesn't always show up.
(edebug--recursive-edit arg-mode))) ; <--- Recursive edit
;; Save trace window point before restoring outside windows.
;; Could generalize this for other buffers.
(setq edebug-trace-window (get-buffer-window edebug-trace-buffer))
(if edebug-trace-window
(setq edebug-trace-window-start
(and edebug-trace-window
(window-start edebug-trace-window))))
;; Reset the edebug-window-data to whatever it is now.
(let ((window (if (eq (window-buffer) edebug-buffer)
(selected-window)
(get-buffer-window edebug-buffer))))
;; Remember window-start for edebug-buffer, if still displayed.
(if window
(progn
(setcar edebug-window-data window)
(setcdr edebug-window-data (window-start window)))))
;; Restore windows before continuing.
(if edebug-save-windows
(progn
(edebug-set-windows edebug-outside-windows)
;; Save trace window point before restoring outside windows.
;; Could generalize this for other buffers.
(setq edebug-trace-window
(get-buffer-window edebug-trace-buffer))
(if edebug-trace-window
(setq edebug-trace-window-start
(and edebug-trace-window
(window-start edebug-trace-window))))
;; Restore displayed buffer points.
;; Needed even if restoring windows because
;; window-points are not restored. (should they be??)
(if edebug-save-displayed-buffer-points
(edebug-set-buffer-points edebug-buffer-points))
;; Restore windows before continuing.
(if edebug-save-windows
(progn
(edebug-set-windows edebug-outside-windows)
;; Unrestore trace window's window-point.
(if edebug-trace-window
(set-window-start edebug-trace-window
edebug-trace-window-start))
;; Restore displayed buffer points.
;; Needed even if restoring windows because
;; window-points are not restored. (should they be??)
(if edebug-save-displayed-buffer-points
(edebug-set-buffer-points edebug-buffer-points))
;; Unrestore edebug-buffer's window-start, if displayed.
(let ((window (car edebug-window-data)))
(if (and (edebug-window-live-p window)
(eq (window-buffer) edebug-buffer))
(progn
(set-window-start window (cdr edebug-window-data)
'no-force)
;; Unrestore edebug-buffer's window-point.
;; Needed in addition to setting the buffer point
;; - otherwise quitting doesn't leave point as is.
;; But this causes point to not be restored at times.
;; Also, it may not be a visible window.
;; (set-window-point window edebug-point)
)))
;; Unrestore trace window's window-point.
(if edebug-trace-window
(set-window-start edebug-trace-window
edebug-trace-window-start))
;; Unrestore edebug-buffer's point. Rerestored below.
;; (goto-char edebug-point) ;; in edebug-buffer
)
;; Since we may be in a save-excursion, in case of quit,
;; reselect the outside window only.
;; Only needed if we are not recovering windows??
(if (edebug-window-live-p edebug-outside-window)
(select-window edebug-outside-window))
) ; if edebug-save-windows
;; Unrestore edebug-buffer's window-start, if displayed.
(let ((window (car edebug-window-data)))
(if (and (edebug-window-live-p window)
(eq (window-buffer) edebug-buffer))
(progn
(set-window-start window (cdr edebug-window-data)
'no-force)
;; Unrestore edebug-buffer's window-point.
;; Needed in addition to setting the buffer point
;; - otherwise quitting doesn't leave point as is.
;; But can this causes point to not be restored.
;; Also, it may not be a visible window.
;; (set-window-point window edebug-point)
)))
;; Restore current buffer always, in case application needs it.
(if (buffer-name edebug-outside-buffer)
(set-buffer edebug-outside-buffer))
;; Restore point, and mark.
;; Needed even if restoring windows because
;; that doesn't restore point and mark in the current buffer.
;; But don't restore point if edebug-buffer is current buffer.
(if (not (eq edebug-buffer edebug-outside-buffer))
(goto-char edebug-outside-point))
(if (marker-buffer (edebug-mark-marker))
;; Does zmacs-regions need to be nil while doing set-marker?
(set-marker (edebug-mark-marker) edebug-outside-mark))
) ; unwind-protect
;; Unrestore edebug-buffer's point. Rerestored below.
;; (goto-char edebug-point) ;; in edebug-buffer
)
;; Since we may be in a save-excursion, in case of quit,
;; reselect the outside window only.
;; Only needed if we are not recovering windows??
(if (edebug-window-live-p edebug-outside-window)
(select-window edebug-outside-window))
) ; if edebug-save-windows
;; Restore current buffer always, in case application needs it.
(if (buffer-name edebug-outside-buffer)
(set-buffer edebug-outside-buffer))
;; Restore point, and mark.
;; Needed even if restoring windows because
;; that doesn't restore point and mark in the current buffer.
;; But don't restore point if edebug-buffer is current buffer.
(if (not (eq edebug-buffer edebug-outside-buffer))
(goto-char edebug-outside-point))
(if (marker-buffer (edebug-mark-marker))
;; Does zmacs-regions need to be nil while doing set-marker?
(set-marker (edebug-mark-marker) edebug-outside-mark))
)) ; unwind-protect
;; None of the following is done if quit or signal occurs.
;; Restore edebug-buffer's outside point.