From 065543e754725e54e7b24add15ae7fd28afd6262 Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Sat, 5 Dec 2009 23:22:03 +0000 Subject: [PATCH] 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. --- lisp/ChangeLog | 11 +++++++++++ lisp/dired.el | 45 +++++++++++++++++++++++++++++++-------------- 2 files changed, 42 insertions(+), 14 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 9ff951b09a3..04203266058 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -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 --git a/lisp/dired.el b/lisp/dired.el index c34ff4ec3f7..3f165812c97 100644 --- a/lisp/dired.el +++ b/lisp/dired.el @@ -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." -- 2.39.5