summaryrefslogtreecommitdiff
path: root/lisp/dired.el
diff options
context:
space:
mode:
authorJuri Linkov <juri@jurta.org>2009-12-05 23:22:03 +0000
committerJuri Linkov <juri@jurta.org>2009-12-05 23:22:03 +0000
commit065543e754725e54e7b24add15ae7fd28afd6262 (patch)
treeaf5b238663d7ee3942a42acf0cbe95571fc168aa /lisp/dired.el
parent426ac9499e082e4ab83a18639fd45b720584f347 (diff)
downloademacs-065543e754725e54e7b24add15ae7fd28afd6262.tar.gz
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.
Diffstat (limited to 'lisp/dired.el')
-rw-r--r--lisp/dired.el45
1 files changed, 31 insertions, 14 deletions
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."