emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[nongnu] elpa/dirvish 04a501732f 1/3: feat(history): sort history entrie


From: ELPA Syncer
Subject: [nongnu] elpa/dirvish 04a501732f 1/3: feat(history): sort history entries with access time (#265)
Date: Fri, 7 Mar 2025 07:01:16 -0500 (EST)

branch: elpa/dirvish
commit 04a501732fdd32e1fc9424865006b70e330af539
Author: Alex Lu <hellosimon1103@hotmail.com>
Commit: Alex Lu <hellosimon1103@hotmail.com>

    feat(history): sort history entries with access time (#265)
---
 dirvish.el                         | 46 +++++++++++++++------------------
 docs/CUSTOMIZING.org               | 32 ++++++++++++++++-------
 docs/EXTENSIONS.org                | 53 ++++++++++++++++++++++++++++++++------
 extensions/dirvish-emerge.el       | 16 ++++++------
 extensions/dirvish-fd.el           | 12 ++-------
 extensions/dirvish-history.el      | 29 ++++++++++++++++++---
 extensions/dirvish-quick-access.el |  1 -
 7 files changed, 125 insertions(+), 64 deletions(-)

diff --git a/dirvish.el b/dirvish.el
index d123396a8a..e0c714dccb 100644
--- a/dirvish.el
+++ b/dirvish.el
@@ -25,8 +25,6 @@
 (require 'cl-lib)
 (eval-when-compile (require 'project))
 (declare-function ansi-color-apply-on-region "ansi-color")
-(declare-function dirvish-fd-find "dirvish-fd")
-(declare-function dirvish-tramp-noselect "dirvish-tramp")
 
 ;;;; User Options
 
@@ -264,7 +262,7 @@ input for `dirvish-redisplay-debounce' seconds."
   "Functions called when directory data for the root buffer is ready."
   :group 'dirvish :type 'hook)
 
-(defcustom dirvish-find-entry-hook '(dirvish-insert-entry-h)
+(defcustom dirvish-find-entry-hook nil
   "Functions called before a Dired buffer is displayed."
   :group 'dirvish :type 'hook)
 
@@ -466,15 +464,12 @@ ALIST is window arguments passed to 
`window--display-buffer'."
   "Get parent directory of PATH."
   (file-name-directory (directory-file-name (expand-file-name path))))
 
-(defun dirvish--append-metadata (metadata completions)
-  "Append METADATA for minibuffer COMPLETIONS."
-  (let ((entry (if (functionp metadata)
-                   `(metadata (annotation-function . ,metadata))
-                 `(metadata (category . ,metadata)))))
-    (lambda (string pred action)
-      (if (eq action 'metadata)
-          entry
-        (complete-with-action action completions string pred)))))
+(defun dirvish--completion-table-with-metadata (table metadata)
+  "Return new completion TABLE with METADATA, see `completion-metadata'."
+  (lambda (string pred action)
+    (if (eq action 'metadata)
+        `(metadata . ,metadata)
+      (complete-with-action action table string pred))))
 
 (defun dirvish--change-selected (&rest _)
   "Record `dirvish--selected-window'."
@@ -647,10 +642,15 @@ FIND-FN can be one of `find-file', `find-alternate-file',
 `find-file-other-window' or `find-file-other-frame'.  ENTRY can be a
 filename or a string with format of `dirvish-fd-bufname'."
   (let ((switch-to-buffer-preserve-window-point (null 
dired-auto-revert-buffer))
-        (find-file-run-dired t) dv process-connection-type directory?)
+        (find-file-run-dired t) (dv (dirvish-curr))
+        process-connection-type directory? buf)
+    (when (setq buf (and dv (alist-get entry (dv-roots dv) nil nil #'equal)))
+      (cl-return-from dirvish--find-entry
+        (dirvish-save-dedication (switch-to-buffer buf))))
     (when (string-prefix-p "🔍" entry)
-      (dirvish-save-dedication (switch-to-buffer (dirvish-fd-find entry)))
-      (cl-return-from dirvish--find-entry))
+      (setq find-fn (prog1 'dirvish-fd (require 'dirvish-fd nil t)))
+      (pcase-let ((`(,re ,dir ,_) (split-string (substring entry 1) "📁")))
+        (cl-return-from dirvish--find-entry (funcall find-fn dir re))))
     (unless (setq directory? (file-directory-p entry))
       (cl-loop with e = (downcase (or (file-name-extension entry) ""))
                for (es . (c . a)) in dirvish-open-with-programs
@@ -659,8 +659,8 @@ filename or a string with format of `dirvish-fd-bufname'."
                  (let ((a (cl-substitute entry "%f" a :test #'string=)))
                    (when (eq find-fn 'find-alternate-file) 
(kill-current-buffer))
                    (apply #'start-process "" nil "nohup" (append (list c) 
a))))))
-    (unless (setq dv (dirvish-curr)) ; for `find-dired', just forward it
-      (cl-return-from dirvish--find-entry (funcall find-fn entry)))
+    ;; forward requests from `find-dired'
+    (unless dv (cl-return-from dirvish--find-entry (funcall find-fn entry)))
     (when (and (dv-curr-layout dv) (eq find-fn 'find-file-other-window))
       (user-error "Can not find a suitable other-window here"))
     (if directory? (dirvish-save-dedication (funcall find-fn entry))
@@ -702,8 +702,8 @@ filename or a string with format of `dirvish-fd-bufname'."
     (when reuse? (setf (dv-reuse dv) t))
     (when new-buffer-p
       (if (not remote) (setq buffer (apply fn (list dir-or-list flags)))
-        (require 'dirvish-tramp)
-        (setq buffer (dirvish-tramp-noselect fn dir-or-list flags remote)))
+        (setq fn (prog1 'dirvish-tramp-noselect (require 'dirvish-tramp))
+              buffer (apply fn (list dir-or-list flags remote))))
       (with-current-buffer buffer (dirvish--setup-dired))
       (push (cons key buffer) (dv-roots dv)))
     (with-current-buffer buffer
@@ -725,6 +725,8 @@ filename or a string with format of `dirvish-fd-bufname'."
                do (dirvish-prop k (and (functionp v) (funcall v))))
       (when bname (dired-goto-file bname))
       (setf (dv-index dv) (cons key buffer))
+      (let ((key (if (string-prefix-p "🔍" key) (buffer-name buffer) key)))
+        (setq dirvish--history (seq-take (push key dirvish--history) 200)))
       (run-hook-with-args 'dirvish-find-entry-hook key buffer)
       buffer)))
 
@@ -757,12 +759,6 @@ filename or a string with format of `dirvish-fd-bufname'."
                      (not (dirvish--get-session 'type 'peek)))
             (dirvish--preview-update dv filename)))))))
 
