diff options
author | Juri Linkov <juri@jurta.org> | 2009-12-05 23:22:03 +0000 |
---|---|---|
committer | Juri Linkov <juri@jurta.org> | 2009-12-05 23:22:03 +0000 |
commit | 065543e754725e54e7b24add15ae7fd28afd6262 (patch) | |
tree | af5b238663d7ee3942a42acf0cbe95571fc168aa /lisp/dired.el | |
parent | 426ac9499e082e4ab83a18639fd45b720584f347 (diff) | |
download | emacs-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.el | 45 |
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." |