Lança o comando shell interativo como um buffer do emacs

1

Gostaria de executar um comando shell que faça algumas perguntas interativas antes de prosseguir, a partir do Emacs. A funcionalidade que estou procurando é como xterm -e <command> , apenas com uma janela do Emacs se abrindo. Ele não precisaria de muita capacidade de emulação de terminal (é basicamente pressionar "y" algumas vezes), mas ainda precisa de entrada de teclado. É possível fazer isso de alguma forma?

Já tentei usar term e ansi-term ; quando recebe um comando que é diferente de / bin / bash, ambos fecham imediatamente, sem deixar nenhum tempo para ler qual era o problema.

    
por Latanius 01.05.2015 / 06:12

2 respostas

1

Resposta curta:

M-x terminal-emulator

parece exatamente com o que você está pedindo.

O que você precisa pode ser diferente - se você realmente só precisa dar ao programa uma série de y linhas em stdin, considere yes | program . Se o programa realmente quiser que seu stdin seja um tty, considere usar expect .

    
por 01.05.2015 / 15:53
0

Você pode fazer uma macro de edição do emacs ("editar macros" de onde o nome "emacs" é derivado) e nos comandos de macro put do teclado que executam scripts Gnu Bash ou outros programas shell e criar scripts que consultem o usuário. S ou N responde.

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 de lisp do emacs que você carrega para reutilização.

A macro seria, naturalmente, utilizável a partir de então dentro do emacs e / ou você poderia rodar tudo como um arquivo de lote, a partir da linha de comando, como qualquer outro programa.

Outras ferramentas e sugestões: Examine a edição recursiva do emacs (que interrompe e reinicia macros e fornece ao usuário final tempo para responder a perguntas ou até mesmo editar coisas) e a mensagem ou caixa de funções interna do emacs ou apenas a função de mensagem. Você pode usar o tkquery (um programa Tcl / Tk fácil de configurar que consulta os usuários para dados de entrada) e / ou usar o zenity para criar caixas de interação gráficas simples, 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 do Make em execução, você poderia usar a string de envio do processo, como esta excerto de um dos meus makefiles:

echo "(process-send-string \"*compilation*\" \" \n \") "

Quero dizer, você poderia usar a função process-send-string do emacs para se comunicar e responder perguntas do tipo Y-or-N com um programa Gnu Make rodando dentro de um buffer do Gnu Emacs.

Por fim, volte à sua pergunta e pergunte por que xterm -e <your-program> está terminando rapidamente: você pode 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; Quer dizer, você quer impedir que o programa seja executado enquanto o usuário final responde à (s) pergunta (s) 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ê pode fazer com que ele faça o que você quer de alguma forma - se você o estender programando você mesmo.

    
por 03.05.2015 / 03:33