Masalah menarik. Sepertinya editor menjalankan post-command-hooksetiap kali memasuki loop-perintah baru, yaitu a recursive-edit. Tapi kita bisa mulai dengan minibuffer-setup-hook, yang menjalankan fungsi setelah memasuki minibuffer. Meskipun ini memungkinkan memasukkan input, masih terlalu cepat untuk keluar dari minibuffer, karena tangkapan belum diatur.
(defmacro with-minibuffer-input (form &rest inputs)
(declare (indent 1))
`(minibuffer-with-setup-hook
(lambda ()
(minibuffer-input-provider ',inputs))
,form))
Itu adalah bahwa kita perlu untuk membungkus 'argumen' di dalam 'loop perintah' kita sendiri, yang dijalankan setiap kali kita memasukkan a recursive-edit, di mana saat itu muncul satu argumen dan melemparkan satu tingkat ke atas, melalui 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
interactiveklausulnya. Ketika dipanggil dari elisp, Anda harus dapat meneruskan informasi sebagai argumen fungsi. Tentu saja, ini tidak membantu Anda, jika fungsi yang Anda coba panggil tidak mengikuti desain ini.