Можно ли прочитать пользовательский ввод из STDIN при запутывании исходного блока с org-babel-tangle
?
Мне известно об этом: Org Mode Babel - Интерактивная оценка кода блока .
Это не помогает решить этот конкретный вариант использования, так как он по-прежнему не позволяет вводить STDIN из оболочки, а только имитирует ограниченный ввод внутри Emacs.
Фон
Я хотел бы использовать Babel от Org для изучения новых языков программирования (Perl и Bash), выполняя несколько руководств из одного файла org.
Проблема в том, что многие учебные пособия опираются на STDIN. Например, если запустить следующий tidbit perl:
#+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")
К сожалению, это сейчас над моей головой
tail file |
работает, но не работаетtail -f file |
. Я посмотрю свои заметки и добавлю частично работающий многострочный пример в качестве нового ответа. Спасибо за напоминание!