Чи можливо зчитувати введення користувача зі STDIN під час переплутання блоку джерела org-babel-tangle
?
Мені це відомо: Org Mode Babel - оцінка інтерактивного кодового блоку .
Це не допомагає вирішити конкретний випадок використання, оскільки він все ще не дозволяє належним чином вводити STDIN з оболонки, а лише імітує обмежений вхід внутрішньо до Emacs.
Фон
Я хотів би скористатися Org's Babel для вивчення нових мов програмування (Perl і Bash), виконавши кілька навчальних посібників з одного файлу org.
Проблема полягає в тому, що багато навчальних посібників покладаються на STDIN. Наприклад, якщо один запускає такий підказки 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?
Те саме, використовуючи приклад баша. Це:
#+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")
На жаль, це зараз у мене над головою 😣