aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew White <mehw.is.me@inventati.org>2021-08-27 01:35:43 +0000
committerMatthew White <mehw.is.me@inventati.org>2021-10-21 01:27:37 +0200
commit7d5cde4ad48980fd0757375480e39b53c03771d4 (patch)
tree08c3863b52eece82ef7d270a79f466d3e52caaf6
parentf89435a1b0e79ba37463a7132f4d8ffaade90b5f (diff)
persp-new: return the existing perspective or create a new one
Do not modify an existing perspective, just return it. If the perspective doesn't exist, create a new one. A perspective's scratch buffer is not re-created, and the list of buffer is preserved as is when the perspective exists.
-rw-r--r--CHANGELOG.md1
-rw-r--r--perspective.el15
2 files changed, 9 insertions, 7 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6f5399e..6e1e163 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -64,6 +64,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
### Fixed
+- `persp-new`: do not recreate existing perspectives. This prevents from resetting perspectives to a state where in the perspective there's only the scratch buffer.
- `persp-reset-windows`: set `switch-to-buffer-preserve-window-point` to `nil` before calling `delete-window`, that up to Emacs 27.2 updates `window-prev-buffers` of all windows, unless the former is turned off.
- `persp-remove-buffer`: force update the `current-buffer` to the current window's buffer due to `with-selected-window` saving/restoring the `current-buffer` when executing it's BODY. This properly updates the `current-buffer` to what should be the real current buffer when burying the current buffer.
- `persp-activate`: force update the `current-buffer` to the current window's buffer due to `make-persp` saving/restoring the `current-buffer` when executing it's BODY. This properly updates the `current-buffer` to what should be the real current buffer when switching to a new perspective.
diff --git a/perspective.el b/perspective.el
index addc909..2ea7ec1 100644
--- a/perspective.el
+++ b/perspective.el
@@ -551,15 +551,16 @@ window-side creating perspectives."
(delete-window))))
(defun persp-new (name)
- "Return a new perspective with name NAME.
+ "Return a perspective named NAME, or create a new one if missing.
The new perspective will start with only an `initial-major-mode'
buffer called \"*scratch* (NAME)\"."
- (make-persp :name name
- (switch-to-buffer (persp-scratch-buffer name))
- (funcall initial-major-mode)
- (when initial-scratch-message
- (insert initial-scratch-message))
- (persp-reset-windows)))
+ (or (gethash name (perspectives-hash))
+ (make-persp :name name
+ (switch-to-buffer (persp-scratch-buffer name))
+ (funcall initial-major-mode)
+ (when initial-scratch-message
+ (insert initial-scratch-message))
+ (persp-reset-windows))))
(defun persp-reactivate-buffers (buffers)
"Raise BUFFERS to the top of the most-recently-selected list.