
Gostaria de executar um comando shell que faça algumas perguntas interativas antes de prosseguir, no Emacs. A funcionalidade que estou procurando é semelhante xterm -e <command>
, apenas com uma janela do Emacs abrindo. Não precisaria de muita capacidade de emulação de terminal (basicamente pressionar "y" algumas vezes), mas ainda precisa de entrada do teclado. É possível fazer isso de alguma forma?
Eu tentei usar term
e ansi-term
já; ao receber um comando diferente de /bin/bash, ambos fecham imediatamente, sem deixar tempo para ler qual era o problema.
Responder1
Resposta curta:
M-x terminal-emulator
soa exatamente como o que você está pedindo.
O que vocêprecisarpode ser diferente - se você realmente precisa apenas fornecer ao programa uma série de y
linhas no stdin, considere yes | program
. Se o programa realmente deseja que seu stdin seja um tty, considere usar expect
.
Responder2
Você pode criar uma macro de edição do emacs ("macros de edição" é a origem do nome "emacs") e na macro do teclado colocar comandos que executam scripts Gnu Bash ou outros programas shell e criar scripts que consultam o usuário por Y ou N respostas.
Então, para criar a macro, você faria algo assim:
Cx (
Mx new-frame return
Mx shell return (or just Mx eshell return--to use the emacs built-in shell)
bash <bash-program-that-queries-end-user-for-Y-or-N-answers> &
Mx delete-frame
Cx )
Salve a macro e coloque-a em um programa emacs lisp que você carrega para reutilização.
É claro que a macro seria utilizável a partir de então no emacs e/ou você poderia executar tudo como um arquivo em lote, a partir da linha de comando, como qualquer outro programa.
Outras ferramentas e sugestões: consulte a edição recursiva do emacs (que interrompe e reinicia macros e dá ao usuário final tempo para responder perguntas ou até mesmo editar coisas) e a função interna do emacs mensagem ou caixa ou apenas a mensagem função. Você pode usar o tkquery (um programa Tcl/Tk fácil de configurar que consulta os usuários em busca de dados de entrada) e/ou usar o zenity para criar caixas de interação gráfica simples que sejam fáceis de programar e fáceis de usar pelos usuários finais.
Você poderia criar uma rotina de perguntas e respostas no Gnu Make e executá-la dentro do Gnu Emacs. Para fazer isso e interagir com uma sessão Make em execução, você poderia usar process-send-string como este trecho de um dos meus makefiles:
echo "(process-send-string \"*compilation*\" \" \\n \") "
Quero dizer, você pode usar a função process-send-string do emacs para se comunicar e responder perguntas Y ou N com um programa Gnu Make em execução que está sendo executado dentro de um buffer Gnu Emacs.
Por fim, voltando à sua pergunta e perguntando por que xterm -e <your-program>
está encerrando rapidamente: você poderia simplesmente fazer coisas como emacs -l <emacs-lisp-file-with-question-and-answer-macro-in-it> & disown
e/ou xterm -e <your-program-which-queries-the-end-users> & disown
. Mas isso depende de como você deseja executar o programa, como um processo síncrono ou assíncrono; Quero dizer, você deseja bloquear a execução do programa enquanto o usuário final responde às perguntas ou não?
Com essas ferramentas em mãos, acho que você pode conseguir o que deseja com o Gnu Emacs; e, como o Gnu Emacs é extensível, você certamente pode fazer com que ele faça o que quiser de alguma forma - se você estendê-lo programando-o você mesmo.