Commit 1d676aab authored by Martin Rudalics's avatar Martin Rudalics

Adjust windows' previous buffers when reverting dired buffers (Bug#33458)

* lisp/dired.el (dired-save-positions, dired-restore-positions):
For each window that showed the reverted buffer before, fix the
point positions in its list of previously shown buffers the way
these routines handle window point for all windows currently
showing the buffer (Bug#33458).
parent 1fc73de5
Pipeline #221 failed with stage
in 5 minutes and 8 seconds
......@@ -1478,12 +1478,36 @@ change; the point does."
(list w
(dired-get-filename nil t)
(line-number-at-pos (window-point w)))))
(get-buffer-window-list nil 0 t))))
(get-buffer-window-list nil 0 t))
;; For each window that showed the current buffer before, scan its
;; list of previous buffers. For each association thus found save
;; a triple <point, name, line> where 'point' is that window's
;; window-point marker stored in the window's list of previous
;; buffers, 'name' is the filename at the position of 'point' and
;; 'line' is the line number at the position of 'point'.
(let ((buffer (current-buffer))
prevs)
(walk-windows
(lambda (window)
(let ((prev (assq buffer (window-prev-buffers window))))
(when prev
(with-current-buffer buffer
(save-excursion
(goto-char (nth 2 prev))
(setq prevs
(cons
(list (nth 2 prev)
(dired-get-filename nil t)
(line-number-at-pos (point)))
prevs)))))))
'nomini t)
prevs)))
(defun dired-restore-positions (positions)
"Restore POSITIONS saved with `dired-save-positions'."
(let* ((buf-file-pos (nth 0 positions))
(buffer (nth 0 buf-file-pos)))
(buffer (nth 0 buf-file-pos))
(prevs (nth 2 positions)))
(unless (and (nth 1 buf-file-pos)
(dired-goto-file (nth 1 buf-file-pos)))
(goto-char (point-min))
......@@ -1497,7 +1521,21 @@ change; the point does."
(dired-goto-file (nth 1 win-file-pos)))
(goto-char (point-min))
(forward-line (1- (nth 2 win-file-pos)))
(dired-move-to-filename)))))))
(dired-move-to-filename)))))
(when prevs
(with-current-buffer buffer
(save-excursion
(dolist (prev prevs)
(let ((point (nth 0 prev)))
;; Sanity check of the point marker.
(when (and (markerp point)
(eq (marker-buffer point) buffer))
(unless (and (nth 0 prev)
(dired-goto-file (nth 1 prev)))
(goto-char (point-min))
(forward-line (1- (nth 2 prev))))
(dired-move-to-filename)
(move-marker point (point) buffer)))))))))
(defun dired-remember-marks (beg end)
"Return alist of files and their marks, from BEG to END."
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment