diff options
author | Yuchen Pei <id@ypei.org> | 2025-06-28 10:05:13 +1000 |
---|---|---|
committer | Yuchen Pei <id@ypei.org> | 2025-06-28 10:05:13 +1000 |
commit | f118bd0b13d580e529a28ab2caa6ead78ab18d5d (patch) | |
tree | a16398b9917b963fbfa408f1f1c25ddf182f24fe | |
parent | 039d8f2a26dbbbab8b7bc012f3f12107916b90b5 (diff) |
[emacs] bookkeeping in belf-recent
-rw-r--r-- | emacs/.emacs.d/lisp/my/belf.el | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/emacs/.emacs.d/lisp/my/belf.el b/emacs/.emacs.d/lisp/my/belf.el index 8a4a9f0..980cd3e 100644 --- a/emacs/.emacs.d/lisp/my/belf.el +++ b/emacs/.emacs.d/lisp/my/belf.el @@ -491,7 +491,62 @@ Can be used as a `find-file-hook'." (belf-recent-list-refresh-contents)) (pop-to-buffer-same-window buf))) +;; (defvar belf-find-dir nil +;; "Directory to run find command for relocated files.") + +(defvar belf-locate-dirs nil + "Directories to look for relocated files.") + +(defun belf-recent-bookkeeping () + "Check `belf-recent-file' for (re)moved files and update accordingly." + (interactive) + (copy-file belf-recent-file (concat belf-recent-file ".bak") t) + (with-temp-buffer + (when (file-exists-p belf-recent-file) + (insert-file-contents belf-recent-file)) + (goto-char (point-min)) + (while (not (eobp)) + (forward-char 26) + (let* ((beg (point)) + (end (progn (end-of-line) (point))) + (file-name (buffer-substring-no-properties beg end))) + (unless (file-exists-p file-name) + (let ((dirs belf-locate-dirs) + (file-name-nodir (file-name-nondirectory file-name)) + dir new-name found) + (delete-region beg end) + (while (and (not found) dirs) + (setq dir (expand-file-name (car dirs)) + new-name (file-name-concat dir file-name-nodir) + found (file-exists-p new-name) + dirs (cdr dirs))) + (when found (insert new-name))) + ;; Running find on a big dir is too slow even when there are + ;; only a few thousands subdirs + ;; (call-process "find" nil (current-buffer) nil + ;; (expand-file-name belf-find-dir) + ;; "-name" (file-name-nondirectory file-name)) + ) + (beginning-of-line 2))) + + ;; Remove empty records that could not be found + (goto-char (point-min)) + (flush-lines (rx bol (= 26 anychar) eol)) + + ;; Deduplicate + (goto-char (point-min)) + (while (not (eobp)) + (forward-char 26) + (let* ((beg (point)) + (end (progn (end-of-line) (point))) + (file-name (buffer-substring-no-properties beg end))) + (flush-lines + (rx-to-string `(and bol "[" (= 23 anychar) "] " ,file-name eol)))) + (beginning-of-line 2)) + (write-file belf-recent-file))) + (defun belf-recent-list-refresh-contents (&rest _) + (belf-recent-bookkeeping) (setq-local tabulated-list-entries (belf-recent-parse-file-names)) (tabulated-list-print)) |