Subject: bug#78596: 30.1; recentf-open ought to use a completion table and category

From: dino chiesa <[email-masked]>
Date: Mon, 26 May 2025 19:57:39 +0000

This isn't a bug report, more of an enhancement request.

Summary
I would like recentf-open to use "Programmed Completion" via 
a completion function. (see 21.6.7 Programmed Completion)  
That function ought to return metadata with a category that 
is specific to recentf.

Background
I've been configuring icomplete-vertical-mode for various things.  I
learned that by default, when there is no completion table, completion
in the minibuffer uses `completion-all-sorted-completions' which is
defined in minibuffer.el; by default it uses a function called
`minibuffer--sort-by-length-alpha', which sorts candidates first by
length, then alphabetically. The result is an aesthetically pleasing
pyramid of choices shown vertically in the minibuffer, but it is sort of 
non-intuitive for things like "open one of the files I've recently visited".

This default sorting applies to buffer names, filenames (find-file),
command names (M-x), and various other things. 

I learned also that it is possible to override that default sorting, via 
`completion-category-overrides`.  To make this work, I must add an
item to that list with a symbol denoting a category, and then make
sure the use of completing-read uses (a) a completion _function_, not 
just a list of candidates; and (b) that category name in the metadata
returned by the completion function.

But not all uses of `completing-read' employ a completion
function. Without that, I think overriding the sort is unwieldy. recentf-open 
is one of those cases that does not currently use a completion function.

So I propose to modify recentf-open to use a completion function:

< (defun recentf-open (file)
<   "Prompt for FILE in `recentf-list' and visit it.
< Enable `recentf-mode' if it isn't already."
<   (interactive
<    (list
<     (progn (unless recentf-mode (recentf-mode 1))
<            (completing-read (format-prompt "Open recent file" nil)
<                             (recentf--programmed-completion recentf-list)
<                             nil t))))
---
> (defun recentf-open (file)
>   "Prompt for FILE in `recentf-list' and visit it.
> Enable `recentf-mode' if it isn't already."
>   (interactive
>    (list
>     (progn (unless recentf-mode (recentf-mode 1))
>            (completing-read (format-prompt "Open recent file" nil)
>                             recentf-list nil t))))
>

And the completion function, I think, can be like this.

  (defun recentf--programmed-completion (candidates)
    "Returns a function to be used as the completions parameter in
`completing-read' for `recentf-open'. Main purpose is to set metadata,
specifically the category, which will allow sorting, completion styles, etc."
    (let ((candidates candidates))
      (lambda (string pred action)
        (if (eq action 'metadata)
            `(metadata (category . recentf))
          (complete-with-action action candidates string pred)))))

If that is done, then users of `recentf-open` who also use `icomplete-vertical-mode`
can do something as simple as the following to disable the default "by length then
by alpha" sorting for recentf-open:

   (add-to-list 'completion-category-overrides
                 `(recentf
                   (styles . (substring))
                   (cycle-sort-function . ,#'identity)))

I believe this should have no impact on existing users of `recentf-open'. 

====================================================================

In GNU Emacs 30.1 (build 2, x86_64-w64-mingw32) of 2025-02-23 built on
 AVALON
Windowing system distributor 'Microsoft Corp.', version 10.0.26100
System Description: Microsoft Windows 10 Home (v10.0.2009.26100.4061)

Configured using:
 'configure --with-modules --without-dbus --with-native-compilation=aot
 --without-compress-install --with-tree-sitter CFLAGS=-O2
 prefix=/g/rel/install/emacs-30.1'

Configured features:
ACL GIF GMP GNUTLS HARFBUZZ JPEG LCMS2 LIBXML2 MODULES NATIVE_COMP
NOTIFY W32NOTIFY PDUMPER PNG RSVG SOUND SQLITE3 THREADS TIFF
TOOLKIT_SCROLL_BARS TREE_SITTER WEBP XPM ZLIB

(NATIVE_COMP present but libgccjit not available)

Important settings:
  value of $LANG: ENU
  locale-coding-system: cp1252

Major mode: ELisp/l

Minor modes in effect:
  global-git-commit-mode: t
  magit-auto-revert-mode: t
  default-text-scale-mode: t
  yas-global-mode: t
  yas-minor-mode: t
  company-box-mode: t
  company-mode: t
  indent-bars-mode: t
  display-line-numbers-mode: t
  auto-revert-mode: t
  recentf-mode: t
  flycheck-mode: t
  marginalia-mode: t
  icomplete-vertical-mode: t
  icomplete-mode: t
  override-global-mode: t
  global-hl-line-mode: t
  hl-line-mode: t
  apheleia-mode: t
  tooltip-mode: t
  global-eldoc-mode: t
  eldoc-mode: t
  show-paren-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  minibuffer-regexp-mode: t
  column-number-mode: t
  line-number-mode: t
  transient-mark-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  abbrev-mode: t

Load-path shadows:
~/elisp/json-reformat hides c:/users/dpchi/.emacs.d/elpa/json-reformat-20220905.2342/json-reformat
~/elisp/protobuf-mode hides c:/users/dpchi/.emacs.d/elpa/protobuf-mode-20240823.1417/protobuf-mode
~/elisp/rego-mode hides c:/users/dpchi/.emacs.d/elpa/rego-mode-20201102.1420/rego-mode
~/elisp/wgrep hides c:/users/dpchi/.emacs.d/elpa/wgrep-20230203.1214/wgrep
c:/users/dpchi/.emacs.d/elpa/transient-20250520.1040/transient hides c:/emacs/share/emacs/30.1/lisp/transient
c:/users/dpchi/.emacs.d/elpa/verilog-mode-2025.1.1.100165202/verilog-mode hides c:/emacs/share/emacs/30.1/lisp/progmodes/verilog-mode
c:/users/dpchi/.emacs.d/elpa/idlwave-6.5.1/idlwave hides c:/emacs/share/emacs/30.1/lisp/progmodes/idlwave
c:/users/dpchi/.emacs.d/elpa/idlwave-6.5.1/idlw-toolbar hides c:/emacs/share/emacs/30.1/lisp/progmodes/idlw-toolbar
c:/users/dpchi/.emacs.d/elpa/idlwave-6.5.1/idlw-shell hides c:/emacs/share/emacs/30.1/lisp/progmodes/idlw-shell
c:/users/dpchi/.emacs.d/elpa/idlwave-6.5.1/idlw-help hides c:/emacs/share/emacs/30.1/lisp/progmodes/idlw-help
c:/users/dpchi/.emacs.d/elpa/idlwave-6.5.1/idlw-complete-structtag hides c:/emacs/share/emacs/30.1/lisp/progmodes/idlw-complete-structtag
c:/users/dpchi/.emacs.d/elpa/flymake-1.4.1/flymake hides c:/emacs/share/emacs/30.1/lisp/progmodes/flymake
c:/users/dpchi/.emacs.d/elpa/eglot-1.18/eglot hides c:/emacs/share/emacs/30.1/lisp/progmodes/eglot
c:/users/dpchi/.emacs.d/elpa/org-20210929/ox hides c:/emacs/share/emacs/30.1/lisp/org/ox
c:/users/dpchi/.emacs.d/elpa/org-20210929/ox-texinfo hides c:/emacs/share/emacs/30.1/lisp/org/ox-texinfo
c:/users/dpchi/.emacs.d/elpa/org-20210929/ox-publish hides c:/emacs/share/emacs/30.1/lisp/org/ox-publish
c:/users/dpchi/.emacs.d/elpa/org-20210929/ox-org hides c:/emacs/share/emacs/30.1/lisp/org/ox-org
c:/users/dpchi/.emacs.d/elpa/org-20210929/ox-odt hides c:/emacs/share/emacs/30.1/lisp/org/ox-odt
c:/users/dpchi/.emacs.d/elpa/org-20210929/ox-md hides c:/emacs/share/emacs/30.1/lisp/org/ox-md
c:/users/dpchi/.emacs.d/elpa/org-20210929/ox-man hides c:/emacs/share/emacs/30.1/lisp/org/ox-man
c:/users/dpchi/.emacs.d/elpa/org-20210929/ox-latex hides c:/emacs/share/emacs/30.1/lisp/org/ox-latex
c:/users/dpchi/.emacs.d/elpa/org-20210929/ox-koma-letter hides c:/emacs/share/emacs/30.1/lisp/org/ox-koma-letter
c:/users/dpchi/.emacs.d/elpa/org-20210929/ox-icalendar hides c:/emacs/share/emacs/30.1/lisp/org/ox-icalendar
c:/users/dpchi/.emacs.d/elpa/org-20210929/ox-html hides c:/emacs/share/emacs/30.1/lisp/org/ox-html
c:/users/dpchi/.emacs.d/elpa/org-20210929/ox-beamer hides c:/emacs/share/emacs/30.1/lisp/org/ox-beamer
c:/users/dpchi/.emacs.d/elpa/org-20210929/ox-ascii hides c:/emacs/share/emacs/30.1/lisp/org/ox-ascii
c:/users/dpchi/.emacs.d/elpa/org-20210929/org hides c:/emacs/share/emacs/30.1/lisp/org/org
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-version hides c:/emacs/share/emacs/30.1/lisp/org/org-version
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-timer hides c:/emacs/share/emacs/30.1/lisp/org/org-timer
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-tempo hides c:/emacs/share/emacs/30.1/lisp/org/org-tempo
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-table hides c:/emacs/share/emacs/30.1/lisp/org/org-table
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-src hides c:/emacs/share/emacs/30.1/lisp/org/org-src
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-refile hides c:/emacs/share/emacs/30.1/lisp/org/org-refile
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-protocol hides c:/emacs/share/emacs/30.1/lisp/org/org-protocol
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-plot hides c:/emacs/share/emacs/30.1/lisp/org/org-plot
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-pcomplete hides c:/emacs/share/emacs/30.1/lisp/org/org-pcomplete
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-num hides c:/emacs/share/emacs/30.1/lisp/org/org-num
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-mouse hides c:/emacs/share/emacs/30.1/lisp/org/org-mouse
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-mobile hides c:/emacs/share/emacs/30.1/lisp/org/org-mobile
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-macs hides c:/emacs/share/emacs/30.1/lisp/org/org-macs
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-macro hides c:/emacs/share/emacs/30.1/lisp/org/org-macro
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-loaddefs hides c:/emacs/share/emacs/30.1/lisp/org/org-loaddefs
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-list hides c:/emacs/share/emacs/30.1/lisp/org/org-list
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-lint hides c:/emacs/share/emacs/30.1/lisp/org/org-lint
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-keys hides c:/emacs/share/emacs/30.1/lisp/org/org-keys
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-inlinetask hides c:/emacs/share/emacs/30.1/lisp/org/org-inlinetask
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-indent hides c:/emacs/share/emacs/30.1/lisp/org/org-indent
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-id hides c:/emacs/share/emacs/30.1/lisp/org/org-id
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-habit hides c:/emacs/share/emacs/30.1/lisp/org/org-habit
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-goto hides c:/emacs/share/emacs/30.1/lisp/org/org-goto
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-footnote hides c:/emacs/share/emacs/30.1/lisp/org/org-footnote
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-feed hides c:/emacs/share/emacs/30.1/lisp/org/org-feed
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-faces hides c:/emacs/share/emacs/30.1/lisp/org/org-faces
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-entities hides c:/emacs/share/emacs/30.1/lisp/org/org-entities
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-element hides c:/emacs/share/emacs/30.1/lisp/org/org-element
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-duration hides c:/emacs/share/emacs/30.1/lisp/org/org-duration
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-datetree hides c:/emacs/share/emacs/30.1/lisp/org/org-datetree
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-ctags hides c:/emacs/share/emacs/30.1/lisp/org/org-ctags
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-crypt hides c:/emacs/share/emacs/30.1/lisp/org/org-crypt
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-compat hides c:/emacs/share/emacs/30.1/lisp/org/org-compat
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-colview hides c:/emacs/share/emacs/30.1/lisp/org/org-colview
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-clock hides c:/emacs/share/emacs/30.1/lisp/org/org-clock
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-capture hides c:/emacs/share/emacs/30.1/lisp/org/org-capture
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-attach hides c:/emacs/share/emacs/30.1/lisp/org/org-attach
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-attach-git hides c:/emacs/share/emacs/30.1/lisp/org/org-attach-git
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-archive hides c:/emacs/share/emacs/30.1/lisp/org/org-archive
c:/users/dpchi/.emacs.d/elpa/org-20210929/org-agenda hides c:/emacs/share/emacs/30.1/lisp/org/org-agenda
c:/users/dpchi/.emacs.d/elpa/org-20210929/ol hides c:/emacs/share/emacs/30.1/lisp/org/ol
c:/users/dpchi/.emacs.d/elpa/org-20210929/ol-w3m hides c:/emacs/share/emacs/30.1/lisp/org/ol-w3m
c:/users/dpchi/.emacs.d/elpa/org-20210929/ol-rmail hides c:/emacs/share/emacs/30.1/lisp/org/ol-rmail
c:/users/dpchi/.emacs.d/elpa/org-20210929/ol-mhe hides c:/emacs/share/emacs/30.1/lisp/org/ol-mhe
c:/users/dpchi/.emacs.d/elpa/org-20210929/ol-irc hides c:/emacs/share/emacs/30.1/lisp/org/ol-irc
c:/users/dpchi/.emacs.d/elpa/org-20210929/ol-info hides c:/emacs/share/emacs/30.1/lisp/org/ol-info
c:/users/dpchi/.emacs.d/elpa/org-20210929/ol-gnus hides c:/emacs/share/emacs/30.1/lisp/org/ol-gnus
c:/users/dpchi/.emacs.d/elpa/org-20210929/ol-eww hides c:/emacs/share/emacs/30.1/lisp/org/ol-eww
c:/users/dpchi/.emacs.d/elpa/org-20210929/ol-eshell hides c:/emacs/share/emacs/30.1/lisp/org/ol-eshell
c:/users/dpchi/.emacs.d/elpa/org-20210929/ol-doi hides c:/emacs/share/emacs/30.1/lisp/org/ol-doi
c:/users/dpchi/.emacs.d/elpa/org-20210929/ol-docview hides c:/emacs/share/emacs/30.1/lisp/org/ol-docview
c:/users/dpchi/.emacs.d/elpa/org-20210929/ol-bibtex hides c:/emacs/share/emacs/30.1/lisp/org/ol-bibtex
c:/users/dpchi/.emacs.d/elpa/org-20210929/ol-bbdb hides c:/emacs/share/emacs/30.1/lisp/org/ol-bbdb
c:/users/dpchi/.emacs.d/elpa/org-20210929/oc hides c:/emacs/share/emacs/30.1/lisp/org/oc
c:/users/dpchi/.emacs.d/elpa/org-20210929/oc-natbib hides c:/emacs/share/emacs/30.1/lisp/org/oc-natbib
c:/users/dpchi/.emacs.d/elpa/org-20210929/oc-csl hides c:/emacs/share/emacs/30.1/lisp/org/oc-csl
c:/users/dpchi/.emacs.d/elpa/org-20210929/oc-biblatex hides c:/emacs/share/emacs/30.1/lisp/org/oc-biblatex
c:/users/dpchi/.emacs.d/elpa/org-20210929/oc-basic hides c:/emacs/share/emacs/30.1/lisp/org/oc-basic
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob hides c:/emacs/share/emacs/30.1/lisp/org/ob
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-tangle hides c:/emacs/share/emacs/30.1/lisp/org/ob-tangle
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-table hides c:/emacs/share/emacs/30.1/lisp/org/ob-table
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-sqlite hides c:/emacs/share/emacs/30.1/lisp/org/ob-sqlite
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-sql hides c:/emacs/share/emacs/30.1/lisp/org/ob-sql
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-shell hides c:/emacs/share/emacs/30.1/lisp/org/ob-shell
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-sed hides c:/emacs/share/emacs/30.1/lisp/org/ob-sed
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-screen hides c:/emacs/share/emacs/30.1/lisp/org/ob-screen
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-scheme hides c:/emacs/share/emacs/30.1/lisp/org/ob-scheme
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-sass hides c:/emacs/share/emacs/30.1/lisp/org/ob-sass
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-ruby hides c:/emacs/share/emacs/30.1/lisp/org/ob-ruby
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-ref hides c:/emacs/share/emacs/30.1/lisp/org/ob-ref
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-R hides c:/emacs/share/emacs/30.1/lisp/org/ob-R
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-python hides c:/emacs/share/emacs/30.1/lisp/org/ob-python
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-processing hides c:/emacs/share/emacs/30.1/lisp/org/ob-processing
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-plantuml hides c:/emacs/share/emacs/30.1/lisp/org/ob-plantuml
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-perl hides c:/emacs/share/emacs/30.1/lisp/org/ob-perl
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-org hides c:/emacs/share/emacs/30.1/lisp/org/ob-org
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-octave hides c:/emacs/share/emacs/30.1/lisp/org/ob-octave
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-ocaml hides c:/emacs/share/emacs/30.1/lisp/org/ob-ocaml
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-maxima hides c:/emacs/share/emacs/30.1/lisp/org/ob-maxima
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-matlab hides c:/emacs/share/emacs/30.1/lisp/org/ob-matlab
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-makefile hides c:/emacs/share/emacs/30.1/lisp/org/ob-makefile
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-lua hides c:/emacs/share/emacs/30.1/lisp/org/ob-lua
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-lob hides c:/emacs/share/emacs/30.1/lisp/org/ob-lob
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-lisp hides c:/emacs/share/emacs/30.1/lisp/org/ob-lisp
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-lilypond hides c:/emacs/share/emacs/30.1/lisp/org/ob-lilypond
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-latex hides c:/emacs/share/emacs/30.1/lisp/org/ob-latex
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-julia hides c:/emacs/share/emacs/30.1/lisp/org/ob-julia
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-js hides c:/emacs/share/emacs/30.1/lisp/org/ob-js
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-java hides c:/emacs/share/emacs/30.1/lisp/org/ob-java
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-haskell hides c:/emacs/share/emacs/30.1/lisp/org/ob-haskell
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-groovy hides c:/emacs/share/emacs/30.1/lisp/org/ob-groovy
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-gnuplot hides c:/emacs/share/emacs/30.1/lisp/org/ob-gnuplot
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-fortran hides c:/emacs/share/emacs/30.1/lisp/org/ob-fortran
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-forth hides c:/emacs/share/emacs/30.1/lisp/org/ob-forth
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-exp hides c:/emacs/share/emacs/30.1/lisp/org/ob-exp
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-eval hides c:/emacs/share/emacs/30.1/lisp/org/ob-eval
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-eshell hides c:/emacs/share/emacs/30.1/lisp/org/ob-eshell
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-emacs-lisp hides c:/emacs/share/emacs/30.1/lisp/org/ob-emacs-lisp
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-dot hides c:/emacs/share/emacs/30.1/lisp/org/ob-dot
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-ditaa hides c:/emacs/share/emacs/30.1/lisp/org/ob-ditaa
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-css hides c:/emacs/share/emacs/30.1/lisp/org/ob-css
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-core hides c:/emacs/share/emacs/30.1/lisp/org/ob-core
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-comint hides c:/emacs/share/emacs/30.1/lisp/org/ob-comint
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-clojure hides c:/emacs/share/emacs/30.1/lisp/org/ob-clojure
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-calc hides c:/emacs/share/emacs/30.1/lisp/org/ob-calc
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-C hides c:/emacs/share/emacs/30.1/lisp/org/ob-C
c:/users/dpchi/.emacs.d/elpa/org-20210929/ob-awk hides c:/emacs/share/emacs/30.1/lisp/org/ob-awk
c:/users/dpchi/.emacs.d/elpa/tramp-2.7.2.3.1/trampver hides c:/emacs/share/emacs/30.1/lisp/net/trampver
c:/users/dpchi/.emacs.d/elpa/tramp-2.7.2.3.1/tramp hides c:/emacs/share/emacs/30.1/lisp/net/tramp
c:/users/dpchi/.emacs.d/elpa/tramp-2.7.2.3.1/tramp-uu hides c:/emacs/share/emacs/30.1/lisp/net/tramp-uu
c:/users/dpchi/.emacs.d/elpa/tramp-2.7.2.3.1/tramp-sudoedit hides c:/emacs/share/emacs/30.1/lisp/net/tramp-sudoedit
c:/users/dpchi/.emacs.d/elpa/tramp-2.7.2.3.1/tramp-sshfs hides c:/emacs/share/emacs/30.1/lisp/net/tramp-sshfs
c:/users/dpchi/.emacs.d/elpa/tramp-2.7.2.3.1/tramp-smb hides c:/emacs/share/emacs/30.1/lisp/net/tramp-smb
c:/users/dpchi/.emacs.d/elpa/tramp-2.7.2.3.1/tramp-sh hides c:/emacs/share/emacs/30.1/lisp/net/tramp-sh
c:/users/dpchi/.emacs.d/elpa/tramp-2.7.2.3.1/tramp-rclone hides c:/emacs/share/emacs/30.1/lisp/net/tramp-rclone
c:/users/dpchi/.emacs.d/elpa/tramp-2.7.2.3.1/tramp-message hides c:/emacs/share/emacs/30.1/lisp/net/tramp-message
c:/users/dpchi/.emacs.d/elpa/tramp-2.7.2.3.1/tramp-loaddefs hides c:/emacs/share/emacs/30.1/lisp/net/tramp-loaddefs
c:/users/dpchi/.emacs.d/elpa/tramp-2.7.2.3.1/tramp-integration hides c:/emacs/share/emacs/30.1/lisp/net/tramp-integration
c:/users/dpchi/.emacs.d/elpa/tramp-2.7.2.3.1/tramp-gvfs hides c:/emacs/share/emacs/30.1/lisp/net/tramp-gvfs
c:/users/dpchi/.emacs.d/elpa/tramp-2.7.2.3.1/tramp-fuse hides c:/emacs/share/emacs/30.1/lisp/net/tramp-fuse
c:/users/dpchi/.emacs.d/elpa/tramp-2.7.2.3.1/tramp-ftp hides c:/emacs/share/emacs/30.1/lisp/net/tramp-ftp
c:/users/dpchi/.emacs.d/elpa/tramp-2.7.2.3.1/tramp-crypt hides c:/emacs/share/emacs/30.1/lisp/net/tramp-crypt
c:/users/dpchi/.emacs.d/elpa/tramp-2.7.2.3.1/tramp-container hides c:/emacs/share/emacs/30.1/lisp/net/tramp-container
c:/users/dpchi/.emacs.d/elpa/tramp-2.7.2.3.1/tramp-compat hides c:/emacs/share/emacs/30.1/lisp/net/tramp-compat
c:/users/dpchi/.emacs.d/elpa/tramp-2.7.2.3.1/tramp-cmds hides c:/emacs/share/emacs/30.1/lisp/net/tramp-cmds
c:/users/dpchi/.emacs.d/elpa/tramp-2.7.2.3.1/tramp-cache hides c:/emacs/share/emacs/30.1/lisp/net/tramp-cache
c:/users/dpchi/.emacs.d/elpa/tramp-2.7.2.3.1/tramp-archive hides c:/emacs/share/emacs/30.1/lisp/net/tramp-archive
c:/users/dpchi/.emacs.d/elpa/tramp-2.7.2.3.1/tramp-androidsu hides c:/emacs/share/emacs/30.1/lisp/net/tramp-androidsu
c:/users/dpchi/.emacs.d/elpa/tramp-2.7.2.3.1/tramp-adb hides c:/emacs/share/emacs/30.1/lisp/net/tramp-adb
c:/users/dpchi/.emacs.d/elpa/track-changes-1.4/track-changes hides c:/emacs/share/emacs/30.1/lisp/emacs-lisp/track-changes
c:/users/dpchi/.emacs.d/elpa/faceup-20170925.1946/faceup hides c:/emacs/share/emacs/30.1/lisp/emacs-lisp/faceup
c:/emacs/share/emacs/30.1/lisp/emacs-lisp/compat hides c:/users/dpchi/.emacs.d/elpa/compat-30.1.0.0/compat
c:/emacs/share/emacs/30.1/lisp/emacs-lisp/eldoc hides c:/users/dpchi/.emacs.d/elpa/eldoc-1.15.0/eldoc
c:/emacs/share/emacs/30.1/lisp/erc/erc hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc
c:/emacs/share/emacs/30.1/lisp/erc/erc-xdcc hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-xdcc
c:/emacs/share/emacs/30.1/lisp/erc/erc-truncate hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-truncate
c:/emacs/share/emacs/30.1/lisp/erc/erc-track hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-track
c:/emacs/share/emacs/30.1/lisp/erc/erc-status-sidebar hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-status-sidebar
c:/emacs/share/emacs/30.1/lisp/erc/erc-stamp hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-stamp
c:/emacs/share/emacs/30.1/lisp/erc/erc-spelling hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-spelling
c:/emacs/share/emacs/30.1/lisp/erc/erc-speedbar hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-speedbar
c:/emacs/share/emacs/30.1/lisp/erc/erc-sound hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-sound
c:/emacs/share/emacs/30.1/lisp/erc/erc-services hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-services
c:/emacs/share/emacs/30.1/lisp/erc/erc-sasl hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-sasl
c:/emacs/share/emacs/30.1/lisp/erc/erc-ring hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-ring
c:/emacs/share/emacs/30.1/lisp/erc/erc-replace hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-replace
c:/emacs/share/emacs/30.1/lisp/erc/erc-pcomplete hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-pcomplete
c:/emacs/share/emacs/30.1/lisp/erc/erc-page hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-page
c:/emacs/share/emacs/30.1/lisp/erc/erc-notify hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-notify
c:/emacs/share/emacs/30.1/lisp/erc/erc-nicks hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-nicks
c:/emacs/share/emacs/30.1/lisp/erc/erc-networks hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-networks
c:/emacs/share/emacs/30.1/lisp/erc/erc-netsplit hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-netsplit
c:/emacs/share/emacs/30.1/lisp/erc/erc-menu hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-menu
c:/emacs/share/emacs/30.1/lisp/erc/erc-match hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-match
c:/emacs/share/emacs/30.1/lisp/erc/erc-log hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-log
c:/emacs/share/emacs/30.1/lisp/erc/erc-loaddefs hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-loaddefs
c:/emacs/share/emacs/30.1/lisp/erc/erc-list hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-list
c:/emacs/share/emacs/30.1/lisp/erc/erc-lang hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-lang
c:/emacs/share/emacs/30.1/lisp/erc/erc-join hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-join
c:/emacs/share/emacs/30.1/lisp/erc/erc-imenu hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-imenu
c:/emacs/share/emacs/30.1/lisp/erc/erc-identd hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-identd
c:/emacs/share/emacs/30.1/lisp/erc/erc-ibuffer hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-ibuffer
c:/emacs/share/emacs/30.1/lisp/erc/erc-goodies hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-goodies
c:/emacs/share/emacs/30.1/lisp/erc/erc-fill hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-fill
c:/emacs/share/emacs/30.1/lisp/erc/erc-ezbounce hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-ezbounce
c:/emacs/share/emacs/30.1/lisp/erc/erc-desktop-notifications hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-desktop-notifications
c:/emacs/share/emacs/30.1/lisp/erc/erc-dcc hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-dcc
c:/emacs/share/emacs/30.1/lisp/erc/erc-compat hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-compat
c:/emacs/share/emacs/30.1/lisp/erc/erc-common hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-common
c:/emacs/share/emacs/30.1/lisp/erc/erc-capab hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-capab
c:/emacs/share/emacs/30.1/lisp/erc/erc-button hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-button
c:/emacs/share/emacs/30.1/lisp/erc/erc-backend hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-backend
c:/emacs/share/emacs/30.1/lisp/erc/erc-autoaway hides c:/users/dpchi/.emacs.d/elpa/erc-5.6/erc-autoaway
c:/emacs/share/emacs/30.1/lisp/jsonrpc hides c:/users/dpchi/.emacs.d/elpa/jsonrpc-1.0.25/jsonrpc
c:/emacs/share/emacs/30.1/lisp/progmodes/project hides c:/users/dpchi/.emacs.d/elpa/project-0.11.1/project
c:/emacs/share/emacs/30.1/lisp/emacs-lisp/seq hides c:/users/dpchi/.emacs.d/elpa/seq-2.24/seq
c:/emacs/share/emacs/30.1/lisp/net/soap-inspect hides c:/users/dpchi/.emacs.d/elpa/soap-client-3.2.3/soap-inspect
c:/emacs/share/emacs/30.1/lisp/net/soap-client hides c:/users/dpchi/.emacs.d/elpa/soap-client-3.2.3/soap-client
c:/emacs/share/emacs/30.1/lisp/use-package/use-package hides c:/users/dpchi/.emacs.d/elpa/use-package-2.4.6/use-package
c:/emacs/share/emacs/30.1/lisp/use-package/use-package-lint hides c:/users/dpchi/.emacs.d/elpa/use-package-2.4.6/use-package-lint
c:/emacs/share/emacs/30.1/lisp/use-package/use-package-jump hides c:/users/dpchi/.emacs.d/elpa/use-package-2.4.6/use-package-jump
c:/emacs/share/emacs/30.1/lisp/use-package/use-package-ensure hides c:/users/dpchi/.emacs.d/elpa/use-package-2.4.6/use-package-ensure
c:/emacs/share/emacs/30.1/lisp/use-package/use-package-ensure-system-package hides c:/users/dpchi/.emacs.d/elpa/use-package-2.4.6/use-package-ensure-system-package
c:/emacs/share/emacs/30.1/lisp/use-package/use-package-diminish hides c:/users/dpchi/.emacs.d/elpa/use-package-2.4.6/use-package-diminish
c:/emacs/share/emacs/30.1/lisp/use-package/use-package-delight hides c:/users/dpchi/.emacs.d/elpa/use-package-2.4.6/use-package-delight
c:/emacs/share/emacs/30.1/lisp/use-package/use-package-core hides c:/users/dpchi/.emacs.d/elpa/use-package-2.4.6/use-package-core
c:/emacs/share/emacs/30.1/lisp/use-package/use-package-bind-key hides c:/users/dpchi/.emacs.d/elpa/use-package-2.4.6/use-package-bind-key
c:/emacs/share/emacs/30.1/lisp/progmodes/xref hides c:/users/dpchi/.emacs.d/elpa/xref-1.7.0/xref

Features:
(shadow sort mail-extr emacsbug rfc-mode x509-mode x509-asn1-mode
aidermacs aidermacs-output ediff ediff-merg ediff-mult ediff-wind
ediff-diff ediff-help ediff-init ediff-util aidermacs-models
aidermacs-backends aidermacs-backend-comint markdown-mode find-dired
tramp trampver tramp-integration files-x tramp-message tramp-compat xdg
parse-time iso8601 tramp-loaddefs cl-print completion apheleia
apheleia-rcs apheleia-dp apheleia-formatters apheleia-utils apheleia-log
apheleia-formatter-context tabify time-stamp mule-util misearch
multi-isearch shortdoc comp-common help-fns radix-tree vc-git
vc-dispatcher go-mode find-file ffap magit-submodule magit-blame
magit-stash magit-reflog magit-bisect magit-push magit-pull magit-fetch
magit-clone magit-remote magit-commit magit-sequence magit-notes
magit-worktree magit-tag magit-merge magit-branch magit-reset
magit-files magit-refs magit-status magit magit-repos magit-apply
magit-wip magit-log which-func magit-diff smerge-mode git-commit
log-edit message sendmail yank-media puny dino-dired-fixups dired-aux
dired dired-loaddefs rfc822 mml mml-sec epa derived epg rfc6068
epg-config gnus-util mm-decode mm-bodies mm-encode mail-parse rfc2231
rfc2047 rfc2045 mm-util ietf-drums mail-prsvr mailabbrev mail-utils
gmm-utils mailheader pcvs-util add-log magit-core magit-autorevert
time-date magit-margin magit-transient magit-process with-editor server
magit-mode transient benchmark magit-git magit-base magit-section
cursor-sensor crm llama default-text-scale gptel-gemini dpc-gemini gptel
gptel-openai wsd-mode wsd-flycheck company-wsdmode ob-wsdmode ob
ob-tangle ol org-src ob-ref ob-lob ob-table ob-exp ob-comint ob-core
ob-eval org-keys oc org-compat org-macs format-spec wsd-core yasnippet
electric-operator cc-mode cc-fonts cc-guess cc-menus cc-cmds company-box
company-box-icons company-box-doc company-box-util msgu frame-local
company-oddmuse company-keywords company-etags etags fileloop generator
company-gtags company-dabbrev-code company-dabbrev company-files
company-clang company-capf company-cmake company-semantic
company-template company-bbdb company indent-bars face-remap noutline
outline color highlight-chars display-line-numbers autorevert recentf
tree-widget cc-styles cc-align cc-engine cc-vars cc-defs dtrt-indent
cus-edit cus-load wid-edit skeleton httpget dpc-jsonnet-mode-fixups
jsonnet-mode smie powershell advice shell pcomplete eglot
external-completion jsonrpc xref flymake thingatpt project diff
diff-mode track-changes ert pp ewoc debug backtrace filenotify warnings
compile text-property-search comint ansi-osc ring imenu flycheck
ansi-color find-func marginalia compat icomplete edmacro kmacro
use-package-bind-key bind-key hl-line finder-inf dino-utility memoize
dash dpc-sys-windows-nt s cl-extra help-mode use-package-ensure
use-package-core aidermacs-autoloads apheleia-autoloads easy-mmode
async-autoloads caddyfile-mode-autoloads chatgpt-shell-autoloads
command-log-mode-autoloads company-box-autoloads company-autoloads
default-text-scale-autoloads eglot-autoloads eglot-booster-autoloads
electric-operator-autoloads expand-region-autoloads f-autoloads
faceup-autoloads flycheck-autoloads flymake-autoloads
frame-local-autoloads gnu-elpa-keyring-update-autoloads
go-mode-autoloads google-gemini-autoloads gptel-autoloads ht-autoloads
idlwave-autoloads indent-bars-autoloads json-mode-autoloads
json-snatcher-autoloads jsonnet-mode-autoloads logito-autoloads
loop-autoloads lv-autoloads magit-autoloads pcase
magit-section-autoloads llama-autoloads marginalia-autoloads
markdown-mode-autoloads memoize-autoloads msgu-autoloads
multiple-cursors-autoloads org-autoloads path-helper-autoloads
popup-autoloads powershell-autoloads protobuf-mode-autoloads
rego-mode-autoloads reformatter-autoloads request-autoloads
rfc-mode-autoloads rg-autoloads s-autoloads shell-maker-autoloads
spinner-autoloads sr-speedbar-autoloads tblui-autoloads
tablist-autoloads magit-popup-autoloads track-changes-autoloads
tramp-autoloads rx transient-autoloads typescript-mode-autoloads
verilog-mode-autoloads wgrep-autoloads with-editor-autoloads
wsd-mode-autoloads x509-mode-autoloads yaml-mode-autoloads
yasnippet-autoloads yaxception-autoloads info dash-autoloads package
browse-url url url-proxy url-privacy url-expand url-methods url-history
url-cookie generate-lisp-file url-domsuf url-util mailcap url-handlers
url-parse auth-source cl-seq eieio eieio-core cl-macs icons
password-cache json subr-x map byte-opt gv bytecomp byte-compile
url-vars cl-loaddefs cl-lib rmc iso-transl tooltip cconv eldoc paren
electric uniquify ediff-hook vc-hooks lisp-float-type elisp-mode mwheel
touch-screen dos-w32 ls-lisp disp-table term/w32-win w32-win w32-vars
term/common-win tool-bar dnd fontset image regexp-opt fringe
tabulated-list replace newcomment text-mode lisp-mode prog-mode register
page tab-bar menu-bar rfn-eshadow isearch easymenu timer select
scroll-bar mouse jit-lock font-lock syntax font-core term/tty-colors
frame minibuffer nadvice seq simple cl-generic indonesian philippine
cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao
korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech
european ethiopic indian cyrillic chinese composite emoji-zwj charscript
charprop case-table epa-hook jka-cmpr-hook help abbrev obarray oclosure
cl-preloaded button loaddefs theme-loaddefs faces cus-face macroexp
files window text-properties overlay sha1 md5 base64 format env
code-pages mule custom widget keymap hashtable-print-readable backquote
threads w32notify w32 lcms2 multi-tty move-toolbar make-network-process
native-compile emacs)

Memory information:
((conses 16 672435 122634) (symbols 48 39095 1) (strings 32 196605 7313)
 (string-bytes 1 5493821) (vectors 16 73230) (vector-slots 8 1545967 128424)
 (floats 8 462 15256) (intervals 56 9860 577) (buffers 992 21))