È possibile leggere l'input dell'utente da STDIN mentre si aggroviglia un blocco sorgente con org-babel-tangle
?
Sono consapevole di questo: Org Mode Babel - Valutazione interattiva del blocco di codice .
Ciò non aiuta a risolvere questo particolare caso d'uso, poiché non consente ancora l'input STDIN corretto dalla shell, ma simula solo un input limitato internamente a Emacs.
sfondo
Vorrei usare Org's Babel per imparare nuovi linguaggi di programmazione (Perl e Bash) eseguendo alcuni tutorial da un unico file dell'organizzazione.
Il problema è che molti tutorial si basano su STDIN. Ad esempio, se si esegue il seguente 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
Emacs non attenderà che l'interazione dell'utente digiti correttamente un nome su STDIN e produrrà immediatamente:
#+RESULTS:
: What is your name?
: Hello , how are you?
Stessa cosa usando un esempio bash. Questo:
#+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
Non attenderà l'input dell'utente ed Emacs restituirà immediatamente questo:
#+RESULTS:
: TEST_DIR was not set, please enter the path:
Esiste un modo nativo per Emacs di attendere l'input su un blocco aggrovigliato in esecuzione?
In caso contrario, potresti fornire alcuni suggerimenti su come scrivere qualcosa come una tangle-and-run-via-shell-buffer
funzione che:
- Aggroviglia il blocco di codice in quel punto, salvandolo con il nome file specificato,
- eseguire il file corrispondente in un
shell
buffer visibile , - eventualmente accettare input da parte dell'utente,
- e infine riferire
STDOUT
, se del caso, a#+RESULTS:
?
Se tale funzionalità non è implementata (ancora) in Org, come è possibile implementarla con elisp?
Aggiornamento: dopo aver cercato e studiato più Emacs e manuali elisp, sembra che il modo per farlo sarebbe sfruttare Comint , come forse make-comint-in-buffer
.
(make-comint-in-buffer "*cmd-buffer*" nil "perl" nil "hello-name.pl")
Sfortunatamente, questo è il mio problema in questo momento 😣