소스 블록을 엉키면서 STDIN에서 사용자 입력을 읽을 수 org-babel-tangle
있습니까?
나는 이것을 알고있다 : 조직 모드 바벨-대화 형 코드 블록 평가 .
쉘에서 적절한 STDIN 입력을 허용하지 않지만 Emacs 내부 에서 제한된 입력 만 시뮬레이션하므로이 특정 사용 사례를 해결하는 데 도움이되지 않습니다 .
배경
조직의 Babel을 사용하여 하나의 조직 파일에서 튜토리얼을 실행하여 새로운 프로그래밍 언어 (Perl 및 Bash)를 배우고 싶습니다.
문제는 많은 튜토리얼이 STDIN에 의존한다는 것입니다. 예를 들어, 다음 perl tidbit를 실행하는 경우 :
#+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?
bash 예제를 사용하는 것과 같습니다. 이:
#+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가 얽힌 실행 블록에서 입력을 기다리는 기본 방법이 있습니까?
그렇지 않다면 다음과 같은 tangle-and-run-via-shell-buffer
함수 와 같은 것을 작성하는 방법에 대한 포인터를 제공하십시오 .
- 주어진 파일 이름으로 저장하여 코드 블록을 엉킴
- 보이는
shell
버퍼 에서 해당 파일을 실행 - 사용자의 입력을 수락 할 수도 있습니다.
- 마지막
STDOUT
으로#+RESULTS:
?
이러한 기능이 조직에서 아직 구현되지 않은 경우 elisp로 어떻게 구현할 수 있습니까?
업데이트 : 더 많은 Emacs 및 elisp 매뉴얼을 검색하고 연구 한 후에 아마도 Comint를 활용하는 방법이 될 것 같습니다 make-comint-in-buffer
.
(make-comint-in-buffer "*cmd-buffer*" nil "perl" nil "hello-name.pl")
불행히도, 그것은 지금 내 머리 위에 있습니다. 😣
답변
이 시도
참고 : 코드 블록을 다음과 같이 약간 변경했습니다.
블록이 엉 키면 실행 파일 권한을 자동으로 설정하기 위해
#!/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:
프롬프트를 표시minibuffer
합니다 C-c C-c.경로를 입력하십시오 (예 : / path / to / test / dir). enter
블록은 입력을
./dir-input.sh
via에 전달합니다STDIN
. 다음을 볼 수 있습니다#+RESULTS:
#+RESULTS:
: TEST_DIR was not set, please enter the path:
: # export TEST_DIR=/path/to/test/dir
도움이 되었기를 바랍니다.
: 코드 테스트
2014년 12월 25일의 GNU 이맥스 24.4.1 (x86_64에-사과 darwin14.0.0, NS는 사과 AppKit의-1343.14)
조직 모드 버전 : 8.3.2