[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/workroom 1d4c134d60 26/74: Add new command workroom-switch
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/workroom 1d4c134d60 26/74: Add new command workroom-switch-room, some refactoring |
Date: |
Sun, 27 Nov 2022 16:03:26 -0500 (EST) |
branch: elpa/workroom
commit 1d4c134d608056c55c9d55e48711195c61977af4
Author: Akib Azmain Turja <akib@disroot.org>
Commit: Akib Azmain Turja <akib@disroot.org>
Add new command workroom-switch-room, some refactoring
---
README.org | 15 ++--
workroom.el | 281 +++++++++++++++++++++++++++++++++++++-----------------------
2 files changed, 181 insertions(+), 115 deletions(-)
diff --git a/README.org b/README.org
index 9f73cbd41d..d41019e3c0 100644
--- a/README.org
+++ b/README.org
@@ -23,13 +23,14 @@ All the useful commands can be called with following key
sequences:
| Key | Command |
|-----------+-----------------------------|
-| ~C-x x s~ | ~workroom-switch~ |
-| ~C-x x d~ | ~workroom-kill-view~ |
-| ~C-x x D~ | ~workroom-kill~ |
-| ~C-x x r~ | ~workroom-rename-view~ |
-| ~C-x x R~ | ~workroom-rename~ |
-| ~C-x x c~ | ~workroom-clone-view~ |
-| ~C-x x C~ | ~workroom-clone~ |
+| ~C-x x s~ | ~workroom-switch-room~ |
+| ~C-x x S~ | ~workroom-switch-view~ |
+| ~C-x x d~ | ~workroom-kill~ |
+| ~C-x x D~ | ~workroom-kill-view~ |
+| ~C-x x r~ | ~workroom-rename~ |
+| ~C-x x R~ | ~workroom-rename-view~ |
+| ~C-x x c~ | ~workroom-clone~ |
+| ~C-x x C~ | ~workroom-clone-view~ |
| ~C-x x m~ | ~workroom-bookmark~ |
| ~C-x x M~ | ~workroom-bookmark-all~ |
| ~C-x x b~ | ~workroom-switch-to-buffer~ |
diff --git a/workroom.el b/workroom.el
index 5f747d69f9..6d755d2ee0 100644
--- a/workroom.el
+++ b/workroom.el
@@ -48,13 +48,14 @@
;; Key Command
;; --------------------------------------
-;; C-x x s `workroom-switch'
-;; C-x x d `workroom-kill-view'
-;; C-x x D `workroom-kill'
-;; C-x x r `workroom-rename-view'
-;; C-x x R `workroom-rename'
-;; C-x x c `workroom-clone-view'
-;; C-x x C `workroom-clone'
+;; C-x x s `workroom-switch-room'
+;; C-x x S `workroom-switch-view'
+;; C-x x d `workroom-kill'
+;; C-x x D `workroom-kill-view'
+;; C-x x r `workroom-rename'
+;; C-x x R `workroom-rename-view'
+;; C-x x c `workroom-clone'
+;; C-x x C `workroom-clone-view'
;; C-x x m `workroom-bookmark'
;; C-x x M `workroom-bookmark-all'
;; C-x x b `workroom-switch-to-buffer'
@@ -150,29 +151,36 @@ value can't restored."
The value is a mode line terminal like `mode-line-format'."
:type 'sexp)
-(defvar workroom-switch-hook nil
- "Normal hook run after switching room or view.")
+(defcustom workroom-switch-hook nil
+ "Normal hook run after switching room or view."
+ :type 'hook)
-(defvar workroom-kill-room-hook nil
- "Normal hook run after killing a room.")
+(defcustom workroom-kill-room-hook nil
+ "Normal hook run after killing a room."
+ :type 'hook)
-(defvar workroom-kill-view-hook nil
- "Normal hook run after killing a view.")
+(defcustom workroom-kill-view-hook nil
+ "Normal hook run after killing a view."
+ :type 'hook)
-(defvar workroom-rename-room-hook nil
- "Normal hook run after renaming a room.")
+(defcustom workroom-rename-room-hook nil
+ "Normal hook run after renaming a room."
+ :type 'hook)
-(defvar workroom-rename-view-hook nil
- "Normal hook run after renaming a view.")
+(defcustom workroom-rename-view-hook nil
+ "Normal hook run after renaming a view."
+ :type 'hook)
-(defvar workroom-buffer-list-change-hook nil
- "Normal hook run after changing the buffer list of a workroom.")
+(defcustom workroom-buffer-list-change-hook nil
+ "Normal hook run after changing the buffer list of a workroom."
+ :type 'hook)
(cl-defstruct workroom
"Structure for workroom."
(name nil :documentation "Name of the workroom." :type string)
(views nil :documentation "Views of the workroom." :type list)
(buffers nil :documentation "Buffers of the workroom.")
+ (selected-view nil :documentation "The last selected view.")
(default-p
nil
:documentation "Whether the workroom is the default one.")
@@ -192,9 +200,6 @@ The value is a mode line terminal like `mode-line-format'."
(defalias 'workroomp #'workroom-p)
-(defvar workroom--default-view-of-default-room "main"
- "Name of default view of default workroom.")
-
(defvar workroom--rooms nil
"List of currently live workrooms.")
@@ -212,13 +217,14 @@ 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.
- (define-key keymap "s" #'workroom-switch)
- (define-key keymap "d" #'workroom-kill-view)
- (define-key keymap "D" #'workroom-kill)
- (define-key keymap "r" #'workroom-rename-view)
- (define-key keymap "R" #'workroom-rename)
- (define-key keymap "c" #'workroom-clone-view)
- (define-key keymap "C" #'workroom-clone)
+ (define-key keymap "s" #'workroom-switch-room)
+ (define-key keymap "S" #'workroom-switch-view)
+ (define-key keymap "d" #'workroom-kill)
+ (define-key keymap "D" #'workroom-kill-view)
+ (define-key keymap "r" #'workroom-rename)
+ (define-key keymap "R" #'workroom-rename-view)
+ (define-key keymap "c" #'workroom-clone)
+ (define-key keymap "C" #'workroom-clone-view)
(define-key keymap "m" #'workroom-bookmark)
(define-key keymap "M" #'workroom-bookmark-all)
(define-key keymap "b" #'workroom-switch-to-buffer)
@@ -618,43 +624,53 @@ PROMPT, DEF, REQUIRE-MATCH and PREDICATE is same as in
`read-buffer'."
(unless (functionp (workroom-buffers room))
(workroom-remove-buffer (current-buffer) room))))
+(defun workroom--barf-unless-enabled ()
+ "Signal `user-error' unless Workroom-Mode is enabled."
+ (unless workroom-mode
+ (user-error "Workroom mode is not enabled")))
+
(defmacro workroom--require-mode-enable (&rest body)
"Execute BODY if Workroom-Mode is enabled, otherwise signal error."
(declare (indent 0))
- `(if (not workroom-mode)
- (user-error "Workroom mode is not enabled")
+ `(progn
+ (workroom--barf-unless-enabled)
,@body))
;;;###autoload
(defun workroom-bookmark-jump (bookmark)
"Handle BOOKMARK."
- (workroom--require-mode-enable
- (let ((data (alist-get 'data (bookmark-get-bookmark-record
- bookmark))))
- (workroom--restore-rooms data))))
+ (workroom--barf-unless-enabled)
+ (let ((data (alist-get 'data (bookmark-get-bookmark-record
+ bookmark))))
+ (workroom--restore-rooms data)))
(defun workroom--init-frame (frame)
"Initialize frame FRAME."
(when (and (not (frame-parameter frame 'parent-frame))
(eq (frame-parameter frame 'minibuffer) t))
(with-selected-frame frame
- (workroom-switch (workroom-get-default)
- workroom--default-view-of-default-room)
- (set-frame-parameter nil 'workroom-previous-room-list
- (cdr
- (frame-parameter
- nil 'workroom-previous-room-list))))))
+ (workroom-switch
+ (workroom-get-default) workroom-default-view-name
+ ;; TODO: Do we really need `no-record'?
+ ;; (workroom-current-room) should be nil, so nothing should be
+ ;; in the history even if we don't pass this argument.
+ 'no-record))))
-(defun workroom-switch (room view)
- "Switch to view VIEW of workroom ROOM.
+(defun workroom-switch (room view &optional no-record)
+ "Switch to view VIEW in workroom ROOM.
If called interactively, prompt for view to switch. If prefix
argument is given, ask for workroom to switch before.
-ROOM may be a `workroom' object or string. If ROOM is a `workroom'
-object, switch to that workroom. If ROOM is a string, create a
-workroom with that name if it doesn't exist, then switch to the
-workroom."
+ROOM is should be workroom object, or a name of a workroom object.
+VIEW is should be a view object, or a name of a view object. VIEW
+should be in the workroom ROOM.
+
+ROOM defaults to the current workroom, and VIEW defaults to the last
+selected view of ROOM.
+
+When the optional argument NO-RECORD is non-nil, don't record the
+switch."
(interactive
(workroom--require-mode-enable
(let ((room
@@ -664,17 +680,17 @@ workroom."
(cond
((and (eq (car (workroom-previous-room-list))
(workroom-current-room))
- (< 1 (length (workroom-previous-room-list))))
+ (> (length (workroom-previous-room-list)) 1))
(workroom-name
(cadr (workroom-previous-room-list))))
((car (workroom-previous-room-list))
(workroom-name
(car (workroom-previous-room-list))))))
(workroom-current-room))))
- (when (and (stringp room) (string-empty-p room))
- (setq room workroom-default-room-name))
(when (stringp room)
- (setq room (workroom-get-create room)))
+ (setq room (if (string-empty-p room)
+ (workroom-get-default)
+ (workroom-get-create room))))
(let ((view
(workroom--read-view-to-switch
room "Switch to view"
@@ -682,89 +698,134 @@ workroom."
((and
(eq (car (workroom-previous-view-list room))
(workroom-current-view))
- (< 1 (length (workroom-previous-view-list room))))
- (workroom-name
+ (> (length (workroom-previous-view-list room)) 1))
+ (workroom-view-name
(cadr (workroom-previous-view-list room))))
((car (workroom-previous-view-list room))
- (workroom-name
+ (workroom-view-name
(car (workroom-previous-view-list room))))))))
(when (and (stringp view) (string-empty-p view))
(setq view workroom-default-view-name))
(list room view)))))
- (when (stringp room)
- (setq room (workroom-get-create room)))
- (when (stringp view)
- (setq view (workroom-view-get-create room view)))
+ (workroom--barf-unless-enabled)
+ (setq room (if (stringp room)
+ (workroom-get-create room)
+ (or room (workroom-current-room))))
+ (setq view (if (stringp view)
+ (workroom-view-get-create room view)
+ (or view (workroom-selected-view room)
+ (workroom-view-get-create
+ room workroom-default-view-name))))
(unless (eq room (workroom-current-room))
- (when (workroom-current-room)
- (set-frame-parameter
- nil 'workroom-previous-room-list
- (cons (workroom-current-room)
- (frame-parameter nil 'workroom-previous-room-list))))
+ (when (and (not no-record) (workroom-current-room))
+ (push (workroom-current-room)
+ (frame-parameter nil 'workroom-previous-room-list)))
(set-frame-parameter nil 'workroom-current-room room))
(unless (eq view (workroom-current-view))
(when (workroom-current-view)
(setf (workroom-view-window-config (workroom-current-view))
- (workroom--save-window-config)))
+ (workroom--save-window-config))
+ (unless no-record
+ (push (workroom-current-view)
+ (workroom-previous-view-list room))))
+ (setf (workroom-selected-view room) view)
(set-frame-parameter nil 'workroom-current-view view)
(workroom--load-window-config (workroom-view-window-config view))
(run-hooks 'workroom-switch-hook)))
+(defalias 'workroom-switch-view #'workroom-switch)
+
+(defun workroom-switch-room (room)
+ "Switch to workroom ROOM.
+
+ROOM is should be workroom object, or a name of a workroom object."
+ (interactive
+ (workroom--require-mode-enable
+ `(,(workroom--read-to-switch
+ "Switch to workroom"
+ (cond
+ ((and (eq (car (workroom-previous-room-list))
+ (workroom-current-room))
+ (> (length (workroom-previous-room-list)) 1))
+ (workroom-name (cadr (workroom-previous-room-list))))
+ ((car (workroom-previous-room-list))
+ (workroom-name (car (workroom-previous-room-list)))))))))
+ (workroom-switch room nil))
+
(defun workroom-kill (room)
- "Kill workroom ROOM."
+ "Kill workroom ROOM.
+
+ROOM is should be workroom object, or a name of a workroom object."
(interactive
(workroom--require-mode-enable
(list
- (workroom--read
- "Kill workroom" (workroom-name (workroom-current-room))
- t (lambda (cand)
- (not
- (workroom-default-p
- (workroom-get (if (consp cand) (car cand) cand)))))))))
- (when (stringp room)
- (setq room (workroom-get room)))
- (when room
- (when (workroom-default-p room)
- (error "Cannot kill default workroom"))
- (when (eq room (workroom-current-room))
- (workroom-switch (workroom-get-default)
- workroom--default-view-of-default-room))
- (setq workroom--rooms (delete room workroom--rooms))
- (run-hooks 'workroom-kill-room-hook)))
+ (workroom-get
+ (workroom--read
+ "Kill workroom" (workroom-name (workroom-current-room))
+ t (lambda (cand)
+ (not
+ (workroom-default-p
+ (workroom-get (if (consp cand) (car cand) cand))))))))))
+ (workroom--barf-unless-enabled)
+ (when (workroom-default-p room)
+ (error "Cannot kill default workroom"))
+ (when (eq room (workroom-current-room))
+ (workroom-switch (workroom-get-default)
+ (workroom-view-get-create
+ (workroom-get-default)
+ workroom-default-view-name)))
+ (setq workroom--rooms (delete room workroom--rooms))
+ (dolist (frame (frame-list))
+ (setf (frame-parameter frame 'workroom-previous-room-list)
+ (delete room (frame-parameter
+ frame 'workroom-previous-room-list))))
+ (run-hooks 'workroom-kill-room-hook))
(defun workroom-kill-view (room view)
- "Kill view VIEW of workroom ROOM."
+ "Kill view VIEW of workroom ROOM.
+
+VIEW is should be a view object, or a name of a view object. VIEW
+should be in the workroom ROOM."
(interactive
(workroom--require-mode-enable
- (let ((room
- (if current-prefix-arg
- (workroom-get
- (workroom--read
- "Kill view of workroom"
- (workroom-name (workroom-current-room)) t))
- (workroom-current-room))))
- (when (eq (length (workroom-views room)) 1)
- (user-error "Cannot kill the last view of a workroom"))
+ (let ((room (if current-prefix-arg
+ (workroom-get
+ (workroom--read
+ "Kill view of workroom"
+ (workroom-name (workroom-current-room)) t))
+ (workroom-current-room))))
(list room
- (workroom--read-view
- room "Kill view"
- (when (eq room (workroom-current-room))
- (workroom-view-name (workroom-current-view))))))))
+ (workroom-view-get-create
+ room
+ (workroom--read-view
+ room "Kill view"
+ (when (eq room (workroom-current-room))
+ (workroom-view-name (workroom-current-view)))))))))
+ (workroom--barf-unless-enabled)
(when (stringp room)
(setq room (workroom-get room)))
(when (stringp view)
(setq view (workroom-view-get room view)))
(when (and room view)
- (when (eq (length (workroom-views room)) 1)
- (error "Cannot kill the last view of a workroom"))
(when (eq view (workroom-current-view))
- (workroom-switch room (car (workroom-views room)))
+ (workroom-switch
+ room
+ (let ((views (workroom-views room))
+ (vi nil))
+ (while (and (not vi) views)
+ (let ((v (pop views)))
+ (unless (eq v view)
+ (setq vi (car views)))))
+ (or vi (workroom-view-get-create
+ room workroom-default-view-name))))
(pop (workroom-previous-view-list room)))
(setf (workroom-views room) (delete view (workroom-views room)))
(run-hooks 'workroom-kill-view-hook)))
(defun workroom-rename (room new-name)
- "Rename workroom ROOM to NEW-NAME."
+ "Rename workroom ROOM to NEW-NAME.
+
+ROOM is should be workroom object, or a name of a workroom object."
(interactive
(workroom--require-mode-enable
(let ((room
@@ -777,6 +838,7 @@ workroom."
cand))))))))
(list room (read-string (format-message
"Rename workroom `%s' to: " room))))))
+ (workroom--barf-unless-enabled)
(when (stringp room)
(setq room (workroom-get room)))
(setf (workroom-name room) new-name)
@@ -804,6 +866,7 @@ workroom."
(read-string (format-message
"Rename view `%s' of workroom `%s' to: "
view (workroom-name room)))))))
+ (workroom--barf-unless-enabled)
(when (stringp room)
(setq room (workroom-get room)))
(when (stringp view)
@@ -824,6 +887,7 @@ workroom."
(car cand)
cand)))))))))
(list room (read-string "Name of cloned workroom: ")))))
+ (workroom--barf-unless-enabled)
(when (stringp room)
(setq room (workroom-get room)))
(let ((clone (make-workroom :name name
@@ -852,6 +916,7 @@ workroom."
(workroom-view-name (workroom-current-view)))
t)))
(list room view (read-string "Name of cloned view: ")))))
+ (workroom--barf-unless-enabled)
(when (stringp room)
(setq room (workroom-get room)))
(when (stringp view)
@@ -902,11 +967,11 @@ previous bookmark with the same name."
(setf (workroom-view-window-config (workroom-current-view))
(workroom--save-window-config)))))
(bookmark-store name
- `((data . (workroom-set . ,(mapcar
- #'workroom--encode
- (remove
- (workroom-get-default)
- workroom--rooms))))
+ `((data . (workroom-set
+ ,@(mapcar #'workroom--encode
+ (remove
+ (workroom-get-default)
+ workroom--rooms))))
(handler . workroom-bookmark-jump))
no-overwrite))
@@ -989,10 +1054,11 @@ workroom while selecting buffer by setting `read-buffer'
function to
`(defun ,(intern (format "workroom-%S" fn)) ()
,(format "Like `%S' but restricted to current workroom.
-When prefix arg is given, don't restrict." fn)
+When prefix arg is given or Workroom-Mode is disabled, don't
+restrict." fn)
(declare (interactive-only ,(format "Use `%S' instead." fn)))
(interactive)
- (if current-prefix-arg
+ (if (or current-prefix-arg (not workroom-mode))
(call-interactively #',fn)
(let ((read-buffer-function #'workroom-read-buffer-function))
(call-interactively #',fn)))))
@@ -1059,8 +1125,7 @@ When prefix arg is given, don't restrict." fn)
\"Restore workrooms.\"
(remove-hook 'desktop-after-read-hook
#'workroom--desktop-restore-%s)
- (when (require 'workroom nil t)
- (workroom-mode +1)
+ (when (bound-and-true-p workroom-mode)
(workroom--restore-rooms '%S)))
(add-hook 'desktop-after-read-hook #'workroom--desktop-restore-%s)
"
- [nongnu] elpa/workroom 4c4fd7830c 34/74: Add Winner integration, (continued)
- [nongnu] elpa/workroom 4c4fd7830c 34/74: Add Winner integration, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom e7dc14236e 42/74: Fix out of sync documentation, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom 3144324e33 39/74: Add an user manual, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom 40acb8c7b8 45/74: O(n) switch-to-buffer instead of O(n^2) in project workrooms, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom 13e648f3db 74/74: Add .dir-locals.el, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom add6fb080d 61/74: Bump version to 2.1.1, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom 9974fb58a9 41/74: Add new command workroom-bookmark-multiple, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom a87110f435 56/74: Clone views correctly, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom f9d88f211c 68/74: Bump version to 2.2.2, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom eef13afbbf 66/74: Bump version to 2.2.1, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom 1d4c134d60 26/74: Add new command workroom-switch-room, some refactoring,
ELPA Syncer <=
- [nongnu] elpa/workroom 497c04d666 15/74: Make lighter customizable, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom b28aae7a13 40/74: Add chapter "Project Integration" to manual, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom 98d1158ef0 36/74: Fix key binding of "C-d" in command map, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom 8e805c716e 51/74: Bump version to 2.0.2, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom 64da63c1a9 67/74: Add Compat dependency, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom bb74cce814 60/74: Fix error when a frame is killed, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom 1a0dd6b17d 65/74: Use format-prompt to format minibuffer prompts, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom fe38dc8aea 63/74: Bump version to 2.2, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom a82287cd5b 06/74: Add support for dynamic buffer list, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom c38489669e 18/74: Fix the defaults of workroom-switch, ELPA Syncer, 2022/11/27