aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md5
-rw-r--r--perspective.el30
2 files changed, 35 insertions, 0 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b7cd1e7..c25ea7b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## Unreleased
+### Fixed
+
+- Integrate `winner-mode` state per perspective to prevent `winner-undo` crossing perspectives ([#137](https://github.com/nex3/perspective-el/issues/137)).
+
+
### Added
- `persp-sort`: now supports `'oldest` sorting, which inverts sort order compared to `'created` ([#224](https://github.com/nex3/perspective-el/pull/224)).
diff --git a/perspective.el b/perspective.el
index 811b38c..38f2f89 100644
--- a/perspective.el
+++ b/perspective.el
@@ -387,6 +387,9 @@ Run with the activated perspective active.")
(defvar persp-state-after-load-hook nil
"A hook run immediately after loading persp state from disk.")
+(defvar persp--winner-after-load-registered nil
+ "Non-nil when Winner setup has been registered via `eval-after-load'.")
+
(defvar persp-mode-map (make-sparse-keymap)
"Keymap for perspective-mode.")
@@ -1421,9 +1424,16 @@ named collections of buffers and window configurations."
(add-hook 'ido-make-buffer-list-hook 'persp-set-ido-buffers)
(when persp-avoid-killing-last-buffer-in-perspective
(add-hook 'kill-buffer-query-functions 'persp-maybe-kill-buffer))
+ (add-hook 'persp-created-hook #'persp--winner-reset-on-created -50)
(setq read-buffer-function 'persp-read-buffer)
(mapc 'persp-init-frame (frame-list))
(setf (persp-current-buffers) (buffer-list))
+ ;; Must run after initial perspectives exist, since it relies on
+ ;; `persp-curr' to register variables.
+ (persp--winner-setup)
+ (unless persp--winner-after-load-registered
+ (eval-after-load 'winner '(persp--winner-setup))
+ (setq persp--winner-after-load-registered t))
(unless (or persp-mode-prefix-key persp-suppress-no-prefix-key-warning)
(display-warning
'perspective
@@ -1437,6 +1447,10 @@ named collections of buffers and window configurations."
(remove-hook 'after-make-frame-functions 'persp-init-frame)
(remove-hook 'ido-make-buffer-list-hook 'persp-set-ido-buffers)
(remove-hook 'kill-buffer-query-functions 'persp-maybe-kill-buffer)
+ (remove-hook 'persp-created-hook #'persp--winner-reset-on-created)
+ ;; No cleanup for Winner here: persp-local variables live on perspective
+ ;; structs that are unreachable while `persp-mode' is off, so this avoids
+ ;; surprising global side effects while keeping re-enable behavior correct.
(setq read-buffer-function nil)
(set-frame-parameter nil 'persp--hash nil)
(setq global-mode-string (delete '(:eval (persp-mode-line)) global-mode-string))
@@ -1499,6 +1513,22 @@ from the current perspective at time of creation."
(cl-loop for persp being the hash-values of (perspectives-hash frame)
do (push entry (persp-local-variables persp)))))))
+(defun persp--winner-setup ()
+ "Make Winner state perspective-local when Winner is available."
+ (when (and persp-mode (featurep 'winner)
+ (boundp 'winner-ring-alist)
+ (boundp 'winner-currents))
+ (persp-make-variable-persp-local 'winner-ring-alist)
+ (persp-make-variable-persp-local 'winner-currents)))
+
+(defun persp--winner-reset-on-created ()
+ "Reset Winner state for newly created perspectives."
+ (when (and (featurep 'winner)
+ (boundp 'winner-ring-alist)
+ (boundp 'winner-currents))
+ (setq winner-ring-alist nil
+ winner-currents nil)))
+
(defmacro persp-setup-for (name &rest body)
"Add code that should be run to set up the perspective named NAME.
Whenever a new perspective named NAME is created, runs BODY in