]> git.eshelyaron.com Git - emacs.git/commitdiff
Add a command to toggle an edebug breakpoint
authorLars Ingebrigtsen <larsi@gnus.org>
Sun, 20 Oct 2019 21:16:04 +0000 (23:16 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Sun, 20 Oct 2019 21:46:50 +0000 (23:46 +0200)
* doc/lispref/edebug.texi (Breakpoints): Document this.

* lisp/emacs-lisp/edebug.el (edebug-disabled-breakpoint): New face
(bug#23472).
(edebug-enabled-breakpoint): Rename.
(edebug--overlay-breakpoints): Use the new face.
(edebug-toggle-disable-breakpoint): New command and keystroke.

doc/lispref/edebug.texi
etc/NEWS
lisp/emacs-lisp/edebug.el

index 03efa985ba9c7d3520ae5e93fc1e35e8d41d3dfb..43665ea9ecd7e167b90a6e6ce4ba5978c2f8ac5a 100644 (file)
@@ -497,8 +497,8 @@ Edebug commands for breakpoints:
 Set a breakpoint at the stop point at or after point
 (@code{edebug-set-breakpoint}).  If you use a prefix argument, the
 breakpoint is temporary---it turns off the first time it stops the
-program.  An overlay with the @code{edebug-breakpoint} face is put at
-the breakpoint.
+program.  An overlay with the @code{edebug-enabled-breakpoint} or
+@code{edebug-disabled-breakpoint} faces is put at the breakpoint.
 
 @item u
 Unset the breakpoint (if any) at the stop point at or after
@@ -508,6 +508,12 @@ point (@code{edebug-unset-breakpoint}).
 Unset any breakpoints in the current form
 (@code{edebug-unset-breakpoints}).
 
+@item D
+Toggle whether to disable the breakpoint near point
+(@code{edebug-toggle-disable-breakpoint}).  This command is mostly
+useful if the breakpoint is conditional and it would take some work to
+recreate the condition.
+
 @item x @var{condition} @key{RET}
 Set a conditional breakpoint which stops the program only if
 evaluating @var{condition} produces a non-@code{nil} value
index 46ed40dfcba87d67499aeb9ca42ce4e6bfefc6fa..d9a9fd82a6103649f22ab9ba6991389c4ada4ca6 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1462,9 +1462,17 @@ the Elisp manual for documentation of the new mode and its commands.
 
 ** Edebug
 
-*** New face 'edebug-breakpoint'
-When setting breakpoints in Edebug, an overlay with this face is
-placed over the point in question.
++++
+*** New faces 'edebug-enabled-breakpoint' and 'edebug-disabled-breakpoint'
+When setting breakpoints in Edebug, an overlay with these faces are
+placed over the point in question, depending on whether they are
+enabled or not.
+
++++
+*** New command 'edebug-toggle-disable-breakpoint'
+This command allows you to disable a breakpoint temporarily.  This is
+mainly useful with breakpoints that are conditional and would take
+some time to recreate.
 
 +++
 *** New command 'edebug-unset-breakpoints'
index d01654927e70a603f3845ab3856785ed387d4dd4..a646ce6febe56a91e5bc68914013c0e4be3c034a 100644 (file)
   "A source-level debugger for Emacs Lisp."
   :group 'lisp)
 
-(defface edebug-breakpoint '((t :inherit highlight))
-  "Face used to mark breakpoints."
+(defface edebug-enabled-breakpoint '((t :inherit highlight))
+  "Face used to mark enabled breakpoints."
+  :version "27.1")
+
+(defface edebug-disabled-breakpoint
+  '((((class color) (min-colors 88) (background light))
+     :background "#ddffdd" :extend t)
+    (((class color) (min-colors 88) (background dark))
+     :background "#335533" :extend t))
+  "Face used to mark disabled breakpoints."
   :version "27.1")
 
 (defcustom edebug-setup-hook nil
@@ -2536,6 +2544,7 @@ See `edebug-behavior-alist' for implementations.")
           (edebug-breakpoints (car (cdr edebug-data))) ; list of breakpoints
           (edebug-break-data (assq offset-index edebug-breakpoints))
           (edebug-break-condition (car (cdr edebug-break-data)))
+           (breakpoint-disabled (nth 4 edebug-break-data))
           (edebug-global-break
            (if edebug-global-break-condition
                (condition-case nil
@@ -2549,6 +2558,7 @@ See `edebug-behavior-alist' for implementations.")
       (setq edebug-break
            (or edebug-global-break
                (and edebug-break-data
+                     (not breakpoint-disabled)
                     (or (not edebug-break-condition)
                         (setq edebug-break-result
                               (edebug-eval edebug-break-condition))))))
@@ -3206,7 +3216,8 @@ the breakpoint."
                      (edebug-sort-alist
                       (cons
                        (list index condition temporary
-                              (set-marker (make-marker) position))
+                              (set-marker (make-marker) position)
+                              nil)
                        edebug-breakpoints)
                        '<))
                (if condition
@@ -3236,7 +3247,10 @@ the breakpoint."
         (let* ((pos (+ start (aref offsets (car breakpoint))))
                (overlay (make-overlay pos (1+ pos))))
           (overlay-put overlay 'edebug t)
-          (overlay-put overlay 'face 'edebug-breakpoint))))))
+          (overlay-put overlay 'face
+                       (if (nth 4 breakpoint)
+                           'edebug-disabled-breakpoint
+                         'edebug-enabled-breakpoint)))))))
 
 (defun edebug--overlay-breakpoints-remove (start end)
   (dolist (overlay (overlays-in start end))
@@ -3271,6 +3285,22 @@ With prefix argument, make it a temporary breakpoint."
         (goto-char (nth 3 breakpoint))
         (edebug-modify-breakpoint nil)))))
 
