Inicie o comando shell interativo como um buffer do emacs

Inicie o comando shell interativo como um buffer do emacs

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 terme ansi-termjá; 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 ylinhas 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> & disowne/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.

informação relacionada