दिलचस्प समस्या है। ऐसा लगता है कि संपादक post-command-hook
हर बार नए कमांड-लूप में प्रवेश करता है, यानी ए recursive-edit
। लेकिन हम इसके साथ शुरू कर सकते हैं minibuffer-setup-hook
, जो मिनीबफ़र में प्रवेश करने के बाद एक फ़ंक्शन को निष्पादित करता है। हालांकि यह इनपुट डालने की अनुमति देता है, यह मिनीबफ़र से बाहर निकलने के लिए बहुत जल्द है, क्योंकि पकड़ अभी तक सेटअप नहीं की गई है।
(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
खंड में संकेत देना चाहिए । जब आपको एलीस्प से बुलाया जाता है, तो आपकी जानकारी को फ़ंक्शन तर्क के रूप में पास करने में सक्षम होना चाहिए। बेशक, यह आपकी मदद नहीं करता है, यदि आप जिस फ़ंक्शन को कॉल करने का प्रयास कर रहे हैं वह इस डिज़ाइन का पालन नहीं करता है।