He leído la documentación sobre cómo hacer llamadas interactivas desde Elisp, pero todavía no puedo entender cómo pasar el argumento universal cuando lo uso call-interactively
en un comando que reconoce el argumento universal.
Más específicamente, quiero implementar una función que, bajo ciertas condiciones, debería llamar al shell
comando interactivamente con el argumento universal , de modo que, como resultado, la solicitud
Shell buffer (default *shell*):
será visible en el minibúfer y, una vez que este mensaje reciba una respuesta, se creará el búfer especificado (si aún no existe) y se convertirá en el búfer actual.
FWIW, probé lo siguiente:
(universal-argument)
(call-interactively 'shell)
y
(setq prefix-arg (list 4))
(call-interactively 'shell)
... pero nunca vi el aviso Shell buffer (default *shell*):
; en cambio, en todos los casos, el shell
comando se ejecutó exactamente como si se hubiera llamado sin el argumento universal. (Realmente no sé lo que estoy haciendo aquí, por lo que mis intentos a ciegas anteriores se hicieron sin tener en cuenta los consejos proféticos de la documentación ).
(let ((current-prefix-arg 4)) (call-interactively 'shell))
Respuestas:
De acuerdo con
shell
el formulario interactivo, siempre quecurrent-prefix-arg
no sea nulo,shell
le pedirá al usuario un búfer para usar, por lo que puede establecerlocurrent-prefix-arg
en no nulo (se usa 4 como ejemplo a continuación):o simule la ejecución
shell
con un prefijo 4 ( M-4 M-x shell):fuente
t
, ¿no debería ser eso(list 4)
(o'(4)
si lo prefiere)? Me doy cuenta de que a la versión actual deshell
no le importa la diferencia entre4
y(list 4)
(solo le importa que el valor sea nonil
), pero las versiones futuras sí.4
simulaM-4 M-x shell
,'(4)
simulaC-u M-x shell