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

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

[nongnu] elpa/workroom 9974fb58a9 41/74: Add new command workroom-bookma


From: ELPA Syncer
Subject: [nongnu] elpa/workroom 9974fb58a9 41/74: Add new command workroom-bookmark-multiple
Date: Sun, 27 Nov 2022 16:03:28 -0500 (EST)

branch: elpa/workroom
commit 9974fb58a949eac1e91e7fcb8daec503dd265771
Author: Akib Azmain Turja <akib@disroot.org>
Commit: Akib Azmain Turja <akib@disroot.org>

    Add new command workroom-bookmark-multiple
---
 README.org    |  1 +
 workroom.el   | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++----
 workroom.texi | 10 +++++++
 3 files changed, 97 insertions(+), 6 deletions(-)

diff --git a/README.org b/README.org
index c8a8f54468..0891224858 100644
--- a/README.org
+++ b/README.org
@@ -55,6 +55,7 @@ All the useful commands can be called with following key 
sequences:
 | ~C-x c c~   | ~workroom-clone~             |
 | ~C-x c C~   | ~workroom-clone-view~        |
 | ~C-x c m~   | ~workroom-bookmark~          |
+| ~C-x c M~   | ~workroom-bookmark-multiple~ |
 | ~C-x c b~   | ~workroom-switch-to-buffer~  |
 | ~C-x c a~   | ~workroom-add-buffer~        |
 | ~C-x c k~   | ~workroom-kill-buffer~       |
diff --git a/workroom.el b/workroom.el
index d4c7241d4c..e392e3018f 100644
--- a/workroom.el
+++ b/workroom.el
@@ -62,6 +62,7 @@
 ;;  `C-x c c'    `workroom-clone'
 ;;  `C-x c C'    `workroom-clone-view'
 ;;  `C-x c m'    `workroom-bookmark'
+;;  `C-x c M'    `workroom-bookmark-multiple'
 ;;  `C-x c b'    `workroom-switch-to-buffer'
 ;;  `C-x c a'    `workroom-add-buffer'
 ;;  `C-x c k'    `workroom-kill-buffer'
