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

    Add edit watch buffer mode `dape-info-watch-edit-mode'
    
    Analog to wdired-mode
---
 dape.el | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 52 insertions(+), 4 deletions(-)

diff --git a/dape.el b/dape.el
index 592c5f5bee..3df3e7f4ae 100644
--- a/dape.el
+++ b/dape.el
@@ -3053,7 +3053,7 @@ Used there as scope index.")
 (defun dape--info-buffer-p (mode &optional identifier)
   "Is buffer of MODE with IDENTIFIER.
 Uses `dape--info-buffer-identifier' as IDENTIFIER."
-  (and (eq major-mode mode)
+  (and (derived-mode-p mode)
        (or (not identifier)
            (equal dape--info-buffer-identifier identifier))))
 
@@ -3224,7 +3224,7 @@ displayed."
           (unless (seq-find (lambda (buffer)
                               (and (get-buffer-window buffer)
                                    (with-current-buffer buffer
-                                     (memq major-mode group))))
+                                     (derived-mode-p group))))
                             (dape--info-buffer-list))
             (setq buffer-displayed-p t)
             (dape--display-buffer
@@ -3255,7 +3255,7 @@ displayed."
   "Store related buffers in `dape--info-buffer-related'."
   (setq dape--info-buffer-related
         (cl-loop with group =
-                 (cl-find-if (lambda (group) (memq major-mode group))
+                 (cl-find-if 'derived-mode-p
                              dape-info-buffer-window-groups)
                  with conn = (dape--live-connection 'stopped t)
                  with scopes = (plist-get (dape--current-stack-frame conn)
@@ -3920,7 +3920,10 @@ plist are used as keymap for each sections defined by 
the key."
 
 ;;; Info watch buffer
 
-(defvar dape-info-watch-mode-map (copy-keymap dape-info-scope-mode-map)
+(defvar dape-info-watch-mode-map
+  (let ((map (copy-keymap dape-info-scope-mode-map)))
+    (define-key map "\C-x\C-q" 'dape-info-watch-edit-mode)
+    map)
   "Local keymap for dape watch buffer.")
 
 (define-derived-mode dape-info-watch-mode dape-info-parent-mode "Watch"
@@ -3983,6 +3986,51 @@ plist are used as keymap for each sections defined by 
the key."
                                                       'prefix 
dape-info-variable-prefix-map))
                  finally (insert (gdb-table-string table " "))))))))
 
+(defvar dape--info-watch-edit-font-lock-keywords
+  '(("\\(.+\\)"  (1 font-lock-variable-name-face))))
+
+(defvar dape-info-watch-edit-mode-map
+  (let ((map (make-sparse-keymap)))
+    (set-keymap-parent map text-mode-map)
+    (define-key map "\C-c\C-c" 'dape-info-watch-finish-edit)
+    (define-key map "\C-c\C-k" 'dape-info-watch-abort-changes)
+    map)
+  "Local keymap for dape watch buffer in edit mode.")
+
+(define-derived-mode dape-info-watch-edit-mode dape-info-watch-mode "Watch 
Edit"
+  "Major mode for editing watch info."
+  (set-buffer-modified-p nil)
+  (setq revert-buffer-function #'dape--info-revert)
+  (revert-buffer)
+  (setq buffer-undo-list nil
+        buffer-read-only nil
+        font-lock-defaults '(dape--info-watch-edit-font-lock-keywords))
+  (message "%s" (substitute-command-keys
+                "Press \\[dape-info-watch-finish-edit] when finished \
+or \\[dape-info-watch-abort-changes] to abort changes")))
+
+(cl-defmethod dape--info-revert (&context (major-mode (eql 
dape-info-watch-edit-mode))
+                                          &optional _ignore-auto _noconfirm 
_preserve-modes)
+  "Revert buffer function for MAJOR-MODE `dape-info-watch-edit-mode'."
+  (dape--info-update-with
+    (cl-loop for watch in dape--watched
+             for name = (plist-get watch :name)
+             do (insert "  " name "\n"))))
+
+(defun dape-info-watch-abort-changes ()
+  "Abort changes and return to `dape-info-watch-mode'."
+  (interactive)
+  (dape-info-watch-mode)
+  (revert-buffer))
+
+(defun dape-info-watch-finish-edit ()
+  "Update watched variables and return to `dape-info-watch-mode'."
+  (interactive)
+  (setq dape--watched
+        (mapcar (lambda (name) (list :name name))
+                (split-string (buffer-string))))
+  (dape-info-watch-abort-changes))
+
 
 ;;; REPL buffer
 

Reply via email to