feat(minibuffer): prioritize basename matches in vertico file completion

This commit is contained in:
kj
2026-10-05 10:04:12 -03:00
parent 912be83895
commit a8f91dade3
+27 -1
View File
@@ -115,7 +115,33 @@
(setq read-file-name-completion-ignore-case t
read-buffer-completion-ignore-case t
completion-ignore-case t)
)
:config
;; Prioriza el basename sobre la ruta en comandos de archivo (categorías
;; `file' y `project-file'); en el resto respeta el orden normal. Rank:
;; 0 exacto (nombre o sin extensión), 1 prefijo, 2 subcadena, 3 solo carpeta.
(defun kj/vertico--rank (cand query)
"Return match rank of CAND's basename against QUERY (0 best, 3 worst)."
(let ((name (downcase (file-name-nondirectory (directory-file-name cand)))))
(cond ((or (string= name query) (string= (file-name-sans-extension name) query)) 0)
((string-prefix-p query name) 1)
((string-search query name) 2)
(t 3))))
(defun kj/vertico-sort (cands)
"Prioritize basename matches for file candidates; default order otherwise."
(let* ((base (or (vertico--metadata-get 'display-sort-function)
vertico-sort-function))
(cands (if base (funcall base (copy-sequence cands)) cands))
(query (and (memq (vertico--metadata-get 'category) '(file project-file))
(car (last (split-string (minibuffer-contents) "[ \t\n]+" t))))))
(if (or (null query) (string-suffix-p "/" query))
cands
(setq query (downcase (file-name-nondirectory query)))
(mapcar #'cdr (sort (mapcar (lambda (c) (cons (my/vertico--rank c query) c))
cands)
#'car-less-than-car)))))
(setq vertico-sort-override-function #'kj/vertico-sort))
(provide 'init-minibuffer)
;;; init-minibuffer.el ends here