Ocasionalmente, me pego usando funções interativas dentro de uma função que estou escrevendo para meu próprio uso. Se uma função solicitar algumas informações (por exemplo, "Arquivo de saída: ~ /"), existe uma maneira geral de adicionar texto ao minibuffer e pressione enter para que o usuário não precise fazer isso?
Como exemplo, suponha que eu queira executar org-latex-export-to-pdf
dentro de uma função, mas não quero que o usuário precise especificar um nome de arquivo. Correr (org-latex-export-to-pdf)
moverá o ponto para o minibuffer, mas colocar algo como (insert "filename.tex")
na próxima linha não parece funcionar.
interactive
cláusula. Quando chamado de elisp, você deve ser capaz de passar as informações como argumento de função. Obviamente, isso não ajuda, caso a função que você está tentando chamar não siga esse design.Respostas:
Problema interessante. Parece que o editor é executado
post-command-hook
toda vez que entra em um novo loop de comando, ou seja, arecursive-edit
. Mas podemos começar comminibuffer-setup-hook
, que executa uma função depois de inserir o minibuffer. Embora isso permita a inserção de entrada, é muito cedo para sair do minibuffer, porque a captura ainda não foi configurada.É aí que precisamos envolver os 'argumentos' em nosso próprio 'loop de comando', que são executados toda vez que inserimos a
recursive-edit
, quando ele abre um argumento e sobe um nível, viaexit-minibuffer
.fonte
Eu escrevi uma macro para isso chamada
with-simulated-input
, que você pode obter aqui . Ele permite que você forneça entradas arbitrárias, bem como execute formulários arbitrários de lisp para simular a interação do usuário.Por exemplo:
retornaria
"hello world"
, com o "hello" inserido pela primeira string, o "world" inserido via código lisp e, finalmente, "RET" para finalizar a entrada.Ele vem com um conjunto de testes que você pode ver para obter mais exemplos de uso.
fonte
Parece que o uso
run-with-timer
cominsert
fará o trabalho.O comando,
insert
quando colocado depois, está surgindo muito rapidamente. Ele tenta inserir a string antes que haja um local para inseri-la.fonte
org-export-output-file-name
usá-org-latex-export-to-pdf
lo para que o usuário não seja solicitado. Você pode colocar seus esforços na questão - por exemplo,run-with-timer
etc. - no entanto, não é uma boa solução (na minha opinião). A melhor solução é passar adequadamente um nome de arquivo programaticamente, para que o minibuffer nunca seja aberto. Eu recomendaria excluir esta resposta para que você obtenha uma solução melhor por alguém com maiselisp
experiência.org-latex-export-to-pdf
não é a que me interessa. É um exemplo, já que você parecia querer que eu adicionasse um. A pergunta que fiz foi a que eu quis dizer: existe uma maneira de responder com segurança a um prompt do minibuffer através do elisp. Uma solução caso a caso não é muito o que estou procurando. Pelo seu comentário, posso deduzir que isso não é recomendado.