É possível ler a entrada do usuário do STDIN enquanto emaranha um bloco de origem org-babel-tangle
?
Estou ciente disso: Org Mode Babel - avaliação interativa de blocos de código .
Isso não ajuda a resolver esse caso de uso específico, pois ainda não permite a entrada adequada de STDIN do shell, mas simula apenas uma entrada limitada internamente para o Emacs.
fundo
Eu gostaria de usar o Babel da organização para aprender novas linguagens de programação (Perl e Bash) executando alguns tutoriais em um arquivo organizacional.
O problema é que muitos tutoriais contam com o STDIN. Por exemplo, se alguém executar o seguinte perl tidbit:
#+BEGIN_SRC perl :tangle hello-name.pl :results output :export code
use 5.010;
use strict;
use warnings;
say "What is your name?";
my $name=<STDIN>;
say "Hello $name, how are you?";
#+END_SRC
O Emacs não aguardará a interação do usuário digitar corretamente um nome no STDIN e produzirá imediatamente:
#+RESULTS:
: What is your name?
: Hello , how are you?
A mesma coisa usando um exemplo do bash. Este:
#+BEGIN_SRC sh :results output :export code :tangle dir-input.sh
#!/bin/bash
if [ -z "$TEST_DIR" ]
then
echo "TEST_DIR was not set, please enter the path: "
read input_variable
export TEST_DIR=$input_variable
fi
#+END_SRC
Não esperará pela entrada do usuário e o Emacs retornará imediatamente isso:
#+RESULTS:
: TEST_DIR was not set, please enter the path:
Existe uma maneira nativa do Emacs aguardar a entrada em um bloco emaranhado em execução?
Caso contrário, por favor, dê algumas dicas sobre como escrever algo como uma tangle-and-run-via-shell-buffer
função que:
- Emaranhe o bloco de código no ponto, salvando com o nome de arquivo fornecido,
- execute o arquivo correspondente em um
shell
buffer visível , - possivelmente aceitando informações do usuário,
- e finalmente informando
STDOUT
, se houver, para#+RESULTS:
?
Se esse recurso ainda não foi implementado na Org, como alguém poderia implementá-lo com o elisp?
Atualização: Depois de pesquisar e estudar mais os manuais do Emacs e elisp, parece que a maneira de fazer isso seria alavancar o Comint , como talvez make-comint-in-buffer
.
(make-comint-in-buffer "*cmd-buffer*" nil "perl" nil "hello-name.pl")
Infelizmente, isso está na minha cabeça agora 😣