ソースブロックをもつれさせながらSTDINからユーザー入力を読み取ることはできますorg-babel-tangle
か?
私はこれを知っています:Org Mode Babel-インタラクティブコードブロックの評価。
それは助けには、それはまだシェルから適切なSTDIN入力を許可しないように、この特定のユースケースを解決しますが、限られた入力をシミュレートしていない内部のEmacsに。
バックグラウンド
OrgのBabelを使用して、1つのorgファイルからいくつかのチュートリアルを実行することにより、新しいプログラミング言語(PerlとBash)を学びたいと思います。
問題は、多くのチュートリアルがSTDINに依存していることです。たとえば、次の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はユーザーのインタラクションがSTDINに名前を正しく入力するのを待たず、すぐに出力します:
#+RESULTS:
: What is your name?
: Hello , how are you?
bashの例を使用して同じこと。この:
#+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
ユーザー入力を待たず、Emacsはすぐにこれを返します:
#+RESULTS:
: TEST_DIR was not set, please enter the path:
Emacsが実行中のもつれたブロックの入力を待つネイティブの方法はありますか?
そうでない場合は、次のようなtangle-and-run-via-shell-buffer
関数のようなものを書く方法について、いくつかの指針を示してください。
- ポイントでコードブロックをもつれさせ、与えられたファイル名で保存し、
- 可視
shell
バッファーで対応するファイルを実行し、 - おそらくユーザーからの入力を受け入れる
- そして
STDOUT
、もしあれば、最後に報告し#+RESULTS:
ますか?
そのような機能がOrgで(まだ)実装されていない場合、elispでどのように実装できますか?
更新:Emacsとelispのマニュアルをさらに調べて調べたところ、おそらく、のように、Comintを活用することになるでしょうmake-comint-in-buffer
。
(make-comint-in-buffer "*cmd-buffer*" nil "perl" nil "hello-name.pl")
残念ながら、それは今私の頭上にあります😣