[请教] 如何为 Emacs 输入历史记录添加前缀过滤??

Emacs 默认有一个输入记录, 比如在 minibuffer 或者 eshell 按键 M-n/M-p 就可以填入之前的记录.

比如之前的输入记录有以下:

A: aaa

B: bbb

C: ccc

其中 A 记录是最新的, 常规的 M-p 只能从 A → B → C 顺序访问.

是否可以当我输入 c 后 M-p 直接匹配存在 c 开头的最近记录?

consult-M-x的默认行为是这样的,原版的话只能手动改补全后端了吧,不知道有没有配置项。

试试 M-r ? 可以输入一些关键字,查找输入记录。


我是这么发现快捷键的:

  • 先打开 minibuffer,然后执行 C-h k(describe-key),然后输入 M-p 看看它执行的函数是什么
  • 我看到的是 (previous-history-element N),这样我知道可能有一些 previous-hisotry- 相关的函数
  • 然后执行 C-h f(describe-function),输入 previous-hisotry-, 我就发现了 (previous-matching-history-element REGEXP N) 然后看到它绑定在了 M-r 上。
(defun my-insert-candidate (cands &optional preinput)
  "Select item from CANDS,delete things and insert item."
  (let* ((choice
		  (completing-read "History: " cands nil t  preinput)))
	(delete-region (line-beginning-position) (point))
	(insert choice)))

(defun my-select-from-minibuffer-history ()
  "Select an item from minibuffer history using `completing-read`."
  (interactive)
  (my-insert-candidate minibuffer-history (minibuffer-contents-no-properties)))

(keymap-set minibuffer-local-map "C-r" 'my-select-from-minibuffer-history)

我自己搞得一个trivial的实现