소스 블록을 엉키면서 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")
불행히도, 그것은 지금 내 머리 위에 있습니다. 😣