Có thể đọc đầu vào của người dùng từ STDIN trong khi làm rối khối nguồn org-babel-tangle
không?
Tôi biết điều này: Org Mode Babel - Đánh giá khối mã tương tác .
Điều đó không giúp giải quyết trường hợp sử dụng cụ thể này, vì nó vẫn không cho phép nhập STDIN thích hợp từ shell, mà chỉ mô phỏng một đầu vào hạn chế bên trong cho Emacs.
Lý lịch
Tôi muốn sử dụng Org's Babel để học các ngôn ngữ lập trình mới (Perl và Bash) bằng cách thực hiện một số hướng dẫn từ một tệp org.
Vấn đề là nhiều hướng dẫn dựa vào STDIN. Ví dụ: nếu một người chạy đoạn mã perl sau:
#+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 sẽ không chờ tương tác của người dùng nhập đúng tên trên STDIN và nó sẽ ngay lập tức xuất ra:
#+RESULTS:
: What is your name?
: Hello , how are you?
Điều tương tự bằng cách sử dụng một ví dụ bash. Điều này:
#+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
Sẽ không chờ người dùng nhập vào và Emacs sẽ trả lại ngay lập tức:
#+RESULTS:
: TEST_DIR was not set, please enter the path:
Có cách nào để Emacs đợi đầu vào trên một khối rối không?
Nếu không, bạn vui lòng cung cấp một số gợi ý về cách viết một cái gì đó giống như một tangle-and-run-via-shell-buffer
chức năng:
- Làm rối khối mã tại điểm, lưu với tên tệp đã cho,
- thực hiện các tập tin tương ứng trong một
shell
bộ đệm có thể nhìn thấy , - có thể chấp nhận đầu vào từ người dùng,
- và cuối cùng báo cáo
STDOUT
, nếu có, để#+RESULTS:
?
Nếu tính năng này không được triển khai (chưa) trong Org, làm thế nào người ta có thể thực hiện nó với elisp?
Cập nhật: Sau khi tìm kiếm và nghiên cứu thêm các hướng dẫn sử dụng Emacs và elisp, có vẻ như cách để làm điều đó sẽ thúc đẩy Comint , như có lẽ make-comint-in-buffer
.
(make-comint-in-buffer "*cmd-buffer*" nil "perl" nil "hello-name.pl")
Thật không may, điều đó qua đầu tôi ngay bây giờ