Vấn đề thú vị. Có vẻ như trình soạn thảo chạy post-command-hook
mỗi khi nó vào một vòng lệnh mới, tức là a recursive-edit
. Nhưng chúng ta có thể bắt đầu với minibuffer-setup-hook
, nó thực thi một chức năng sau khi vào xe buýt nhỏ. Mặc dù điều này cho phép chèn đầu vào, nhưng quá sớm để thoát khỏi bộ thu nhỏ, bởi vì sản phẩm khai thác chưa được thiết lập.
(defmacro with-minibuffer-input (form &rest inputs)
(declare (indent 1))
`(minibuffer-with-setup-hook
(lambda ()
(minibuffer-input-provider ',inputs))
,form))
Đó là chúng ta cần phải bọc 'đối số' trong 'vòng lệnh' của chính chúng ta, được thực thi mỗi khi chúng ta nhập vào recursive-edit
, tại đó nó sẽ bật một đối số và ném lên một cấp, thông qua exit-minibuffer
.
;; -*- lexical-binding: t -*-
(defun minibuffer-input-provider (inputs)
(let ((hook (make-symbol "hook")))
(fset hook (lambda ()
(remove-hook 'post-command-hook hook)
(when inputs
(when (= 0 (minibuffer-depth))
(error "Too many inputs"))
(when (cdr inputs)
(add-hook 'post-command-hook hook))
(insert (pop inputs))
(exit-minibuffer))))
(add-hook 'post-command-hook hook)))
(with-minibuffer-input (call-interactively 'find-file)
"/")
(with-minibuffer-input (call-interactively 'occur)
"\\(foo\\)\\(bar\\)" "\\1");;C-u C-x C-e
;;foobar
(with-minibuffer-input (call-interactively 'replace-string)
"foo" "bar")
;; foo
interactive
mệnh đề của nó . Khi được gọi từ elisp, bạn sẽ có thể truyền thông tin dưới dạng đối số hàm. Tất nhiên, điều này không giúp ích gì cho bạn, trong trường hợp chức năng bạn đang cố gắng gọi không theo thiết kế này.