-(defun dirvish-insert-entry-h (entry buffer)
-  "Add ENTRY or BUFFER name to `dirvish--history'."
-  (let ((entry (if (string-prefix-p "🔍" entry)
-                   (buffer-name buffer) entry)))
-    (setq dirvish--history (seq-take (push entry dirvish--history) 200))))
-
 (defun dirvish-kill-buffer-h ()
   "Remove buffer from session's buffer list."
   (when-let* ((dv (dirvish-curr)) (buf (current-buffer)))
diff --git a/docs/CUSTOMIZING.org b/docs/CUSTOMIZING.org
index 7c7ce84ac8..8fc6081577 100644
--- a/docs/CUSTOMIZING.org
+++ b/docs/CUSTOMIZING.org
@@ -28,8 +28,22 @@ Emacs to open video/audio files using =mpv=.
 
 ** Usage of GNU =ls=
 
-Please use gnu =ls= (=gls= on macOS and freeBSD) as your 
=insert-directory-program=,
-otherwise some features won't work correctly.
+It is recommended to use GNU =ls= (referred to as =gls= on macOS and FreeBSD) 
as
+your =insert-directory-program=.  If you are using macOS, FreeBSD, or Windows, 
you
+will need to manually install GNU =ls= and possibly configure it as your
+=insert-directory-program=.  On GNU/Linux systems, this program is typically
+pre-installed and utilized by Emacs without requiring additional setup.
+
+#+begin_src bash
+# macOS
+brew install coreutils
+
+# FreeBSD
+pkg install gnuls
+
+# Windows - install via Scoop: https://scoop.sh/
+scoop install coreutils
+#+end_src
 
 To ensure Dirvish correctly parses =dired-listing-switches=, adhere to specific
 formatting rules when setting this variable.  These rules ensure compatibility
@@ -196,7 +210,7 @@ Dirvish offers out-of-the-box file previews for text files 
and directories.
 Furthermore, it provides interfaces and extensive user options to customize and
 expand its preview capabilities.
 
-** Install dependency for better preview experience
+** Install dependencies for an enhanced preview experience
 
 Dirvish offers file preview presets that depend on specific binaries.  If you
 don't require these extra preview features, you can remove the corresponding
@@ -214,28 +228,28 @@ no longer prompt you to install the associated programs.
 
 @@html:<h2>@@macOS@@html:</h2>@@
 #+begin_src bash
-  brew install coreutils fd poppler ffmpegthumbnailer mediainfo vips 7zip
+brew install poppler ffmpegthumbnailer mediainfo vips 7zip
 #+end_src
 
 @@html:<h2>@@Debian-based@@html:</h2>@@
 #+begin_src bash
-  apt install fd-find poppler-utils ffmpegthumbnailer mediainfo libvips-tools
+apt install poppler-utils ffmpegthumbnailer mediainfo libvips-tools
 #+end_src
 
 @@html:<h2>@@Arch-based@@html:</h2>@@
 #+begin_src bash
-  pacman -S fd poppler ffmpegthumbnailer mediainfo libvips 7zip
+pacman -S poppler ffmpegthumbnailer mediainfo libvips 7zip
 #+end_src
 
 @@html:<h2>@@FreeBSD@@html:</h2>@@
 #+begin_src bash
-  pkg install gnuls fd-find poppler ffmpegthumbnailer vips 7-zip
+pkg install poppler ffmpegthumbnailer vips 7-zip
 #+end_src
 
 @@html:<h2>@@Windows@@html:</h2>@@
 #+begin_src bash
-  # install via Scoop: https://scoop.sh/
-  scoop install coreutils fd poppler mtn libvips 7zip
+# install via Scoop: https://scoop.sh/
+scoop install poppler mtn mediainfo libvips 7zip
 #+end_src
 
 @@html:</details>@@
diff --git a/docs/EXTENSIONS.org b/docs/EXTENSIONS.org
index 99add81ec9..bb9a228673 100644
--- a/docs/EXTENSIONS.org
+++ b/docs/EXTENSIONS.org
@@ -197,6 +197,37 @@ breeze. No manual editing anymore!
 
 Please ensure [[https://github.com/sharkdp/fd][fd]] is installed on your OS 
before using this extension.
 
+@@html:<details>@@
+@@html:<summary>@@ @@html:<b>@@Toggle install instructions@@html:</b>@@ 
@@html:</summary>@@
+
+@@html:<h2>@@macOS@@html:</h2>@@
+#+begin_src bash
+brew install fd
+#+end_src
+
+@@html:<h2>@@Debian-based@@html:</h2>@@
+#+begin_src bash
+apt install fd-find
+#+end_src
+
+@@html:<h2>@@Arch-based@@html:</h2>@@
+#+begin_src bash
+pacman -S fd
+#+end_src
+
+@@html:<h2>@@FreeBSD@@html:</h2>@@
+#+begin_src bash
+pkg install fd-find
+#+end_src
+
+@@html:<h2>@@Windows@@html:</h2>@@
+#+begin_src bash
+# install via Scoop: https://scoop.sh/
+scoop install fd
+#+end_src
+
+@@html:</details>@@
+
 This is probably the BEST =fd= frontend, here is a quick demo:
 
 
https://user-images.githubusercontent.com/16313743/170814774-98cc598d-6bc5-4fc3-9eea-21c98d6d4772.mp4
@@ -240,14 +271,20 @@ cursor as a subtree.
 
 * History navigation (dirvish-history.el)
 
-|-----------------------------+---------------------------------------|
-| Command                     | Description                           |
-|-----------------------------+---------------------------------------|
-| ~dirvish-history-jump~        | Go to recently visited directories    |
-| ~dirvish-history-go-forward~  | Go forward history (session locally)  |
-| ~dirvish-history-go-backward~ | Go backward history (session locally) |
-| ~dirvish-history-last~        | Go to most recent used Dirvish buffer |
-|-----------------------------+---------------------------------------|
+This extension offers a collection of straightforward and useful history
+navigation commands.
+
+*Commands*:
+
++ ~dirvish-history-jump~         Go to recently visited directories
++ ~dirvish-history-go-forward~   Go forward history (session locally)
++ ~dirvish-history-go-backward~  Go backward history (session locally)
++ ~dirvish-history-last~         Go to most recent used Dirvish buffer
+
+*Options*:
+
++ =dirvish-history-sort-function=
+  Sorting criteria for ~dirvish-history-jump~ command.
 
 * Quick keys for frequently visited places (dirvish-quick-access.el)
 
diff --git a/extensions/dirvish-emerge.el b/extensions/dirvish-emerge.el
index 2104596e62..b849273786 100644
--- a/extensions/dirvish-emerge.el
+++ b/extensions/dirvish-emerge.el
@@ -197,14 +197,14 @@ The predicate is consumed by `dirvish-emerge-groups'."
   "Read RECIPE from user input and optionally save it to OBJ."
   (ignore recipe)
   (let* ((table dirvish-emerge--available-preds)
-         (coll (dirvish--append-metadata
-                (lambda (i)
-                  (let ((item (intern (format "%s" i))))
-                    (concat
-                     (make-string
-                      (- dirvish-emerge--max-pred-name-len (length i) -8) ?\s)
-                     (cddr (assq item table)))))
-                table))
+         (fn (lambda (i)
+               (let ((item (intern (format "%s" i))))
+                 (concat
+                  (make-string
+                   (- dirvish-emerge--max-pred-name-len (length i) -8) ?\s)
+                  (cddr (assq item table))))))
+         (coll (dirvish--completion-table-with-metadata
+                table `((annotation-function . ,fn))))
          (pred (completing-read "Predicate: " coll)))
     (if obj (oset obj recipe `(predicate . ,(read pred))) (read pred))))
 
diff --git a/extensions/dirvish-fd.el b/extensions/dirvish-fd.el
index f106b18a14..210b2bb406 100644
--- a/extensions/dirvish-fd.el
+++ b/extensions/dirvish-fd.el
@@ -283,7 +283,8 @@ value 16, let the user choose the root directory of their 
search."
            (default-directory base-dir)
            (output (shell-command-to-string command))
            (files-raw (split-string output "\0" t))
-           (files (dirvish--append-metadata 'file files-raw))
+           (files (dirvish--completion-table-with-metadata
+                   files-raw '((category . file))))
            (file (completing-read "Go to: " files))
            (full-file (concat remote file)))
       (dired-jump nil full-file))))
@@ -315,15 +316,6 @@ value 16, let the user choose the root directory of their 
search."
    (progn (insert f-full) (push (cons f-name f-full) res))
    finally return (prog1 (nreverse res) (goto-char (point-min)))))
 
-(defun dirvish-fd-find (entry)
-  "Run fd accroring to ENTRY."
-  (let* ((dv (dirvish-curr))
-         (roots (and dv (dv-roots dv)))
-         (buf (and roots (alist-get entry roots nil nil #'equal))))
-    (or buf
-        (pcase-let ((`(,pattern ,dir ,_) (split-string (substring entry 1) 
"📁")))
-          (dirvish-fd dir pattern)))))
-
 (defsubst dirvish-fd-revert (&rest _)
   "Revert buffer function for fd buffer."
   (dirvish-fd default-directory (or dirvish-fd--input "")))
