emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/dape 22b83f8b12 1/4: Add dape buffer window customizati


From: ELPA Syncer
Subject: [elpa] externals/dape 22b83f8b12 1/4: Add dape buffer window customization dape-info-buffer-window-groups
Date: Tue, 27 Feb 2024 12:58:15 -0500 (EST)

branch: externals/dape
commit 22b83f8b12f9ef7d86a7c675efd38a13c1309231
Author: Daniel Pettersson <daniel@dpettersson.net>
Commit: Daniel Pettersson <daniel@dpettersson.net>

    Add dape buffer window customization dape-info-buffer-window-groups
---
 dape.el | 229 +++++++++++++++++++++++++++++++---------------------------------
 1 file changed, 110 insertions(+), 119 deletions(-)

diff --git a/dape.el b/dape.el
index 549b7332a7..5a2a47bc0f 100644
--- a/dape.el
+++ b/dape.el
@@ -429,6 +429,16 @@ Each element should look like (MIME-TYPE . MODE) where
                  (const :tag "Left side" left)
                  (const :tag "Right side" right)))
 
+(defcustom dape-info-buffer-window-groups
+  '((dape-info-scope-mode dape-info-watch-mode)
+    (dape-info-stack-mode dape-info-modules-mode dape-info-sources-mode)
+    (dape-info-breakpoints-mode dape-info-threads-mode))
+  "Window display rules for `dape-info-parent-mode' derived modes.
+Each list of modes is displayed in the same window.  The first item of
+each group is displayed by `dape-info'.  All modes doesn't need to be
+present in an group."
+  :type '(repeat (repeat function)))
+
 (defcustom dape-stepping-granularity 'line
   "The granularity of one step in the stepping requests."
   :type '(choice (const :tag "Step statement" statement)
@@ -937,34 +947,31 @@ On SKIP-PROCESS-BUFFERS skip deletion of buffers which 
has processes."
   "Display BUFFER according to `dape-buffer-window-arrangement'."
   (display-buffer
    buffer
-   (let ((mode (with-current-buffer buffer major-mode)))
+   (let* ((mode (with-current-buffer buffer major-mode))
+          (group (cl-position-if (lambda (group) (memq mode group))
+                                 dape-info-buffer-window-groups)))
      (pcase dape-buffer-window-arrangement
        ((or 'left 'right)
         (cons '(display-buffer-in-side-window)
-              (pcase mode
-                ('dape-repl-mode '((side . bottom) (slot . -1)))
-                ('shell-mode '((side . bottom) (slot . 0)))
-                ((or 'dape-info-scope-mode 'dape-info-watch-mode)
-                 `((side . ,dape-buffer-window-arrangement) (slot . -1)))
-                ((or 'dape-info-stack-mode 'dape-info-modules-mode
-                     'dape-info-sources-mode)
-                 `((side . ,dape-buffer-window-arrangement) (slot . 0)))
-                ((or 'dape-info-breakpoints-mode 'dape-info-threads-mode)
-                 `((side . ,dape-buffer-window-arrangement) (slot . 1)))
-                (_ (error "Unable to display buffer of mode `%s'" mode)))))
+              (pcase (cons mode group)
+                    (`(dape-repl-mode . ,_) '((side . bottom) (slot . -1)))
+                    (`(shell-mode . ,_) '((side . bottom) (slot . 0)))
+                    (`(,_ . 0) `((side . ,dape-buffer-window-arrangement) 
(slot . -1)))
+                    (`(,_ . 1) `((side . ,dape-buffer-window-arrangement) 
(slot . 0)))
+                    (`(,_ . 2) `((side . ,dape-buffer-window-arrangement) 
(slot . 1)))
+                    (_ (error "Unable to display buffer of mode `%s'" mode)))))
        ('gud
-        (pcase mode
-          ('dape-repl-mode
+        (pcase (cons mode group)
+          (`(dape-repl-mode . ,_)
            '((display-buffer-in-side-window) (side . top) (slot . -1)))
-          ('shell-mode
-           '((display-buffer-reuse-window)
-             (display-buffer-pop-up-window) (direction . right) (dedicated . 
t)))
-          ((or 'dape-info-scope-mode 'dape-info-watch-mode)
+          (`(shell-mode . ,_)
+           '((display-buffer-reuse-window) (display-buffer-pop-up-window)
+             (direction . right) (dedicated . t)))
+          (`(,_ . 0)
            '((display-buffer-in-side-window) (side . top) (slot . 0)))
-          ((or 'dape-info-stack-mode 'dape-info-modules-mode
-               'dape-info-sources-mode)
+          (`(,_ . 1)
            '((display-buffer-in-side-window) (side . bottom) (slot . -1)))
-          ((or 'dape-info-breakpoints-mode 'dape-info-threads-mode)
+          (`(,_ . 2)
            '((display-buffer-in-side-window) (side . bottom) (slot . 1)))
           (_ (error "Unable to display buffer of mode `%s'" mode))))
        (_ (user-error "Invalid value of `dape-buffer-window-arrangement'"))))))
@@ -2735,6 +2742,10 @@ REVERSED selects previous."
 (define-derived-mode dape-info-parent-mode special-mode ""
   "Generic mode to derive all other Dape gud buffer modes from."
   :interactive nil
+  ;; Setup header-line without `buffer-revert'
+  :after-hook (progn
+                (dape--info-set-related-buffers)
+                (dape--info-set-header-line-format))
   (setq-local buffer-read-only t
               truncate-lines t
               cursor-in-non-selected-windows nil
@@ -2780,8 +2791,8 @@ Header line is custructed from buffer local
 (defun dape--info-call-update-with (fn &optional buffer)
   "Helper for `dape--info-revert' functions.
 Erase buffer content and updates `header-line-format'.
-FN is expected to update insert buffer contents and
-update `dape--info-buffer-related'."
+FN is expected to update insert buffer contents, update
+`dape--info-buffer-related' and `header-line-format'."
   (setq buffer (or buffer (current-buffer)))
   (with-current-buffer buffer
     (unless (derived-mode-p 'dape-info-parent-mode)
@@ -2800,6 +2811,7 @@ update `dape--info-buffer-related'."
         (ignore-errors
           (goto-char (point-min))
           (forward-line (1- line)))
+        (dape--info-set-related-buffers)
         (dape--info-set-header-line-format))
       (when old-window
         (select-window old-window)))))
@@ -2817,25 +2829,12 @@ See `dape--info-call-update-with'."
                 (dape--info-buffer-p mode identifier)))
             (dape--info-buffer-list)))
 
-(defun dape--info-buffer-name (mode &optional identifier)
-  "Create buffer name from MODE and IDENTIFIER."
-  (format "*dape-info %s*"
-          (pcase mode
-            ('dape-info-breakpoints-mode "Breakpoints")
-            ('dape-info-threads-mode "Threads")
-            ('dape-info-stack-mode "Stack")
-            ('dape-info-modules-mode "Modules")
-            ('dape-info-sources-mode "Sources")
-            ('dape-info-watch-mode "Watch")
-            ;; FIXME If scope is named Scope <%s> there is trouble
-            ('dape-info-scope-mode (format "Scope <%s>" identifier))
-            (_ (error "Unable to create mode from %s with %s" mode 
identifier)))))
-
 (defun dape--info-get-buffer-create (mode &optional identifier)
   "Get or create info buffer with MODE and IDENTIFIER."
-  (let ((buffer
-         (or (dape--info-get-live-buffer mode identifier)
-             (get-buffer-create (dape--info-buffer-name mode identifier)))))
+  (let* ((identifier (or identifier 0))
+         (buffer
+          (or (dape--info-get-live-buffer mode identifier)
+              (get-buffer-create (dape--info-buffer-name mode identifier)))))
     (with-current-buffer buffer
       (unless (eq major-mode mode)
         (funcall mode)
@@ -2855,7 +2854,10 @@ See `dape--info-call-update-with'."
 When called interactively MAYBE-KILL is non nil.
 When optional MAYBE-KILL is non nil kill buffers if all *dape-info*
 buffers are already displayed.
-When optional kill is non nil kill buffers *dape-info* buffers."
+When optional kill is non nil kill buffers *dape-info* buffers.
+
+See `dape-info-buffer-window-groups' to customize which buffers get
+displayed."
   (interactive (list t))
   (cl-labels ((kill-dape-info ()
                 (dolist (buffer (buffer-list))
@@ -2865,49 +2867,71 @@ When optional kill is non nil kill buffers *dape-info* 
buffers."
     (if kill
         (kill-dape-info)
       (let (buffer-displayed-p)
-        ;; Open breakpoints if not group-1 buffer displayed
-        (unless (seq-find (lambda (buffer)
-                            (and (get-buffer-window buffer)
-                                 (with-current-buffer buffer
-                                   (or (dape--info-buffer-p 
'dape-info-breakpoints-mode)
-                                       (dape--info-buffer-p 
'dape-info-threads-mode)))))
-                          (dape--info-buffer-list))
-          (setq buffer-displayed-p t)
-          (dape--display-buffer
-           (dape--info-get-buffer-create 'dape-info-breakpoints-mode)))
-        ;; Open and update stack buffer
-        (unless (seq-find (lambda (buffer)
-                            (and (get-buffer-window buffer)
-                                 (with-current-buffer buffer
-                                   (or (dape--info-buffer-p 
'dape-info-stack-mode)
-                                       (dape--info-buffer-p 
'dape-info-modules-mode)
-                                       (dape--info-buffer-p 
'dape-info-sources-mode)))))
-                          (dape--info-buffer-list))
-          (setq buffer-displayed-p t)
-          (dape--display-buffer
-           (dape--info-get-buffer-create 'dape-info-stack-mode)))
-        ;; Open stack 0 if not group-2 buffer displayed
-        (unless (seq-find (lambda (buffer)
-                            (and (get-buffer-window buffer)
-                                 (with-current-buffer buffer
-                                   (or (dape--info-buffer-p 
'dape-info-scope-mode)
-                                       (dape--info-buffer-p 
'dape-info-watch-mode)))))
-                          (dape--info-buffer-list))
-          (setq buffer-displayed-p t)
-          (dape--display-buffer
-           (dape--info-get-buffer-create 'dape-info-scope-mode 0)))
+        (dolist (group dape-info-buffer-window-groups)
+          (unless (seq-find (lambda (buffer)
+                              (and (get-buffer-window buffer)
+                                   (with-current-buffer buffer
+                                     (memq major-mode group))))
+                            (dape--info-buffer-list))
+            (setq buffer-displayed-p t)
+            (dape--display-buffer
+             (dape--info-get-buffer-create (car group)))))
         (dape-info-update)
         (when (and maybe-kill (not buffer-displayed-p))
           (kill-dape-info))))))
 
+(defconst dape--info-buffer-name-alist
+  '((dape-info-breakpoints-mode . "Breakpoints")
+    (dape-info-threads-mode . "Threads")
+    (dape-info-stack-mode . "Stack")
+    (dape-info-modules-mode . "Modules")
+    (dape-info-sources-mode . "Sources")
+    (dape-info-watch-mode . "Watch"))
+  "Lookup for `dape-info-parent-mode' derived modes names.")
+
+(defun dape--info-buffer-name (mode &optional identifier)
+  "Create buffer name from MODE and IDENTIFIER."
+  (format "*dape-info %s*"
+          (if (eq 'dape-info-scope-mode mode)
+              (format "Scope <%s>" identifier)
+            (if-let ((name (alist-get mode dape--info-buffer-name-alist)))
+                name
+              (error "Unable to create mode from %s with %s" mode 
identifier)))))
+
+(defun dape--info-set-related-buffers ()
+  "Store related buffers "
+  (setq dape--info-buffer-related
+        (cl-loop with group =
+                 (cl-find-if (lambda (group) (memq major-mode group))
+                             dape-info-buffer-window-groups)
+                 with conn = (dape--live-connection 'stopped t)
+                 with scopes = (plist-get (dape--current-stack-frame conn)
+                                          :scopes)
+                 for mode in group
+                 append
+                 (cond
+                  ((and (not scopes) (eq mode 'dape-info-scope-mode))
+                   ;; TODO Should grab `dape--info-buffer-related'
+                   ;;      from other buffers if there are no
+                   ;;      `dape-info-scope-modes' in the current ctx.
+                   ;;      This would fix tabbing into other scopes after
+                   ;;      an adapter has been killed.
+                   (seq-filter (lambda (related)
+                                 (eq (car related) 'dape-info-scope-mode))
+                               dape--info-buffer-related))
+                  ((eq mode 'dape-info-scope-mode)
+                   (cl-loop for scope in scopes
+                            for i from 0
+                            for name = (plist-get scope :name)
+                            collect
+                            (list 'dape-info-scope-mode i name)))
+                  (t
+                   `((,mode nil
+                            ,(alist-get mode 
dape--info-buffer-name-alist))))))))
+
 
 ;;; Info breakpoints buffer
 
-(defconst dape--info-group-1-related
-  '((dape-info-breakpoints-mode nil "Breakpoints")
-    (dape-info-threads-mode nil "Threads"))
-  "Realated buffers in group 1.")
-
 (dape--command-at-line dape-info-breakpoint-goto (dape--info-breakpoint)
   "Goto breakpoint at line in dape info buffer."
   (when-let* ((buffer (overlay-buffer dape--info-breakpoint)))
@@ -2951,8 +2975,7 @@ When optional kill is non nil kill buffers *dape-info* 
buffers."
 (define-derived-mode dape-info-breakpoints-mode dape-info-parent-mode
   "Breakpoints"
   :interactive nil
-  "Major mode for Dape info breakpoints."
-  (setq dape--info-buffer-related dape--info-group-1-related))
+  "Major mode for Dape info breakpoints.")
 
 (cl-defmethod dape--info-revert (&context (major-mode (eql 
dape-info-breakpoints-mode))
                                           &optional _ignore-auto _noconfirm 
_preserve-modes)
@@ -3058,8 +3081,7 @@ See `dape-request' for expected CB signature."
   "Major mode for Dape info threads."
   :interactive nil
   (setq font-lock-defaults '(dape--info-threads-font-lock-keywords)
-        dape--info-thread-position (make-marker)
-        dape--info-buffer-related dape--info-group-1-related)
+        dape--info-thread-position (make-marker))
   (add-to-list 'overlay-arrow-variable-list 'dape--info-thread-position))
 
 
@@ -3140,10 +3162,7 @@ See `dape-request' for expected CB signature."
   "Major mode for Dape info stack."
   :interactive nil
   (setq font-lock-defaults '(dape--info-stack-font-lock-keywords)
-        dape--info-stack-position (make-marker)
-        dape--info-buffer-related '((dape-info-stack-mode nil "Stack")
-                                    (dape-info-modules-mode nil "Modules")
-                                    (dape-info-sources-mode nil "Sources")))
+        dape--info-stack-position (make-marker))
   (add-to-list 'overlay-arrow-variable-list 'dape--info-stack-position))
 
 (defun dape--info-stack-buffer-insert (current-stack-frame stack-frames)
@@ -3233,10 +3252,7 @@ current buffer."
 (define-derived-mode dape-info-modules-mode dape-info-parent-mode "Modules"
   "Major mode for Dape info modules."
   :interactive nil
-  (setq font-lock-defaults '(dape--info-modules-font-lock-keywords)
-        dape--info-buffer-related '((dape-info-stack-mode nil "Stack")
-                                    (dape-info-modules-mode nil "Modules")
-                                    (dape-info-sources-mode nil "Sources"))))
+  (setq font-lock-defaults '(dape--info-modules-font-lock-keywords)))
 
 (cl-defmethod dape--info-revert (&context (major-mode (eql 
dape-info-modules-mode))
                                           &optional _ignore-auto _noconfirm 
_preserve-modes)
@@ -3286,10 +3302,7 @@ current buffer."
 
 (define-derived-mode dape-info-sources-mode dape-info-parent-mode "Sources"
   "Major mode for Dape info sources."
-  :interactive nil
-  (setq dape--info-buffer-related '((dape-info-stack-mode nil "Stack")
-                                    (dape-info-modules-mode nil "Modules")
-                                    (dape-info-sources-mode nil "Sources"))))
+  :interactive nil)
 
 (cl-defmethod dape--info-revert (&context (major-mode (eql 
dape-info-sources-mode))
                                           &optional _ignore-auto _noconfirm 
_preserve-modes)
@@ -3364,16 +3377,6 @@ current buffer."
 
 ;; TODO Add bindings for adding data breakpoint
 
-(defun dape--info-group-2-related-buffers (scopes)
-  (append
-   (cl-loop for scope in scopes
-            for i from 0
-            collect
-            (list 'dape-info-scope-mode i
-                  (string-truncate-left (plist-get scope :name)
-                                        dape-info-header-scope-max-name)))
-   '((dape-info-watch-mode nil "Watch"))))
-
 (defun dape--info-locals-table-columns-list (alist)
   "Format and arrange the columns in locals display based on ALIST."
   ;; Stolen from gdb-mi but reimpleted due to usage of dape customs
@@ -3462,16 +3465,13 @@ plist are used as keymap for each sections defined by 
the key."
 ;; FIXME Empty header line when adapter is killed
 (define-derived-mode dape-info-scope-mode dape-info-parent-mode "Scope"
   "Major mode for Dape info scope."
-  :interactive nil
-  (setq dape--info-buffer-related '((dape-info-watch-mode nil "Watch")))
-  (dape--info-set-header-line-format))
+  :interactive nil)
 
 (cl-defmethod dape--info-revert (&context (major-mode (eql 
dape-info-scope-mode))
                                           &optional _ignore-auto _noconfirm 
_preserve-modes)
   "Revert buffer function for `dape-info-scope-mode'."
   (when-let* ((conn (or (dape--live-connection 'stopped t)
-                        (dape--live-connection 'last t)
-                        dape--connection))
+                        (dape--live-connection 'last t)))
               (frame (dape--current-stack-frame conn))
               (scopes (plist-get frame :scopes))
               ;; FIXME if scope is out of range here scope list could
@@ -3492,9 +3492,7 @@ plist are used as keymap for each sections defined by the 
key."
                                                      dape--info-expanded-p))))
         (when (and scope scopes (dape--stopped-threads conn))
           (dape--info-update-with
-            (rename-buffer (format "*dape-info %s*" (plist-get scope :name)) t)
-            (setq dape--info-buffer-related
-                  (dape--info-group-2-related-buffers scopes))
+            (rename-buffer (format "*dape-info Scope: %s*" (plist-get scope 
:name)) t)
             (cl-loop with table = (make-gdb-table)
                      for object in (plist-get scope :variables)
                      initially (setf (gdb-table-right-align table)
@@ -3517,8 +3515,7 @@ plist are used as keymap for each sections defined by the 
key."
 
 (define-derived-mode dape-info-watch-mode dape-info-parent-mode "Watch"
   "Major mode for Dape info watch."
-  :interactive nil
-  (setq dape--info-buffer-related '((dape-info-watch-mode nil "Watch"))))
+  :interactive nil)
 
 (cl-defmethod dape--info-revert (&context (major-mode (eql 
dape-info-watch-mode))
                                           &optional _ignore-auto _noconfirm 
_preserve-modes)
@@ -3527,13 +3524,10 @@ plist are used as keymap for each sections defined by 
the key."
                    (dape--live-connection 'last t)
                    dape--connection))
          (frame (dape--current-stack-frame conn))
-         (scopes (plist-get frame :scopes))
          (responses 0))
     (cond
      ((not dape--watched)
       (dape--info-update-with
-        (setq dape--info-buffer-related
-              (dape--info-group-2-related-buffers scopes))
         (insert "No watched variable.")))
      ((not (and conn (jsonrpc-running-p conn)))
       (dape--info-update-with
@@ -3571,9 +3565,6 @@ plist are used as keymap for each sections defined by the 
key."
                                                   (gethash (cons (plist-get 
object :name) path)
                                                            
dape--info-expanded-p))))
               (dape--info-update-with
-                (when scopes
-                  (setq dape--info-buffer-related
-                        (dape--info-group-2-related-buffers scopes)))
                 (cl-loop with table = (make-gdb-table)
                          for watch in dape--watched
                          initially (setf (gdb-table-right-align table)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]