재미있는 문제. post-command-hook
새 명령 루프를 입력 할 때마다 편집기가 실행되는 것처럼 보입니다 ( 예 : a) 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
절 에 그러한 정보를 요구해야합니다 . elisp에서 호출하면 정보를 함수 인수로 전달할 수 있어야합니다. 물론 호출하려는 함수가이 디자인을 따르지 않는 경우에는 도움이되지 않습니다.