diff --git a/extensions/dirvish-history.el b/extensions/dirvish-history.el
index fa486ef2d4..f3570b64d6 100644
--- a/extensions/dirvish-history.el
+++ b/extensions/dirvish-history.el
@@ -16,14 +16,37 @@
 (require 'dirvish)
 (require 'transient)
 
+(defcustom dirvish-history-sort-function #'dirvish-history--sort-by-atime
+  "Function used to sort history entries for `dirvish-history-jump'."
+  :group 'dirvish :type 'function)
+
+(defun dirvish-history--sort-by-atime (file-list)
+  "Sort the FILE-LIST by access time, from most recent to least recent."
+  (thread-last
+    file-list
+    ;; Use modification time, since getting file access time seems to count as
+    ;; accessing the file, ruining future uses.
+    (mapcar (lambda (f) (cons f (file-attribute-access-time (file-attributes 
f)))))
+    (seq-sort (pcase-lambda (`(,f1 . ,t1) `(,f2 . ,t2))
+                ;; Want existing, most recent, local files first.
+                (cond ((or (not (file-exists-p f1)) (file-remote-p f1)) nil)
+                      ((or (not (file-exists-p f2)) (file-remote-p f2)) t)
+                      (t (time-less-p t2 t1)))))
+    (mapcar #'car)))
+
 ;;;###autoload
 (defun dirvish-history-jump ()
   "Open a target directory from `dirvish--history'."
   (interactive)
   (unless dirvish--history (user-error "Dirvish[error]: no history entries"))
-  (let* ((entries (dirvish--append-metadata 'file dirvish--history))
-         (result (completing-read "Recently visited: " entries)))
-      (when result (dirvish--find-entry 'find-file result))))
+  (when-let* ((result
+               (completing-read
+                "Recently visited: "
+                (dirvish--completion-table-with-metadata
+                 dirvish--history
+                 `((category . file)
+                   (display-sort-function . 
,dirvish-history-sort-function))))))
+    (dirvish--find-entry 'find-file result)))
 
 ;;;###autoload
 (defun dirvish-history-last ()
diff --git a/extensions/dirvish-quick-access.el 
b/extensions/dirvish-quick-access.el
index ed51d28fae..e8ccad46db 100644
--- a/extensions/dirvish-quick-access.el
+++ b/extensions/dirvish-quick-access.el
@@ -65,7 +65,6 @@ Here is a sample value for this variable.
                        (interactive)
                        (funcall dirvish-quick-access-function ,path))))]
           (interactive)
-          (require 'dirvish-fd nil t)
           (transient-setup 'dirvish-quick-access))))))
 
 (provide 'dirvish-quick-access)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]