consult 有没有办法让 annotation 也被搜索?

先说动机, bookmark-jump(consult-bookmark) 我希望也能搜索 bookmark 所在的文件, 但 path 是 annotation 的一部分, 无法被检索, 我想问有没有办法让 annotation 也被检索?

我也不确定 annotation 默认到底能不能被搜索, consult-yasnippet 我发现是能搜索到 annotation 的

不是 consult-yasnippet 能搜索 annotation,是 consult-yasnippet 用了障眼法。

  1. 运行一个最小配置的 Emacs
$ emacsq.sh -P use-package,yasnippet,vertico,consult,consult-yasnippet --eval "\
         (progn
           (use-package vertico
             :init
             (vertico-mode))

           (use-package consult)

           (use-package yasnippet
             :config
             (yas-reload-all)
             (yas-global-mode))

           (use-package consult-yasnippet
             :after (consult yasnippet)
             :bind ((\"M-,\" . consult-yasnippet))))"
  1. 验证"搜索" annotation

image
(Fig.1 输入 f,显示匹配到所有 f 开头的 annotation)

image
(Fig.2 输入空格 + x, 显示匹配到所有 x 开头的 candidate)

好像真的是可以搜索 annotation,实则是 consult-yasnippet 耍了一点小聪明,把 annotation 直接拼接到 candidate 前面:

new-candidate <- (concate invisible-annotation raw-candidate)

以下代码实现相同的效果:

(let ((dict '(("foo" . "1") ("bar" . "2"))))
  (consult--read
   (mapcar (pcase-lambda (`(,cand . ,val))
             (concat (propertize (concat val " ") 'invisible t)
                     cand))
           dict)
   :annotate (lambda (cand) (concat " " (cdr (assoc (substring cand 2) dict))))
   ))

image

2 个赞