ปัญหาที่น่าสนใจ ดูเหมือนว่าบรรณาธิการทำงานทุกครั้งที่มันเข้ามาใหม่คำสั่งห่วงเช่นpost-command-hook
recursive-edit
แต่เราสามารถเริ่มต้นด้วยminibuffer-setup-hook
การทำงานของฟังก์ชั่นหลังจากเข้าสู่ minibuffer ในขณะที่สิ่งนี้ช่วยให้การแทรกของอินพุตมันเร็วเกินไปที่จะออกจาก minibuffer เพราะจับยังไม่ได้ติดตั้ง
(defmacro with-minibuffer-input (form &rest inputs)
(declare (indent 1))
`(minibuffer-with-setup-hook
(lambda ()
(minibuffer-input-provider ',inputs))
,form))
ที่ของคนเราต้องห่อ 'การขัดแย้งในตัวเอง 'ห่วงคำสั่ง' ของเราซึ่งได้รับการดำเนินการของทุกครั้งที่เราเข้าสู่จุดที่มันปรากฏหนึ่งอาร์กิวเมนต์และพ่นระดับหนึ่งขึ้นผ่านrecursive-edit
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
ข้อของมัน เมื่อถูกเรียกจาก elisp คุณควรจะสามารถส่งผ่านข้อมูลเป็นอาร์กิวเมนต์ของฟังก์ชันได้ แน่นอนว่าสิ่งนี้ไม่ได้ช่วยคุณในกรณีที่ฟังก์ชั่นที่คุณพยายามโทรไม่เป็นไปตามการออกแบบนี้