Como aplicar o `call-interactively` a um comando interativo que aceita o argumento universal?

8

Eu li a documentação sobre como fazer chamadas interativas no Elisp, mas ainda não consigo descobrir como passar o argumento universal ao usar call-interactivelyum comando que reconheça o argumento universal.

Mais especificamente, quero implementar uma função que, sob certas condições, chame o shellcomando interativamente com o argumento universal , para que, como resultado, o prompt

Shell buffer (default *shell*): 

ficará visível no minibuffer e, assim que esse prompt obtiver uma resposta, o buffer especificado será criado (se já não existir) e o buffer atual será criado.


FWIW, tentei o seguinte:

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

e

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

... mas eu nunca vi o prompt Shell buffer (default *shell*):; em vez disso, em todos os casos, o shellcomando foi executado exatamente como se tivesse sido chamado sem o argumento universal. (Eu realmente não sei o que estou fazendo aqui, por isso minhas tentativas cegas acima foram feitas com desconsideração consciente dos conselhos prescientes da documentação .)

kjo
fonte
2
Tente(let ((current-prefix-arg 4)) (call-interactively 'shell))
xuchunyang 15/04/16
Obrigado! Aceitarei com prazer isso como resposta, se você quiser publicá-lo como tal.
KJo

Respostas:

8

De acordo com shella forma interativa, contanto que current-prefix-argseja nulo, shellsolicitará ao usuário um buffer para usar, para que você possa definir current-prefix-argcomo nulo (4 é usado a seguir como exemplo):

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

ou simule a execução shellcom um prefixo 4 ( M-4 M-x shell):

(execute-extended-command 4 "shell")
xuchunyang
fonte
Apenas uma pequena queixa: se alguém usará um valor de tverdade que não seja velho , não deveria ser (list 4)(ou '(4)se você preferir)? Percebo que a versão atual de shellnão se importa com a diferença entre 4e (list 4)(importa apenas que o valor seja não nil), mas versões futuras podem.
KJo
4simula M-4 M-x shell, '(4)simulaC-u M-x shell
npostavs