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-interactively
d'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 shell
commande 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 shell
commande 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 .)
(let ((current-prefix-arg 4)) (call-interactively 'shell))
Réponses:
Selon
shell
le formulaire interactif de, tant qu'ilcurrent-prefix-arg
est non nul,shell
il demandera à l'utilisateur un tampon à utiliser, vous pouvez donc le définircurrent-prefix-arg
sur non nul (4 est utilisé dans l'exemple suivant):ou simuler l'exécution
shell
avec un préfixe 4 ( M-4 M-x shell):la source
t
, cela ne devrait-il pas être(list 4)
(ou'(4)
si vous préférez)? Je me rends compte que la version actuelle deshell
ne se soucie pas de la différence entre4
et(list 4)
(il se soucie seulement que la valeur est nonnil
), mais les versions futures le pourraient.4
simuleM-4 M-x shell
,'(4)
simuleC-u M-x shell