异步等待comint进程的输出
首先,免责声明。我已经研究了很多次,我很确定自己已经以一种或另一种方式找到了答案,但我只是不理解。 我的问题如下: 我有一个通过comint运行的进程 我想发送一行输入,捕获输出并查看结束时间(当输出的最后一行与提示的regexp匹配时) 仅当进程完成输出发送后,我才想发送另一行输入(例如)。 作为一点背景知识,请考虑实现与程序交互的主要模式,该模式可能会在任意长时间内返回任意数量的输出。这不应该是异常情况,对吗?好的,也许我需要在 输入之间等待的部分是不寻常的,但是与整体发送输入相比,它具有一些优势: 输出缓冲区的格式很好:输入输出输入输出... 更重要的是,当向流程发送大量文本时,该文本被切成小块,并被该流程粘贴回去;切割点是任意的,这有时会导致无效输入(例如,我的过程不会正确地将输入切割剪切回粘贴到标识符中间) 无论如何,无论是否异常,事实证明它都很复杂。现在,我正在使用类似 (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的一些相关问题: /programming//q/16815598/1083706 /programming//q/3572532/1083706 /programming//q/6578373/1083706