Commit f29761dc3b93

Vincent Demeester <vincent@sbr.pm>
2019-12-24 15:24:28
setup-files.el: update recentf configuration
Signed-off-by: Vincent Demeester <vincent@sbr.pm>
1 parent 8a2bcd5
Changed files (1)
lisp/setup-files.el
@@ -9,14 +9,51 @@
 (use-package ripgrep
   :defer 2)
 
-(use-package recentf                    ; Manage recent files
-  :defer 1
+(use-package recentf
+  :custom
+  (recentf-max-menu-items 15)
+  (recentf-max-saved-items 200)
+  (recentf-show-file-shortcuts-flag nil)
   :config
+  (recentf-mode 1)
   (add-to-list 'recentf-exclude "^/\\(?:ssh\\|su\\|sudo\\)?:")
+  ;; Magic advice to rename entries in recentf when moving files in
+  ;; dired.
+  (defun rjs/recentf-rename-notify (oldname newname &rest args)
+    (if (file-directory-p newname)
+        (rjs/recentf-rename-directory oldname newname)
+      (rjs/recentf-rename-file oldname newname)))
 
-  (setq
-   recentf-max-saved-items 200
-   recentf-max-menu-items 15))
+  (defun rjs/recentf-rename-file (oldname newname)
+    (setq recentf-list
+          (mapcar (lambda (name)
+                    (if (string-equal name oldname)
+                        newname
+                      oldname))
+                  recentf-list))
+    recentf-cleanup)
+
+  (defun rjs/recentf-rename-directory (oldname newname)
+    ;; oldname, newname and all entries of recentf-list should already
+    ;; be absolute and normalised so I think this can just test whether
+    ;; oldname is a prefix of the element.
+    (setq recentf-list
+          (mapcar (lambda (name)
+                    (if (string-prefix-p oldname name)
+                        (concat newname (substring name (length oldname)))
+                      name))
+                  recentf-list))
+    recentf-cleanup)
+
+  (advice-add 'dired-rename-file :after #'rjs/recentf-rename-notify)
+
+  (defun contrib/recentf-add-dired-directory ()
+    "Include Dired buffers in the list.  Particularly useful when
+combined with a completion framework's ability to display virtual
+buffers."
+    (when (and (stringp dired-directory)
+               (equal "" (file-name-nondirectory dired-directory)))
+      (recentf-add-file dired-directory))))
 
 (setq view-read-only t)                 ; View read-only