Apakah mungkin untuk membaca input pengguna dari STDIN sambil mengacaukan blok sumber dengan org-babel-tangle
?
Saya mengetahui hal ini: Org Mode Babel - Evaluasi blok kode interaktif .
Itu tidak membantu menyelesaikan kasus penggunaan khusus ini, karena masih tidak memungkinkan input STDIN yang tepat dari shell, tetapi hanya mensimulasikan input terbatas secara internal ke Emacs.
Latar Belakang
Saya ingin menggunakan Org's Babel untuk mempelajari bahasa pemrograman baru (Perl dan Bash) dengan menjalankan beberapa tutorial dari satu file org.
Masalahnya adalah banyak tutorial bergantung pada STDIN. Sebagai contoh, jika seseorang menjalankan perl tidbit berikut:
#+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 tidak akan menunggu interaksi pengguna untuk mengetik nama dengan benar di STDIN, dan itu akan segera menampilkan:
#+RESULTS:
: What is your name?
: Hello , how are you?
Hal yang sama menggunakan contoh bash. Ini:
#+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
Tidak akan menunggu input pengguna, dan Emacs akan segera mengembalikan ini:
#+RESULTS:
: TEST_DIR was not set, please enter the path:
Apakah ada cara asli bagi Emacs untuk menunggu input pada blok kusut yang sedang dieksekusi?
Jika tidak, tolong beri beberapa petunjuk tentang cara menulis sesuatu seperti tangle-and-run-via-shell-buffer
fungsi yang akan:
- Kusut blok kode pada titik, simpan dengan nama file yang diberikan,
- mengeksekusi file yang sesuai dalam
shell
buffer yang terlihat , - mungkin menerima input dari pengguna,
- dan akhirnya melaporkan
STDOUT
, jika ada, ke#+RESULTS:
?
Jika fitur tersebut belum diimplementasikan (belum) di Org, bagaimana mungkin seseorang mengimplementasikannya dengan elisp?
Pembaruan: Setelah mencari dan mempelajari lebih lanjut Emacs dan manual elisp, tampaknya cara untuk melakukannya akan meningkatkan Comint , seperti mungkin make-comint-in-buffer
.
(make-comint-in-buffer "*cmd-buffer*" nil "perl" nil "hello-name.pl")
Sayangnya, itu di atas kepala saya sekarang 😣
tail file |
bekerja tetapi tidaktail -f file |
. Saya akan memeriksa catatan saya dan menambahkan contoh multiline yang berfungsi sebagian sebagai jawaban baru. Terima kasih untuk pengingat!