Add support for dired in saveplace.

This commit is contained in:
Ivan Kanis 2013-06-14 11:32:01 +02:00
parent 7cb18056e6
commit d4466a91f2
3 changed files with 49 additions and 18 deletions

View file

@ -1,3 +1,11 @@
2013-06-99 Ivan Kanis <ivan@kanis.fr>
Add support for dired in saveplace.
* dired.el (dired-initial-position-hook): New variable.
(dired-initial-position): Call hook to place cursor position.
* saveplace.el (save-place-to-alist): Add dired position.
(save-place-dired-hook): New function.
2013-06-14 Stefan Monnier <monnier@iro.umontreal.ca>
* subr.el (eval-after-load, set-temporary-overlay-map): Use indirection

View file

@ -217,6 +217,13 @@ with the buffer narrowed to the listing."
;; Note this can't simply be run inside function `dired-ls' as the hook
;; functions probably depend on the dired-subdir-alist to be OK.
(defcustom dired-initial-point-hook nil
"This hook is used to position the point.
It is run the function `dired-initial-position'."
:group 'dired
:type 'hook
:version "24.4")
(defcustom dired-dnd-protocol-alist
'(("^file:///" . dired-dnd-handle-local-file)
("^file://" . dired-dnd-handle-file)
@ -2758,11 +2765,13 @@ as returned by `dired-get-filename'. LIMIT is the search limit."
;; FIXME document whatever dired-x is doing.
(defun dired-initial-position (dirname)
"Where point should go in a new listing of DIRNAME.
Point assumed at beginning of new subdir line."
Point assumed at beginning of new subdir line.
It runs the hook `dired-initial-position-hook'."
(end-of-line)
(and (featurep 'dired-x) dired-find-subdir
(dired-goto-subdir dirname))
(if dired-trivial-filenames (dired-goto-next-nontrivial-file)))
(if dired-trivial-filenames (dired-goto-next-nontrivial-file))
(run-hooks 'dired-initial-point-hook))
;; These are hooks which make tree dired work.
;; They are in this file because other parts of dired need to call them.

View file

@ -169,22 +169,24 @@ file:
;; file. If not, do so, then feel free to modify the alist. It
;; will be saved again when Emacs is killed.
(or save-place-loaded (load-save-place-alist-from-file))
(when (and buffer-file-name
(or (not save-place-ignore-files-regexp)
(not (string-match save-place-ignore-files-regexp
buffer-file-name))))
(let ((cell (assoc buffer-file-name save-place-alist))
(position (if (not (eq major-mode 'hexl-mode))
(point)
(with-no-warnings
(1+ (hexl-current-address))))))
(if cell
(setq save-place-alist (delq cell save-place-alist)))
(if (and save-place
(not (= position 1))) ;; Optimize out the degenerate case.
(setq save-place-alist
(cons (cons buffer-file-name position)
save-place-alist))))))
(let ((item (or buffer-file-name
(and dired-directory (expand-file-name dired-directory)))))
(when (and item
(or (not save-place-ignore-files-regexp)
(not (string-match save-place-ignore-files-regexp
item))))
(let ((cell (assoc item save-place-alist))
(position (if (not (eq major-mode 'hexl-mode))
(point)
(with-no-warnings
(1+ (hexl-current-address))))))
(if cell
(setq save-place-alist (delq cell save-place-alist)))
(if (and save-place
(not (= position 1))) ;; Optimize out the degenerate case.
(setq save-place-alist
(cons (cons item position)
save-place-alist)))))))
(defun save-place-forget-unreadable-files ()
"Remove unreadable files from `save-place-alist'.
@ -300,6 +302,17 @@ may have changed\) back to `save-place-alist'."
;; and make sure it will be saved again for later
(setq save-place t)))))
(defun save-place-dired-hook ()
"Position the point in a dired buffer."
(or save-place-loaded (load-save-place-alist-from-file))
(let ((cell (assoc (expand-file-name dired-directory) save-place-alist)))
(if cell
(progn
(or revert-buffer-in-progress-p
(goto-char (cdr cell)))
;; and make sure it will be saved again for later
(setq save-place t)))))
(defun save-place-kill-emacs-hook ()
;; First update the alist. This loads the old save-place-file if nec.
(save-places-to-alist)
@ -310,6 +323,7 @@ may have changed\) back to `save-place-alist'."
(add-hook 'find-file-hook 'save-place-find-file-hook t)
(add-hook 'dired-initial-point-hook 'save-place-dired-hook)
(unless noninteractive
(add-hook 'kill-emacs-hook 'save-place-kill-emacs-hook))