เป็นไปได้ไหมที่จะอ่านอินพุตของผู้ใช้จาก STDIN ในขณะที่กำลังบล็อกซอร์สด้วยorg-babel-tangle
?
ผมตระหนักถึงเรื่องนี้: Org โหมดบาเบล - code อินเตอร์แอคทีประเมินบล็อก
นั่นไม่ได้ช่วยแก้กรณีการใช้งานนี้โดยเฉพาะเนื่องจากมันยังไม่อนุญาตอินพุต STDIN ที่เหมาะสมจากเชลล์ แต่จำลองอินพุตที่ จำกัดภายใน Emacs เท่านั้น
พื้นหลัง
ฉันต้องการใช้ Babel ของ Org เพื่อเรียนรู้ภาษาการเขียนโปรแกรมใหม่ (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 จะรออินพุตในบล็อก tangled ที่กำลังรันอยู่
ถ้าไม่คุณจะกรุณาให้พอยน์เตอร์เกี่ยวกับวิธีการเขียนบางอย่างเช่นtangle-and-run-via-shell-buffer
ฟังก์ชั่นที่จะ:
- ยุ่งเหยิงบล็อกรหัสที่จุดบันทึกด้วยชื่อไฟล์ที่กำหนด
- รันไฟล์ที่เกี่ยวข้องใน
shell
บัฟเฟอร์ที่มองเห็นได้ - อาจยอมรับอินพุตจากผู้ใช้
- และในที่สุดก็รายงาน
STDOUT
หากมีเพื่อ#+RESULTS:
?
หากยังไม่มีการใช้งานคุณสมบัติดังกล่าว (ยัง) ใน Org เราจะนำไปใช้กับ elisp ได้อย่างไร
ปรับปรุง: หลังจากการค้นหาและการศึกษาอื่น ๆ คู่มือ Elisp Emacs และดูเหมือนว่าวิธีที่จะทำก็จะได้รับประโยชน์จากCOMINTmake-comint-in-buffer
เช่นบางที
(make-comint-in-buffer "*cmd-buffer*" nil "perl" nil "hello-name.pl")
น่าเสียดายที่ตอนนี้ฉันอยู่เหนือหัวแล้ว😣