在与源块纠缠的同时,是否可以从STDIN中读取用户输入org-babel-tangle
?
这无助于解决这个特殊的用例,因为它仍然不允许来自shell的正确STDIN输入,而只能在Emacs 内部模拟有限的输入。
背景
我想使用Org的Babel通过从一个组织文件执行一些教程来学习新的编程语言(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")
不幸的是,这现在已经让我感到头疼😣