@@ -196,7 +197,7 @@ The value is a mode line terminal like `mode-line-format'."
 
 (defvar workroom-command-map
   (let ((keymap (make-sparse-keymap)))
-    ;; NOTE: Be sure to keep commentary and README up to date.
+    ;; NOTE: Be sure to keep the commentary and README up to date.
     (define-key keymap (kbd "s") #'workroom-switch)
     (define-key keymap (kbd "S") #'workroom-switch-view)
     (define-key keymap (kbd "d") #'workroom-kill)
@@ -207,6 +208,7 @@ The value is a mode line terminal like `mode-line-format'."
     (define-key keymap (kbd "c") #'workroom-clone)
     (define-key keymap (kbd "C") #'workroom-clone-view)
     (define-key keymap (kbd "m") #'workroom-bookmark)
+    (define-key keymap (kbd "M") #'workroom-bookmark-multiple)
     (define-key keymap (kbd "b") #'workroom-switch-to-buffer)
     (define-key keymap (kbd "a") #'workroom-add-buffer)
     (define-key keymap (kbd "k") #'workroom-kill-buffer)
@@ -562,6 +564,21 @@ See `workroom--read' for PROMPT, DEF, REQUIRE-MATCH and 
PREDICATE."
                       (if (consp cand) (car cand) cand)))
           (or (not predicate) (funcall predicate cand))))))
 
+(defun workroom--read-multiple ( prompt &optional def require-match
+                                 predicate)
+  "Read the name of some workrooms and return it as a list of strings.
+
+Prompt with PROMPT, where PROMPT should be a string without trailing
+colon and/or space.
+
+Return DEF when input is empty, where DEF is either a string or nil.
+
+REQUIRE-MATCH and PREDICATE is same as in `completing-read-multiple'."
+  (completing-read-multiple
+   (concat prompt (when def (format " (default %s)" def)) ": ")
+   (mapcar #'workroom-name workroom--rooms) predicate require-match
+   nil 'workroom-room-history def))
+
 (defun workroom--read-view ( room prompt &optional def require-match
                              predicate)
   "Read the name of a view of ROOM and return it as a string.
@@ -1580,14 +1597,12 @@ when ROOM was encoded."
 (defun workroom-bookmark (room name no-overwrite)
   "Save workroom ROOM to a bookmark named NAME.
 
+ROOM can be a workroom, or a name of a workroom.
+
 If NO-OVERWRITE is nil or prefix argument is given, don't overwrite
 any previous bookmark with the same name."
   (interactive
-   (list (workroom--read
-          "Bookmark workroom" nil t
-          (lambda (cand)
-            (not (equal (workroom-name (workroom-get-default))
-                        (if (consp cand) (car cand) cand)))))
+   (list (workroom--read "Bookmark workroom" nil t)
          (workroom--read-bookmark "Save to bookmark: ")
          current-prefix-arg))
   (workroom--barf-unless-enabled)
@@ -1607,6 +1622,71 @@ any previous bookmark with the same name."
           (handler . workroom-bookmark-jump-to-room))
    no-overwrite))
 
+;;;###autoload
+(defun workroom-bookmark-jump-to-room-set (bookmark)
+  "Restore the workroom set in bookmark BOOKMARK."
+  (workroom--barf-unless-enabled)
+  (let ((data (cdr (alist-get 'data (bookmark-get-bookmark-record
+                                     bookmark)))))
+    (pcase (plist-get data :version)
+      (1
+       (let* ((buffers (cl-delete-if
+                        #'null
+                        (workroom--decode-buffers
+                         (plist-get data :buffers)))))
+         (dolist (wr (plist-get data :rooms))
+           (let ((buffer-list (cl-delete-if
+                               #'null
+                               (mapcar (lambda (name)
+                                         (alist-get name buffers))
+                                       (plist-get wr :buffers)))))
+             (push (workroom--decode-room-1 (plist-get wr :room)
+                                            buffer-list)
+                   workroom--rooms)))))
+      (version
+       (error "Unsuppported bookmark version %i" version))))
+  (set-buffer (window-buffer)))
+
+(defun workroom-bookmark-multiple (rooms name no-overwrite)
+  "Save the workrooms ROOMS to a bookmark named NAME.
+
+If NO-OVERWRITE is nil or prefix argument is given, don't overwrite
+any previous bookmark with the same name."
+  (interactive
+   (list (workroom--read-multiple "Bookmark workrooms" nil t)
+         (workroom--read-bookmark "Save to bookmark: ")
+         current-prefix-arg))
+  (workroom--barf-unless-enabled)
+  (let ((wrs rooms))
+    (while wrs
+      (setf (car wrs)
+            (if (stringp (car wrs))
+                (or (workroom-get (car wrs))
+                    (signal 'wrong-type-argument
+                            `(workroom-live-p . ,(car wrs))))
+              (car wrs)))
+      (unless (workroom-live-p (car wrs))
+        (signal 'wrong-type-argument `(workroom-live-p . ,(car wrs))))
+      (pop wrs)))
+  (bookmark-store
+   name
+   `((data . (workroom-set
+              :version 1
+              :rooms ,(mapcar
+                       (lambda (wr)
+                         `( :room ,(workroom--encode-room-1 wr)
+                            :buffers ,(mapcar
+                                       #'buffer-name
+                                       (workroom-buffer-list wr))))
+                       rooms)
+              :buffers ,(workroom--encode-buffers
+                         (cl-remove-duplicates
+                          (apply #'append
+                                 (mapcar #'workroom-buffer-list
+                                         rooms))))))
+     (handler . workroom-bookmark-jump-to-room-set))
+   no-overwrite))
+
 
 ;;;; Desktop Integration.
 
diff --git a/workroom.texi b/workroom.texi
index b35cc4c11d..c97487663b 100644
--- a/workroom.texi
+++ b/workroom.texi
@@ -545,6 +545,16 @@ workroom to bookmark, then you'll prompted for the name of 
the
 bookmark.  Then you can just use the standard bookmark commands to
 with the bookmark to restore the bookmark.
 
+@findex workroom-bookmark-multiple
+@kindex C-x c m
+@kindex m (command map)
+@kindex command map, m
+You can also bookmark multiple workroom together in a single bookmark.
+You can use the command @command{workroom-bookmark-multiple} to
+bookmark several workrooms.  It is bound to @kbd{C-x c M} by default.
+It is similar to @command{workroom-bookmark}, but it'll ask you for a
+comma separated workroom list instead.
+
 @node Project Integration
 @cindex project integration
 @cindex integration, project



reply via email to

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