Comment appliquer `call-interactively` à une commande interactive qui accepte l'argument universel?

8

J'ai lu la documentation sur la façon de faire des appels interactifs à partir d'Elisp, mais je n'arrive toujours pas à comprendre comment passer l'argument universel lors de l'utilisation call-interactivelyd'une commande qui reconnaît l'argument universel.

Plus précisément, je veux implémenter une fonction qui, dans certaines conditions, devrait appeler la shellcommande de manière interactive avec l'argument universel , de sorte que, par conséquent, l'invite

Shell buffer (default *shell*): 

sera visible dans le mini-tampon, et, une fois que cette invite obtiendra une réponse, le tampon spécifié sera créé (s'il n'existe pas déjà) et créé le tampon actuel.


FWIW, j'ai essayé ce qui suit:

(universal-argument)
(call-interactively 'shell)

et

(setq prefix-arg (list 4))
(call-interactively 'shell)

... mais je n'ai jamais vu l'invite Shell buffer (default *shell*):; à la place, dans tous les cas, la shellcommande s'exécutait exactement comme si elle avait été appelée sans l'argument universel. (Je ne sais vraiment pas ce que je fais ici, donc mes tentatives aveugles ci-dessus ont été faites avec un mépris conscient des conseils prémonitoires de la documentation .)

kjo
la source
2
Essayez(let ((current-prefix-arg 4)) (call-interactively 'shell))
xuchunyang
Je vous remercie! Je l'accepterai volontiers comme réponse si vous souhaitez l'afficher en tant que tel.
kjo

Réponses:

8

Selon shellle formulaire interactif de, tant qu'il current-prefix-argest non nul, shellil demandera à l'utilisateur un tampon à utiliser, vous pouvez donc le définir current-prefix-argsur non nul (4 est utilisé dans l'exemple suivant):

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

ou simuler l'exécution shellavec un préfixe 4 ( M-4 M-x shell):

(execute-extended-command 4 "shell")
xuchunyang
la source
Juste un petit problème: si l'on veut utiliser une valeur véridique autre que simplement ancienne t, cela ne devrait-il pas être (list 4)(ou '(4)si vous préférez)? Je me rends compte que la version actuelle de shellne se soucie pas de la différence entre 4et (list 4)(il se soucie seulement que la valeur est non nil), mais les versions futures le pourraient.
kjo
4simule M-4 M-x shell, '(4)simuleC-u M-x shell
npostavs