emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master 1d676aa: Adjust windows' previous buffers when reve


From: Martin Rudalics
Subject: [Emacs-diffs] master 1d676aa: Adjust windows' previous buffers when reverting dired buffers (Bug#33458)
Date: Sat, 8 Dec 2018 03:19:02 -0500 (EST)

branch: master
commit 1d676aabca4bdba6948fb7a9d875ba63b51aed63
Author: Martin Rudalics <address@hidden>
Commit: Martin Rudalics <address@hidden>

    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).
---
 lisp/dired.el | 44 +++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 41 insertions(+), 3 deletions(-)

diff --git a/lisp/dired.el b/lisp/dired.el
index cbd85fe..e5dc862 100644
--- a/lisp/dired.el
+++ b/lisp/dired.el
@@ -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."



reply via email to

[Prev in Thread] Current Thread [Next in Thread]