]> git.eshelyaron.com Git - emacs.git/commitdiff
Save and restore dired buffer's point positions too. (Bug#4880)
authorJuri Linkov <juri@jurta.org>
Sat, 5 Dec 2009 23:22:03 +0000 (23:22 +0000)
committerJuri Linkov <juri@jurta.org>
Sat, 5 Dec 2009 23:22:03 +0000 (23:22 +0000)
(dired-save-positions): Return in the first element
buffer's position in format (BUFFER DIRED-FILENAME BUFFER-POINT).
Doc fix.
(dired-restore-positions): First restore buffer's position.
While restoring window's positions, check if window still displays
the original buffer.

lisp/ChangeLog
lisp/dired.el

index 9ff951b09a30deaa9cef511754d0b03e3d982dc6..04203266058003fd6f120f850f07b84da2f8cd0d 100644 (file)
@@ -1,3 +1,14 @@
+2009-12-05  Juri Linkov  <juri@jurta.org>
+
+       Save and restore dired buffer's point positions too.  (Bug#4880)
+
+       * dired.el (dired-save-positions): Return in the first element
+       buffer's position in format (BUFFER DIRED-FILENAME BUFFER-POINT).
+       Doc fix.
+       (dired-restore-positions): First restore buffer's position.
+       While restoring window's positions, check if window still displays
+       the original buffer.
+
 2009-12-05  Chong Yidong  <cyd@stupidchicken.com>
 
        * bindings.el (complete-symbol): Call semantic-ia-complete-symbol
index c34ff4ec3f7610a0184477d7afee19ecd0dd37d5..3f165812c97667439ce049b72e5db47dee7db6a5 100644 (file)
@@ -1169,23 +1169,40 @@ Preserves old cursor, marks/flags, hidden-p."
 ;; Some of these are also used when inserting subdirs.
 
 (defun dired-save-positions ()
-  "Return the current positions in all windows displaying this dired buffer.
-The positions have the form (WINDOW FILENAME POINT)."
-  (mapcar (lambda (w)
-           (list w
-                 (with-selected-window w
-                   (dired-get-filename nil t))
-                 (window-point w)))
-         (get-buffer-window-list nil 0 t)))
+  "Return current positions in the buffer and all windows with this directory.
+The positions have the form (BUFFER-POSITION WINDOW-POSITIONS).
+
+BUFFER-POSITION is the point position in the current dired buffer.
+The buffer position have the form (BUFFER DIRED-FILENAME BUFFER-POINT).
+
+WINDOW-POSITIONS are current positions in all windows displaying
+this dired buffer.  The window positions have the form (WINDOW
+DIRED-FILENAME WINDOW-POINT)."
+  (list
+   (list (current-buffer) (dired-get-filename nil t) (point))
+   (mapcar (lambda (w)
+            (list w
+                  (with-selected-window w
+                    (dired-get-filename nil t))
+                  (window-point w)))
+          (get-buffer-window-list nil 0 t))))
 
 (defun dired-restore-positions (positions)
   "Restore POSITIONS saved with `dired-save-positions'."
-  (dolist (win-file-pos positions)
-    (with-selected-window (car win-file-pos)
-      (unless (and (nth 1 win-file-pos)
-                  (dired-goto-file (nth 1 win-file-pos)))
-       (goto-char (nth 2 win-file-pos))
-       (dired-move-to-filename)))))
+  (let* ((buf-file-pos (nth 0 positions))
+        (buffer (nth 0 buf-file-pos)))
+    (unless (and (nth 1 buf-file-pos)
+                (dired-goto-file (nth 1 buf-file-pos)))
+      (goto-char (nth 2 buf-file-pos))
+      (dired-move-to-filename))
+    (dolist (win-file-pos (nth 1 positions))
+      ;; Ensure that window still displays the original buffer.
+      (when (eq (window-buffer (nth 0 win-file-pos)) buffer)
+       (with-selected-window (nth 0 win-file-pos)
+         (unless (and (nth 1 win-file-pos)
+                      (dired-goto-file (nth 1 win-file-pos)))
+           (goto-char (nth 2 win-file-pos))
+           (dired-move-to-filename)))))))
 
 (defun dired-remember-marks (beg end)
   "Return alist of files and their marks, from BEG to END."