diff options
author | Tino Calancha <f92capac@gmail.com> | 2019-06-25 15:42:17 +0200 |
---|---|---|
committer | Lars Ingebrigtsen <larsi@gnus.org> | 2019-06-25 15:42:17 +0200 |
commit | 0454bfd3313c069ca395f02ab6f377a17ff44965 (patch) | |
tree | 208cb2709d91b7d02c25facdde8cf4c5f23825b4 /lisp/window.el | |
parent | e195bbd95a35a5aeaf3689ff9e9293d350bb4056 (diff) | |
download | emacs-0454bfd3313c069ca395f02ab6f377a17ff44965.tar.gz |
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).
Diffstat (limited to 'lisp/window.el')
-rw-r--r-- | lisp/window.el | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/lisp/window.el b/lisp/window.el index a2335a6798c..726d022dfe9 100644 --- a/lisp/window.el +++ b/lisp/window.el @@ -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 WINDOW pixelwise." (interactive) + (when switch-to-buffer-preserve-window-point + (window--before-delete-windows window)) (setq window (window-normalize-window window)) (window-resize window @@ -4043,6 +4045,41 @@ frame can be safely deleted." (throw 'done t) (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) "Delete WINDOW. 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 that is its frame's root window." (interactive) + (when switch-to-buffer-preserve-window-point + (window--before-delete-windows)) (setq window (window-normalize-window window)) (let* ((frame (window-frame window)) (function (window-parameter window 'delete-window)) |