Bir kaynak bloğunu dolaştırırken STDIN'den kullanıcı girişini okumak mümkün müdür?


10

Bir kaynak bloğunu dolaşırken STDIN'den kullanıcı girişini okumak mümkün müdür org-babel-tangle?

Bunun farkındayım: Org Mode Babel - Etkileşimli kod bloğu değerlendirmesi .

Bu, bu özel kullanım senaryosunun çözülmesine yardımcı olmaz, çünkü hala kabuktan düzgün STDIN girişine izin vermez, ancak yalnızca Emacs için sınırlı bir girişi dahili olarak simüle eder .

Arka fon

Bir kuruluş dosyasından bazı öğreticiler yürüterek yeni programlama dillerini (Perl ve Bash) öğrenmek için Org'un Babil'ini kullanmak istiyorum.

Sorun, birçok öğreticinin STDIN'e güvenmesidir. Örneğin, aşağıdaki perl tidbit çalıştırılırsa:

#+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, kullanıcının etkileşiminin STDIN'de düzgün bir ad yazmasını beklemez ve hemen çıktı:

#+RESULTS:
: What is your name?
: Hello , how are you?

Aynı şey bash örneği kullanarak. Bu:

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

Kullanıcı girdisini beklemez ve Emacs hemen bunu döndürür:

#+RESULTS:
: TEST_DIR was not set, please enter the path: 

Emacs'ın yürütülen karışık bir blokta girdi beklemesinin yerel bir yolu var mı?

Değilse, bir tangle-and-run-via-shell-bufferişlev gibi bir şeyin nasıl yazılacağına dair bazı işaretler verir misiniz :

  • Kod bloğunu noktaya dolaştırıp verilen dosya adıyla kaydedin,
  • ilgili dosyayı görünür bir shellarabellekte yürütme ,
  • muhtemelen kullanıcıdan girdi kabul etmek,
  • ve son olarak STDOUT, eğer varsa #+RESULTS:?

Bu özellik Org'da (henüz) uygulanmadıysa, elisp ile nasıl uygulanabilir?


Güncelleme: Emacs ve elisp kılavuzlarını araştırıp inceledikten sonra, Comint'ten yararlanabileceği gibi, belki de olduğu gibi görünüyor make-comint-in-buffer.

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

Ne yazık ki, şu an başımın üstünde 😣

Yanıtlar:


4

Bunu dene

Not : Kod bloğunuzda aşağıdaki küçük değişiklikler yapıldı:

  • Blok karışık olduğunda çalıştırılabilir dosya izinlerini otomatik olarak ayarlamak için #!/bin/bashkod bloğu başlığına taşındı .:shebang #!/bin/bashdir-input.sh

  • Gösteri eklendi ayıklama kodu $TEST_DIRdoğru olarak atandı 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   

Sonra karışık dosyayı aramak için yeni bir kod bloğu oluşturdu ./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

Uyarı başlığı :var USER_INPUT=(read-string "Test Dir: ")

Bu üstbilgi , kod bloğu a kullanılarak yürütüldüğünde pencerede bir Test Dir:istem görüntüler . minibufferC-c C-c

Yolu girin, örneğin / path / to / test / dir enter

ve blok girişi ./dir-input.shüzerinden geçirir STDIN. Aşağıdakileri görmelisiniz#+RESULTS:

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

Umut etmek bu yardım etmek!


Kod test edildi:
2014-12-25
org modu sürümünün GNU Emacs 24.4.1 (x86_64-apple-darwin14.0.0, NS apple-appkit-1343.14) : 8.3.2


Bu biraz yardımcı oluyor, teşekkürler. Kullanmanın yaratıcı bir yolu var, çok öğretici. STDIN'i "tamamen", bir çeşit konuşmayı nasıl ele geçireceğimi merak ediyorum, yani doğal kabuktan biri gibi? Örneğin, yeni satırları okuyabilmek ve karakterleri kontrol edebilmek için (CTRL-D'nin yanında)?
gsl

1
@gsl - BTW - Halen birden fazla satır ve kontrol karakteri hakkında yeni bir yanıt üzerinde çalışıyorum. Benden önce anlarsanız, lütfen cevabınızı gönderin.
Melioratus

Yeni bir cevap hazırladığınız için çok teşekkür ederim. Hala çalışan bir çözüme bakıyorum. Kendi başıma anlayamıyorum, hala başımın üstünde. Cevabınızı seçiyorum ve yeni cevabınız ne zaman gelecek, daha sonra seçin.
gsl

Merhaba @melioratus - Birden fazla satır ve kontrol karakteriyle başa çıkmanın bir yolunu bulabildiniz mi? Bu birçok durumda oldukça yararlı olacaktır.
gsl

1
@gsl - Takip ettiğiniz için teşekkürler! Stdin'den doğru okumak gerçekten yararlı olacaktır ve hala bakıyorum! Ben ilerleme komut satırından adlandırılmış arabellek içine stdin okuma ve sonra değişken çok satırlı tampon okumak için elisp çağırdı. Bu bir borudan okurken işe yarar ama ne yazık ki henüz stdin akışı için değil, yani tail file |çalışıyor ama değil tail -f file |. Notlarıma bakacağım ve kısmen çalışan çok satırlı örneğimi yeni cevap olarak ekleyeceğim. Hatırlatma için teşekkürler!
Melioratus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.