# HG changeset patch # User Juri Linkov # Date 1260055323 0 # Node ID 56b9af7a1762b6051451fcec5d94ad1d91db3bfa # Parent 68f4d89d2fe9e45052b1329db335a2708048d847 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. diff -r 68f4d89d2fe9 -r 56b9af7a1762 lisp/ChangeLog --- 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 + + 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 * bindings.el (complete-symbol): Call semantic-ia-complete-symbol diff -r 68f4d89d2fe9 -r 56b9af7a1762 lisp/dired.el --- 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."