興味深い問題。エディタ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))
我々は、GETのは、我々が入るたびに実行され、私たち自身の「コマンドループ」、の「引数のラップする必要があったことをrecursive-edit
経由して、それは一つの引数をポップし、1つ上のレベルに投げた時点では、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から呼び出されると、情報を関数の引数として渡すことができるはずです。もちろん、これはあなたが助けようとしている関数がこの設計に従っていない場合、あなたを助けません。