branch: externals/dape
commit 68d1eb07ca0d3bd4e2e4ad812767dcb34ba3dc76
Author: Daniel Pettersson <dan...@dpettersson.net>
Commit: Daniel Pettersson <dan...@dpettersson.net>

    Move info modes bindings into each mode map
    
    Improve `describe-mode' for info buffers by moving bindings from
    string properties into mode-map.
---
 dape.el | 123 +++++++++++++++++++++++++++++-----------------------------------
 1 file changed, 55 insertions(+), 68 deletions(-)

diff --git a/dape.el b/dape.el
index f0c8f37de4..ec08ce6dae 100644
--- a/dape.el
+++ b/dape.el
@@ -1259,16 +1259,18 @@ On SKIP-PROCESS-BUFFERS skip deletion of buffers which 
has processes."
            (goto-char (posn-point start))
            (call-interactively ',command))))))
 
-(defmacro dape--buffer-map (name fn &rest body)
-  "Helper macro to create info buffer map with NAME.
-FN is executed on mouse-2 and \\r, BODY is executed with `map' bound."
+(defmacro dape--buffer-map (name fn &rest bindings)
+  "Helper macro to create a keymap named NAME for an info buffer.
+FN is bound to RET, mouse 2 and BINDINGS is a plist of (KEY FN) pairs
+which is bound on map."
   (declare (indent defun))
   `(defvar ,name
      (let ((map (make-sparse-keymap)))
        (define-key map "\r" #',fn)
        (define-key map [mouse-2] #',fn)
        (define-key map [follow-link] 'mouse-face)
-       ,@body
+       ,@(cl-loop for (key f) on bindings by 'cddr
+                  collect `(define-key map ,key ,f))
        map)))
 
 (defmacro dape--command-at-line (name properties doc &rest body)
@@ -1286,10 +1288,10 @@ them then executes BODY."
          ,@(mapcar (lambda (property)
                      `(setq ,property (get-text-property (point) ',property)))
                    properties))
-       (if (and ,@properties)
+       (if (or ,@properties)
            (progn
              ,@body)
-         (error "Not recognized as %s line" ',name)))))
+         (user-error "Command `%s' not available at point" ',name)))))
 
 (defun dape--emacs-grab-focus ()
   "If `display-graphic-p' focus Emacs."
@@ -3687,19 +3689,37 @@ buffers get displayed and how they are grouped."
   (revert-buffer)
   (run-hooks 'dape-update-ui-hook))
 
-(dape--command-at-line dape-info-breakpoint-goto (dape--info-breakpoint)
-  "Goto breakpoint at line in dape info buffer."
-  (with-selected-window
-      (display-buffer
-       (or (dape--breakpoint-buffer dape--info-breakpoint)
-           (find-file-noselect (dape--breakpoint-path dape--info-breakpoint)))
-       dape-display-source-buffer-action)
-    (goto-char (point-min))
-    (forward-line (1- (dape--breakpoint-line dape--info-breakpoint)))))
-
-(dape--command-at-line dape-info-breakpoint-delete (dape--info-breakpoint)
-  "Delete breakpoint at line in dape info buffer."
-  (dape--breakpoint-remove dape--info-breakpoint)
+(dape--command-at-line dape-info-breakpoint-dwim (dape--info-breakpoint
+                                                  dape--info-exception)
+  "Toggle exception or goto breakpoint in info buffer."
+  (cond (dape--info-breakpoint
+         (with-selected-window
+             (display-buffer
+              (or (dape--breakpoint-buffer dape--info-breakpoint)
+                  (find-file-noselect (dape--breakpoint-path 
dape--info-breakpoint)))
+              dape-display-source-buffer-action)
+           (goto-char (point-min))
+           (forward-line (1- (dape--breakpoint-line dape--info-breakpoint)))))
+        (dape--info-exception
+         (plist-put dape--info-exception :enabled
+                    (not (plist-get dape--info-exception :enabled)))
+         (dolist (conn (dape--live-connections))
+           (dape--set-exception-breakpoints conn))
+         (revert-buffer)
+         (run-hooks 'dape-update-ui-hook))))
+
+
+(dape--command-at-line dape-info-breakpoint-delete (dape--info-breakpoint
+                                                    dape--info-data-breakpoint)
+  "Delete breakpoint at line in info buffer."
+  (cond (dape--info-breakpoint
+         (dape--breakpoint-remove dape--info-breakpoint))
+        (dape--info-data-breakpoint
+         (setq dape--data-breakpoints
+               (delq dape--info-data-breakpoint
+                     dape--data-breakpoints))
+         (when-let* ((conn (dape--live-connection 'stopped t)))
+           (dape--with-request (dape--set-data-breakpoints conn)))))
   (revert-buffer)
   (run-hooks 'dape-update-ui-hook))
 
@@ -3719,34 +3739,10 @@ buffers get displayed and how they are grouped."
                           (_ (user-error "Unable to edit breakpoint on line \
 without log or expression breakpoint"))))))
 
-(dape--buffer-map dape-info-breakpoints-line-map dape-info-breakpoint-goto
-  (define-key map "D" #'dape-info-breakpoint-disable)
-  (define-key map "d" #'dape-info-breakpoint-delete)
-  (define-key map "e" #'dape-info-breakpoint-log-edit))
-
-(dape--command-at-line dape-info-data-breakpoint-delete 
(dape--info-data-breakpoint)
-  "Delete data breakpoint at line in info buffer."
-  (setq dape--data-breakpoints
-        (delq dape--info-data-breakpoint
-              dape--data-breakpoints))
-  (when-let* ((conn (dape--live-connection 'stopped t)))
-    (dape--with-request (dape--set-data-breakpoints conn)))
-  (revert-buffer)
-  (run-hooks 'dape-update-ui-hook))
-
-(dape--buffer-map dape-info-data-breakpoints-line-map nil
-  (define-key map "d" #'dape-info-data-breakpoint-delete))
-
-(dape--command-at-line dape-info-exceptions-toggle (dape--info-exception)
-  "Toggle exception at line in dape info buffer."
-  (plist-put dape--info-exception :enabled
-             (not (plist-get dape--info-exception :enabled)))
-  (dolist (conn (dape--live-connections))
-    (dape--set-exception-breakpoints conn))
-  (revert-buffer)
-  (run-hooks 'dape-update-ui-hook))
-
-(dape--buffer-map dape-info-exceptions-line-map dape-info-exceptions-toggle)
+(dape--buffer-map dape-info-breakpoints-mode-map dape-info-breakpoint-dwim
+  "D" #'dape-info-breakpoint-disable
+  "d" #'dape-info-breakpoint-delete
+  "e" #'dape-info-breakpoint-log-edit)
 
 (define-derived-mode dape-info-breakpoints-mode dape-info-parent-mode 
"Breakpoints"
   "Major mode for Dape info breakpoints."
@@ -3771,8 +3767,7 @@ without log or expression breakpoint"))))))
                          (plist-get plist :accessType)
                          (when-let* ((data-id (plist-get plist :dataId)))
                            (format "(%s)" data-id))))
-                (list 'dape--info-data-breakpoint plist
-                      'keymap dape-info-data-breakpoints-line-map)))
+                (list 'dape--info-data-breakpoint plist)))
       (cl-loop for breakpoint in dape--breakpoints
                for line = (dape--breakpoint-line breakpoint)
                for verified-plist = (dape--breakpoint-verified breakpoint)
@@ -3811,7 +3806,6 @@ without log or expression breakpoint"))))))
                   (when-let* ((path (dape--breakpoint-path breakpoint)))
                     (dape--format-file-line path line))))
                 `( dape--info-breakpoint ,breakpoint
-                   keymap ,dape-info-breakpoints-line-map
                    mouse-face highlight
                    help-echo "mouse-2, RET: visit breakpoint"
                    ,@(unless verified-p '(font-lock-face shadow)))))
@@ -3823,7 +3817,6 @@ without log or expression breakpoint"))))))
                       (format "%s" (plist-get exception :label)))
                 (list 'dape--info-exception exception
                       'mouse-face 'highlight
-                      'keymap dape-info-exceptions-line-map
                       'help-echo "mouse-2, RET: toggle exception")))
       (insert (gdb-table-string table " ")))))
 
@@ -3850,7 +3843,7 @@ without log or expression breakpoint"))))))
             (" \\(started\\)"  (1 font-lock-string-face))))
   "Keywords for `dape-info-threads-mode'.")
 
-(dape--buffer-map dape-info-threads-line-map dape-info-select-thread
+(dape--buffer-map dape-info-threads-mode-map dape-info-select-thread
   ;; TODO Add bindings for individual threads.
   )
 
@@ -3946,7 +3939,6 @@ See `dape-request' for expected CB signature."
                  'dape--info-thread thread
                  'dape--selected (eq current-thread thread)
                  'mouse-face 'highlight
-                 'keymap dape-info-threads-line-map
                  'help-echo "mouse-2, RET: select thread")))
          finally do
          (dape--info-update-with
@@ -3985,10 +3977,10 @@ See `dape-request' for expected CB signature."
       (dape-disassemble ref)
     (user-error "No address for frame")))
 
-(dape--buffer-map dape-info-stack-line-map dape-info-stack-select
-  (define-key map "m" #'dape-info-stack-memory)
-  (define-key map "M" #'dape-info-stack-disassemble)
-  (define-key map "D" #'dape-info-stack-disassemble))
+(dape--buffer-map dape-info-stack-mode-map dape-info-stack-select
+  "m" #'dape-info-stack-memory
+  "M" #'dape-info-stack-disassemble
+  "D" #'dape-info-stack-disassemble)
 
 (define-derived-mode dape-info-stack-mode dape-info-parent-mode "Stack"
   "Major mode for Dape info stack."
@@ -4025,7 +4017,6 @@ current buffer with CONN config."
             (list 'dape--info-frame frame
                   'dape--selected (eq current-stack-frame frame)
                   'mouse-face 'highlight
-                  'keymap dape-info-stack-line-map
                   'help-echo "mouse-2, RET: select frame"))
            finally do
            (insert (gdb-table-string table " "))
@@ -4078,7 +4069,7 @@ current buffer with CONN config."
           (pop-to-buffer (marker-buffer marker))
         (user-error "Unable to open module")))))
 
-(dape--buffer-map dape-info-module-line-map dape-info-modules-goto)
+(dape--buffer-map dape-info-module-mode-map dape-info-modules-goto)
 
 (define-derived-mode dape-info-modules-mode dape-info-parent-mode "Modules"
   "Major mode for Dape info modules."
@@ -4108,11 +4099,9 @@ current buffer with CONN config."
                   (when-let* ((address-range (plist-get module :addressRange)))
                     (concat " at " address-range nil))
                   " "))
-                (list
-                 'dape--info-module module
-                 'mouse-face 'highlight
-                 'help-echo (format "mouse-2: goto module")
-                 'keymap dape-info-module-line-map))
+                (list 'dape--info-module module
+                      'mouse-face 'highlight
+                      'help-echo (format "mouse-2: goto module")))
                finally (insert (gdb-table-string table " "))))))
 
 
@@ -4128,7 +4117,7 @@ current buffer with CONN config."
           (pop-to-buffer (marker-buffer marker))
         (user-error "Unable to get source")))))
 
-(dape--buffer-map dape-info-sources-line-map dape-info-sources-goto)
+(dape--buffer-map dape-info-sources-mode-map dape-info-sources-goto)
 
 (define-derived-mode dape-info-sources-mode dape-info-parent-mode "Sources"
   "Major mode for Dape info sources."
@@ -4151,7 +4140,6 @@ current buffer with CONN config."
                 table (list (concat (plist-get source :name) " "))
                 (list 'dape--info-source source
                       'mouse-face 'highlight
-                      'keymap dape-info-sources-line-map
                       'help-echo "mouse-2, RET: goto source"))
                finally (insert (gdb-table-string table " "))))))
 
@@ -4593,8 +4581,7 @@ See `dape--info-buffer-index' for information on INDEX."
     (dape--repl-make-region-string
      (buffer-substring (point-min) (point-max))
      (apply-partially #'dape--repl-info-string mode index)
-     (when (memq mode '(dape-info-watch-mode dape-info-scope-mode))
-       dape-info-variable-map))))
+     (symbol-value (derived-mode-map-name mode)))))
 
 (defun dape--repl-insert-info-buffer (mode &optional index)
   "Insert content of MODE info buffer into repl.

Reply via email to