mirror of
https://github.com/masscollaborationlabs/emacs.git
synced 2025-07-05 19:59:38 +00:00
Make winner restore point in all windows that display a buffer
* lisp/window.el (window--before-delete-windows): New defun. (delete-window, delete-other-windows): Use it. * lisp/winner.el (winner-set): Use marker in 'window-prev-buffers' when available and different than the value returned by 'winner-get-point' (bug#23621).
This commit is contained in:
parent
e195bbd95a
commit
0454bfd331
2 changed files with 50 additions and 2 deletions
|
@ -3706,6 +3706,8 @@ WINDOW must be a valid window and defaults to the selected one.
|
||||||
If the option `window-resize-pixelwise' is non-nil minimize
|
If the option `window-resize-pixelwise' is non-nil minimize
|
||||||
WINDOW pixelwise."
|
WINDOW pixelwise."
|
||||||
(interactive)
|
(interactive)
|
||||||
|
(when switch-to-buffer-preserve-window-point
|
||||||
|
(window--before-delete-windows window))
|
||||||
(setq window (window-normalize-window window))
|
(setq window (window-normalize-window window))
|
||||||
(window-resize
|
(window-resize
|
||||||
window
|
window
|
||||||
|
@ -4043,6 +4045,41 @@ frame can be safely deleted."
|
||||||
(throw 'done t)
|
(throw 'done t)
|
||||||
(setq parent (window-parent parent))))))))
|
(setq parent (window-parent parent))))))))
|
||||||
|
|
||||||
|
;; This function is called by `delete-window' and
|
||||||
|
;; `delete-other-windows' when `switch-to-buffer-preserve-window-point'
|
||||||
|
;; evaluates non-nil: it allows `winner-undo' to restore the
|
||||||
|
;; buffer point from deleted windows (Bug#23621).
|
||||||
|
(defun window--before-delete-windows (&optional window)
|
||||||
|
"Update `window-prev-buffers' before delete a window.
|
||||||
|
Optional arg WINDOW, if non-nil, update WINDOW-START and POS
|
||||||
|
in `window-prev-buffers' for all windows displaying same
|
||||||
|
buffer as WINDOW. Otherwise, update `window-prev-buffers' for
|
||||||
|
all windows.
|
||||||
|
|
||||||
|
The new values for WINDOW-START and POS are those
|
||||||
|
returned by `window-start' and `window-point' respectively.
|
||||||
|
|
||||||
|
This function is called only if `switch-to-buffer-preserve-window-point'
|
||||||
|
evaluates non-nil."
|
||||||
|
(dolist (win (window-list))
|
||||||
|
(let* ((buf (window-buffer (or window win)))
|
||||||
|
(start (window-start win))
|
||||||
|
(pos (window-point win))
|
||||||
|
(entry (assq buf (window-prev-buffers win))))
|
||||||
|
(cond (entry
|
||||||
|
(let ((marker (nth 2 entry)))
|
||||||
|
(unless (= pos marker)
|
||||||
|
(set-marker (nth 1 entry) start buf)
|
||||||
|
(set-marker marker pos buf))))
|
||||||
|
(t
|
||||||
|
(let ((prev-buf (window-prev-buffers win))
|
||||||
|
(start-m (make-marker))
|
||||||
|
(pos-m (make-marker)))
|
||||||
|
(set-marker start-m start buf)
|
||||||
|
(set-marker pos-m pos buf)
|
||||||
|
(push (list buf start-m pos-m) prev-buf)
|
||||||
|
(set-window-prev-buffers win prev-buf)))))))
|
||||||
|
|
||||||
(defun delete-window (&optional window)
|
(defun delete-window (&optional window)
|
||||||
"Delete WINDOW.
|
"Delete WINDOW.
|
||||||
WINDOW must be a valid window and defaults to the selected one.
|
WINDOW must be a valid window and defaults to the selected one.
|
||||||
|
@ -4061,6 +4098,8 @@ argument. Signal an error if WINDOW is either the only window on
|
||||||
its frame, the last non-side window, or part of an atomic window
|
its frame, the last non-side window, or part of an atomic window
|
||||||
that is its frame's root window."
|
that is its frame's root window."
|
||||||
(interactive)
|
(interactive)
|
||||||
|
(when switch-to-buffer-preserve-window-point
|
||||||
|
(window--before-delete-windows))
|
||||||
(setq window (window-normalize-window window))
|
(setq window (window-normalize-window window))
|
||||||
(let* ((frame (window-frame window))
|
(let* ((frame (window-frame window))
|
||||||
(function (window-parameter window 'delete-window))
|
(function (window-parameter window 'delete-window))
|
||||||
|
|
|
@ -297,8 +297,17 @@ You may want to include buffer names such as *Help*, *Apropos*,
|
||||||
;; Restore points
|
;; Restore points
|
||||||
(dolist (win (winner-sorted-window-list))
|
(dolist (win (winner-sorted-window-list))
|
||||||
(unless (and (pop alive)
|
(unless (and (pop alive)
|
||||||
(setf (window-point win)
|
(let* ((buf (window-buffer win))
|
||||||
(winner-get-point (window-buffer win) win))
|
(pos (winner-get-point (window-buffer win) win))
|
||||||
|
(entry (assq buf (window-prev-buffers win))))
|
||||||
|
;; Try to restore point of buffer in the selected
|
||||||
|
;; window (Bug#23621).
|
||||||
|
(let ((marker (nth 2 entry)))
|
||||||
|
(when (and switch-to-buffer-preserve-window-point
|
||||||
|
marker
|
||||||
|
(not (= marker pos)))
|
||||||
|
(setq pos marker))
|
||||||
|
(setf (window-point win) pos)))
|
||||||
(not (member (buffer-name (window-buffer win))
|
(not (member (buffer-name (window-buffer win))
|
||||||
winner-boring-buffers)))
|
winner-boring-buffers)))
|
||||||
(push win xwins))) ; delete this window
|
(push win xwins))) ; delete this window
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue