¿Cómo aplicar `call-interactively` a un comando interactivo que acepta el argumento universal?

8

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-interactivelyen un comando que reconoce el argumento universal.

Más específicamente, quiero implementar una función que, bajo ciertas condiciones, debería llamar al shellcomando 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 shellcomando 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 ).

kjo
fuente
2
Prueba(let ((current-prefix-arg 4)) (call-interactively 'shell))
xuchunyang
¡Gracias! Con mucho gusto aceptaré esto como respuesta si te interesa publicarlo como tal.
kjo

Respuestas:

8

De acuerdo con shellel formulario interactivo, siempre que current-prefix-argno sea nulo, shellle pedirá al usuario un búfer para usar, por lo que puede establecerlo current-prefix-argen no nulo (se usa 4 como ejemplo a continuación):

(let ((current-prefix-arg 4))
  (call-interactively 'shell))

o simule la ejecución shellcon un prefijo 4 ( M-4 M-x shell):

(execute-extended-command 4 "shell")
xuchunyang
fuente
Solo una pequeña objeción: si uno va a usar un valor de verdad distinto al viejo t, ¿no debería ser eso (list 4)(o '(4)si lo prefiere)? Me doy cuenta de que a la versión actual de shellno le importa la diferencia entre 4y (list 4)(solo le importa que el valor sea no nil), pero las versiones futuras sí.
kjo
4simula M-4 M-x shell, '(4)simulaC-u M-x shell
npostavs