changeset 106446:56b9af7a1762

Save and restore dired buffer's point positions too. (Bug#4880) (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.
author Juri Linkov <juri@jurta.org>
date Sat, 05 Dec 2009 23:22:03 +0000
parents 68f4d89d2fe9
children f5f8760e0f26
files lisp/ChangeLog lisp/dired.el
diffstat 2 files changed, 42 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Sat Dec 05 22:49:00 2009 +0000
+++ b/lisp/ChangeLog	Sat Dec 05 23:22:03 2009 +0000
@@ -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
--- a/lisp/dired.el	Sat Dec 05 22:49:00 2009 +0000
+++ b/lisp/dired.el	Sat Dec 05 23:22:03 2009 +0000
@@ -1169,23 +1169,40 @@
 ;; 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."