Use next-buffers and prev-buffers in window-state-get and window-state-put

* lisp/window.el (window--state-get-1): Get next-buffers and prev-buffers.
(window--state-put-2): Set next-buffers and prev-buffers.  (Bug#32850)
This commit is contained in:
Juri Linkov 2018-10-17 01:36:33 +03:00
parent 84efc93a55
commit e64065bbbd

View file

@ -5541,6 +5541,10 @@ specific buffers."
(t 'leaf)))
(buffer (window-buffer window))
(selected (eq window (selected-window)))
(next-buffers (when (window-live-p window)
(window-next-buffers window)))
(prev-buffers (when (window-live-p window)
(window-prev-buffers window)))
(head
`(,type
,@(unless (window-next-sibling window) `((last . t)))
@ -5593,7 +5597,22 @@ specific buffers."
(start . ,(if writable
start
(with-current-buffer buffer
(copy-marker start))))))))))
(copy-marker start))))))))
,@(when next-buffers
`((next-buffers . ,(mapcar (lambda (buffer)
(buffer-name buffer))
next-buffers))))
,@(when prev-buffers
`((prev-buffers .
,(mapcar (lambda (entry)
(list (buffer-name (nth 0 entry))
(if writable
(marker-position (nth 1 entry))
(nth 1 entry))
(if writable
(marker-position (nth 2 entry))
(nth 2 entry))))
prev-buffers))))))
(tail
(when (memq type '(vc hc))
(let (list)
@ -5736,7 +5755,9 @@ value can be also stored on disk and read back in a new session."
(let ((window (car item))
(combination-limit (cdr (assq 'combination-limit item)))
(parameters (cdr (assq 'parameters item)))
(state (cdr (assq 'buffer item))))
(state (cdr (assq 'buffer item)))
(next-buffers (cdr (assq 'next-buffers item)))
(prev-buffers (cdr (assq 'prev-buffers item))))
(when combination-limit
(set-window-combination-limit window combination-limit))
;; Reset window's parameters and assign saved ones (we might want
@ -5748,7 +5769,8 @@ value can be also stored on disk and read back in a new session."
(set-window-parameter window (car parameter) (cdr parameter))))
;; Process buffer related state.
(when state
(let ((buffer (get-buffer (car state))))
(let ((buffer (get-buffer (car state)))
(state (cdr state)))
(if buffer
(with-current-buffer buffer
(set-window-buffer window buffer)
@ -5817,7 +5839,30 @@ value can be also stored on disk and read back in a new session."
(set-window-point window (cdr (assq 'point state))))
;; Select window if it's the selected one.
(when (cdr (assq 'selected state))
(select-window window)))
(select-window window))
(when next-buffers
(set-window-next-buffers
window
(delq nil (mapcar (lambda (buffer)
(setq buffer (get-buffer buffer))
(when (buffer-live-p buffer) buffer))
next-buffers))))
(when prev-buffers
(set-window-prev-buffers
window
(delq nil (mapcar (lambda (entry)
(let ((buffer (get-buffer (nth 0 entry)))
(m1 (nth 1 entry))
(m2 (nth 2 entry)))
(when (buffer-live-p buffer)
(list buffer
(if (markerp m1) m1
(set-marker (make-marker) m1
buffer))
(if (markerp m2) m2
(set-marker (make-marker) m2
buffer))))))
prev-buffers)))))
;; We don't want to raise an error in case the buffer does
;; not exist anymore, so we switch to a previous one and
;; save the window with the intention of deleting it later