暗无天日

=============>DarkSun的个人博客

TIL: minibuffer-replace-input——递归 minibuffer 中插入内容

minibuffer 是可以递归的,在 C-x C-f 的 minibuffer 里按 M-! 执行 shell 命令,或在 M-x 里按 C-h v 查看变量帮助,都会打开内层 minibuffer。问题是输入区域属于内层,想把内层打的字搬到外层,Emacs 没有内置命令支持。

Omar Antolin Camarena 在 [Emacs Chat 24](https://sachachua.com/blog/2026/05/karthik-s-notes-on-emacs-chat-24-omar-antolin-camarena/) 提到这个痛点,和 Daniel Mendler 一起写了解决方案:

(defun minibuffer-replace-input (&optional arg)
  "Replace original minibuffer input.

When a recursive minibuffer is active, insert the current string
into the original minibuffer input.  With prefix ARG, replace it
instead."
  (interactive "P")
  (when (and (minibufferp) (> (minibuffer-depth) 1))
    (let* ((replacement (minibuffer-contents)))
      (unwind-protect (minibuffer-quit-recursive-edit)
        (run-at-time 0 nil
                     (lambda (rep)
                       (when arg (delete-minibuffer-contents))
                       (insert rep)
                       (pulse-momentary-highlight-one-line))
                     replacement)))))

先用 minibuffer-contents 拿到当前输入,退出递归 minibuffer,再用 run-at-time 0 在下一个事件循环里插入到正确的位置。

不带前缀参数时是追加,带前缀参数时是替换。插入后会短暂高亮一行。

Emacs : TIL : minibuffer : Elisp