Interesante problema Parece que el editor se ejecuta post-command-hook
cada vez que ingresa un nuevo ciclo de comandos, es decir, a recursive-edit
. Pero podemos comenzar con minibuffer-setup-hook
, que ejecuta una función después de ingresar al minibúfer. Si bien esto permite la inserción de la entrada, es demasiado pronto para salir del minibúfer, porque aún no se ha configurado la captura.
(defmacro with-minibuffer-input (form &rest inputs)
(declare (indent 1))
`(minibuffer-with-setup-hook
(lambda ()
(minibuffer-input-provider ',inputs))
,form))
Ahí es donde necesitamos envolver los 'argumentos' en nuestro propio 'bucle de comandos', que se ejecuta cada vez que ingresamos a recursive-edit
, en ese punto aparece un argumento y sube un nivel, a través de 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
cláusula. Cuando se llama desde elisp, debería poder pasar la información como un argumento de función. Por supuesto, esto no le ayuda, en caso de que la función que está intentando llamar no siga este diseño.