]> git.eshelyaron.com Git - emacs.git/commitdiff
Adjust windows' previous buffers when reverting dired buffers (Bug#33458)
authorMartin Rudalics <rudalics@gmx.at>
Sat, 8 Dec 2018 08:18:28 +0000 (09:18 +0100)
committerMartin Rudalics <rudalics@gmx.at>
Sat, 8 Dec 2018 08:18:28 +0000 (09:18 +0100)
* 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).

lisp/dired.el

index cbd85fed91c4d562e43ca70a43a2f06b8ab4c3c1..e5dc8623a49b1f22541a2d7aa483ba8c7987b3d4 100644 (file)
@@ -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."