+(defun edebug-toggle-disable-breakpoint ()
+  "Toggle whether the breakpoint near point is disabled."
+  (interactive)
+  (let ((stop-point (edebug-find-stop-point)))
+    (unless stop-point
+      (user-error "No stop point near point"))
+    (let* ((name (car stop-point))
+           (index (cdr stop-point))
+           (data (get name 'edebug))
+           (breakpoint (assq index (nth 1 data))))
+      (unless breakpoint
+        (user-error "No breakpoint near point"))
+      (setf (nth 4 breakpoint)
+            (not (nth 4 breakpoint)))
+      (edebug--overlay-breakpoints name))))
+
 (defun edebug-set-global-break-condition (expression)
   "Set `edebug-global-break-condition' to EXPRESSION."
   (interactive
@@ -3779,6 +3809,7 @@ be installed in `emacs-lisp-mode-map'.")
     (define-key map "B" 'edebug-next-breakpoint)
     (define-key map "x" 'edebug-set-conditional-breakpoint)
     (define-key map "X" 'edebug-set-global-break-condition)
+    (define-key map "D" 'edebug-toggle-disable-breakpoint)
 
     ;; evaluation
     (define-key map "r" 'edebug-previous-result)
@@ -3834,8 +3865,10 @@ be installed in `emacs-lisp-mode-map'.")
     ;; breakpoints
     (define-key map "b" 'edebug-set-breakpoint)
     (define-key map "u" 'edebug-unset-breakpoint)
+    (define-key map "U" 'edebug-unset-breakpoints)
     (define-key map "x" 'edebug-set-conditional-breakpoint)
     (define-key map "X" 'edebug-set-global-break-condition)
+    (define-key map "D" 'edebug-toggle-disable-breakpoint)
 
     ;; views
     (define-key map "w" 'edebug-where)
@@ -4381,6 +4414,8 @@ It is removed when you hit any char."
     ("Breaks"
      ["Set Breakpoint" edebug-set-breakpoint t]
      ["Unset Breakpoint" edebug-unset-breakpoint t]
+     ["Unset Breakpoints In Form" edebug-unset-breakpoints t]
+     ["Toggle Disable Breakpoint" edebug-toggle-disable-breakpoint t]
      ["Set Conditional Breakpoint" edebug-set-conditional-breakpoint t]
      ["Set Global Break Condition" edebug-set-global-break-condition t]
      ["Show Next Breakpoint" edebug-next-breakpoint t])