Ist es möglich, Benutzereingaben von STDIN zu lesen, während ein Quellblock mit verwirrt wird org-babel-tangle
?
Mir ist dies bewusst: Org Mode Babel - Interaktive Codeblockauswertung .
Dies hilft nicht, diesen speziellen Anwendungsfall zu lösen, da es immer noch keine ordnungsgemäße STDIN-Eingabe von der Shell zulässt, sondern nur eine begrenzte interne Eingabe für Emacs simuliert .
Hintergrund
Ich möchte Orgs Babel verwenden, um neue Programmiersprachen (Perl und Bash) zu lernen, indem ich einige Tutorials aus einer Organisationsdatei ausführe.
Das Problem ist, dass viele Tutorials auf STDIN basieren. Zum Beispiel, wenn man den folgenden Perl-Leckerbissen ausführt:
#+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 wartet nicht darauf, dass die Interaktion des Benutzers einen Namen in STDIN richtig eingibt, und gibt sofort Folgendes aus:
#+RESULTS:
: What is your name?
: Hello , how are you?
Gleiches anhand eines Bash-Beispiels. Diese:
#+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
Wartet nicht auf Benutzereingaben und Emacs gibt dies sofort zurück:
#+RESULTS:
: TEST_DIR was not set, please enter the path:
Gibt es eine native Möglichkeit für Emacs, auf Eingaben in einem ausgeführten Block zu warten?
Wenn nicht, geben Sie bitte einige Hinweise, wie Sie so etwas wie eine tangle-and-run-via-shell-buffer
Funktion schreiben können, die:
- Verwickeln Sie den Codeblock an der Stelle und speichern Sie ihn mit dem angegebenen Dateinamen.
- Führen Sie die entsprechende Datei in einem sichtbaren
shell
Puffer aus. - möglicherweise Eingaben des Benutzers akzeptieren,
- und schließlich
STDOUT
, wenn überhaupt, zu melden#+RESULTS:
?
Wenn eine solche Funktion (noch) nicht in Org implementiert ist, wie könnte man sie mit elisp implementieren?
Update: Nachdem Sie die Emacs- und Elisp-Handbücher genauer durchgesehen und studiert haben, scheint es so, als würde man Comint nutzen , wie vielleicht make-comint-in-buffer
.
(make-comint-in-buffer "*cmd-buffer*" nil "perl" nil "hello-name.pl")
Leider geht mir das gerade über den Kopf 😣