emacs-jp に書いたやつ。
(defun vertico--compare-prefer-prefix (x y)
(let ((content (or (car-safe vertico--input) (minibuffer-contents))))
(pcase (cons (string-prefix-p content x) (string-prefix-p content y))
((or '(t . t) '(nil . nil)) (vertico--length-string< x y))
(`(,match . ,_) match))))
(defun vertico-sort-prefer-prefix (candidates)
(sort candidates #'vertico--compare-prefer-prefix))
(setq completion-styles '(orderless))
(setq vertico-sort-override-function #'vertico-sort-prefer-prefix)
history も考慮させるなら、vertico--define-sort
を使う必要がある (それか全部自分で実装する)。バケットの先頭二つを history と perfix 用にするとかになるのかな。