우선, 면책 조항. 나는 이것을 여러 번 연구했고, 나는 이미 어떤 방법 으로든 그 답을 찾았다는 것을 확신하지만, 나는 그것을 이해하지 못한다.
내 문제는 다음과 같습니다.
- comint를 통해 프로세스가 실행 중입니다.
- 입력 줄을 보내고 출력을 캡처하고 끝났는지 확인하고 싶습니다 (출력의 마지막 줄이 프롬프트의 정규 표현식과 일치 할 때)
- 프로세스가 출력 보내기를 마쳤을 때만 다른 입력 줄을 보내려고합니다 (예 :).
약간의 배경 지식은 프로그램과의 상호 작용을 구현하는 주 모드를 생각하면 임의로 임의의 양의 출력을 반환 할 수 있습니다. 이것은 특별한 상황이 아니어야합니다. 아마 입력 간에 기다려야 할 부분 은 드물지만 입력을 전체적으로 보내는 것보다 몇 가지 장점이 있습니다.
- 출력 버퍼의 형식은 다음과 같습니다 : 입력 출력 입력 출력 ...
- 더 중요한 것은 프로세스에 많은 텍스트를 보낼 때 텍스트가 조각으로 잘리고 조각이 프로세스에 의해 다시 붙여집니다. 절단 지점은 임의적이며 때로는 잘못된 입력을 만듭니다 (예 : 프로세스가 식별자 중간에 입력 컷을 올바르게 다시 붙여 넣지 않습니다)
어쨌든, 특이한 여부, 그것이 밝혀 되고 복잡. 지금은 라인을 따라 무언가를 사용하고 있습니다.
(defun mymode--wait-for-output ()
(let ((buffer (mymode-get-buffer)))
(with-current-buffer buffer
(goto-char (point-max))
(forward-line 0)
(while (not (mymode-looking-at-prompt))
(accept-process-output nil 0.001)
(redisplay)
(goto-char (point-max))
(forward-line 0))
(end-of-line))))
입력 줄을 보낸 후 다음 줄을 보내기 전에 매번 호출합니다. 글쎄 ... 그것은 작동합니다, 그것은 이미 뭔가입니다.
그러나 출력을 기다리는 동안 emacs를 정지시킵니다. 그 이유는 분명 sleep-for
하며, 루프에 일종의 비동기식 (예 : 1s)을 포함하면 출력이 1s 지연되지만 교수형은 억제한다고 생각했습니다. 이런 종류의 비동기 sleep-for
는 존재하지 않는 것 같습니다
.
아니면? 더 일반적으로 emacs로 이것을 달성하는 관용적 방법이 있습니까? 다시 말해:
프로세스에 입력을 보내고 출력을 기다린 다음 비동기 적으로 더 많은 입력을 보내는 방법은 무엇입니까?
주변을 검색 할 때 (관련 질문 참조) 주로 센티넬에 대한 언급을 보았습니다 (그러나 프로세스가 완료되지 않았기 때문에이 경우에는 적용되지 않는다고 생각합니다). 후크를 로컬 버퍼로 만들고 내 "나머지 라인 평가"를 함수로 바꾸고이 함수를 후크에 추가 한 후 후크를 청소하십시오. 정말 더럽게 들리지 않습니까?).
나 자신을 명확하게하지 않거나 어딘가에 명백한 대답이있는 경우 죄송합니다. 모든 복잡한 프로세스 상호 작용으로 혼란 스럽습니다.
필요한 경우,이 예제를 모두 실용적으로 만들 수는 있지만, 이전에 찾은 모든 것과 같이 "특정 프로세스 응답이있는 특정 프로세스 질문"을 하나 더 만들 것 같습니다.
SO에 관한 몇 가지 관련 질문 :