क्या सोर्स ब्लॉक को टेंगल करते हुए STDIN से यूजर इनपुट पढ़ना संभव है?


10

क्या स्रोत ब्लॉक को टेंगल करते हुए STDIN से उपयोगकर्ता इनपुट पढ़ना संभव है org-babel-tangle?

मुझे इस बारे में पता है: ऑर्ग मोड बैबेल - इंटरएक्टिव कोड ब्लॉक मूल्यांकन

यह इस विशेष उपयोग के मामले को हल करने में मदद नहीं करता है, क्योंकि यह अभी भी शेल से उचित STDIN इनपुट की अनुमति नहीं देता है, लेकिन केवल एक सीमित इनपुट को Emacs में आंतरिक रूप से अनुकरण करता है।

पृष्ठभूमि

मैं ओआरजी फाइल से कुछ ट्यूटोरियल को निष्पादित करके नई प्रोग्रामिंग भाषाओं (पर्ल और बैश) को सीखने के लिए ऑर्ग के बैबेल का उपयोग करना चाहूंगा।

समस्या यह है कि कई ट्यूटोरियल एसटीडीआईएन पर भरोसा करते हैं। उदाहरण के लिए, यदि कोई निम्नलिखित पर्ल टिडबिट चलाता है:

#+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: 

क्या एमएसीएस के लिए एक मूल तरीका है एक निष्पादित पेचीदा ब्लॉक पर इनपुट की प्रतीक्षा करना?

यदि नहीं, तो क्या आप कृपया कुछ संकेत दे सकते हैं tangle-and-run-via-shell-bufferकि एक फ़ंक्शन की तरह कुछ कैसे लिखें :

  • बिंदु पर कोड ब्लॉक को टेंगल करें, दिए गए फ़ाइल नाम के साथ बचत करें,
  • दृश्यमान shellबफ़र में संबंधित फ़ाइल निष्पादित करें ,
  • संभवतः उपयोगकर्ता से इनपुट स्वीकार करना,
  • और अंत में रिपोर्टिंग STDOUT, यदि कोई हो, को #+RESULTS:?

यदि ऑर्ग में ऐसी सुविधा (अभी तक) लागू नहीं है, तो कोई इसे कैसे लागू कर सकता है?


अपडेट: अधिक Emacs और elisp मैन्युअल की खोज और अध्ययन के बाद, ऐसा लगता है कि ऐसा करने का तरीका शायद कॉमिंट का लाभ उठाना होगा , जैसे कि make-comint-in-buffer

(make-comint-in-buffer "*cmd-buffer*" nil "perl" nil "hello-name.pl")

दुर्भाग्य से, यह अभी मेरे सिर पर है my

जवाबों:


4

इसे इस्तेमाल करे

नोट : आपके कोड ब्लॉक में मामूली बदलाव किए गए हैं:

  • #!/bin/bashकोड ब्लॉक हेडर में ले जाया गया :shebang #!/bin/bashजब ब्लॉक में पेचीदा होने पर स्वचालित रूप से निष्पादन योग्य फ़ाइल अनुमतियां सेट की जाती हैं dir-input.sh

  • शो $TEST_DIRमें जोड़ा गया डिबग कोड सही से असाइन किया गया था read input_variable

#+BEGIN_SRC sh  :results output :export code :tangle dir-input.sh :shebang #!/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
    echo "# export TEST_DIR=$TEST_DIR"
fi
#+END_SRC   

फिर पेचीदा फ़ाइल को कॉल करने के लिए नया कोड ब्लॉक बनाया ./dir-input.sh

#+BEGIN_SRC sh :results output :shebang #!/bin/bash  :var USER_INPUT=(read-string "Test Dir: ")
  echo $USER_INPUT | ./dir-input.sh 
#+END_SRC

सूचना हैडर :var USER_INPUT=(read-string "Test Dir: ")

कोड का उपयोग करके कोड ब्लॉक निष्पादित होने पर यह हेडर विंडो Test Dir:में एक प्रॉम्प्ट प्रदर्शित करेगा । minibufferC-c C-c

पथ दर्ज करें, जैसे / पथ / से / परीक्षण / dir enter

और ब्लॉक इनपुट को इसके ./dir-input.shमाध्यम से पास करेगा STDIN। आपको निम्नलिखित देखना चाहिए#+RESULTS:

#+RESULTS:
: TEST_DIR was not set, please enter the path: 
: # export TEST_DIR=/path/to/test/dir

उम्मीद है कि मदद की!


कोड के साथ परीक्षण किया गया:
2014-12-25
ऑर्ग-मोड संस्करण का GNU Emacs 24.4.1 (x86_64-apple-darwin14.0.0, NS Apple-appkit-1343.14) : 8.3.2


यह काफी मदद करता है, धन्यवाद। वैर का उपयोग करने का एक रचनात्मक तरीका, बहुत शिक्षाप्रद। मैं सोच रहा हूं कि मैं एसटीडीआईएन "पूर्ण" पर कैसे जाऊंगा, बोलने की तरह, जैसे कि देशी खोल से? उदाहरण के लिए, नई लाइनों को पढ़ने और चार्ट (CTRL-D के पास) को नियंत्रित करने में सक्षम होने के लिए?
gsl

1
@ एलएसएल - बीटीडब्ल्यू - मैं अभी भी कई लाइनों और नियंत्रण पात्रों के बारे में सवाल करने के लिए एक नए उत्तर पर काम कर रहा हूं। यदि आप इसका पता लगाते हैं तो इससे पहले कि मैं अपना उत्तर पोस्ट करूँ।
मेलियोराटस

एक नया उत्तर तैयार करने के लिए बहुत बहुत धन्यवाद। मैं अभी भी एक कार्यशील समाधान देख रहा हूं। मैं अपने आप से यह पता नहीं लगा सकता, अभी भी मेरे सिर पर है। मैं आपका जवाब चुन रहा हूं, और जब आपका नया सामने आएगा, तो इसे बाद में चुनें।
gsl

हाय @melioratus - क्या आप कई लाइनों से निपटने और पात्रों को नियंत्रित करने का एक तरीका खोजने में सक्षम थे? यह कई मामलों में काफी उपयोगी होगा।
gsl

1
@ एलएसएल - निम्नलिखित के लिए धन्यवाद! आप सही से पढ़ रहे हैं स्टड वास्तव में उपयोगी होगा और मैं अभी भी देख रहा हूँ! मैंने कमांड लाइन से नामित बफर में स्टड पढ़ने की प्रगति की है और फिर मल्टीलाइन बफर को वेरिएबल में पढ़ने के लिए कॉल कर रहा हूं। यह एक पाइप से पढ़ते समय काम करता है लेकिन दुर्भाग्य से स्टड स्ट्रीमिंग के लिए अभी तक नहीं है, अर्थात tail file |काम करता है लेकिन नहीं tail -f file |। मैं अपने नोट्स देखूंगा और नए उत्तर के रूप में अपने आंशिक रूप से काम करने वाले बहुस्तरीय उदाहरण को जोड़ूंगा। अनुस्मारक के लिए धन्यवाद!
मेलियोरैटस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.