Questions tagged «comint»

1
异步等待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

1
纠缠源代码块时是否可以从STDIN中读取用户输入?
在与源块纠缠的同时,是否可以从STDIN中读取用户输入org-babel-tangle? 我知道:Org Mode Babel-交互式代码块评估。 这无助于解决这个特殊的用例,因为它仍然不允许来自shell的正确STDIN输入,而只能在Emacs 内部模拟有限的输入。 背景 我想使用Org的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 …

1
如何防止一个子进程饿死其他子进程?
明确地说,我不是在谈论任何需要emacs多线程的东西(尽管这也可能会解决这个问题)。复制: emacs -Q#我正在运行24.4.1 制作第二帧 切换回第一帧 MX壳 MX唯一重命名(稍后我们将制作第二个Shell) 开始运行: while true; do echo "hello world"; done 在第二帧中,Mx shell 第二个shell 几乎不会显示(很少会反复尝试才能工作)。显然,emacs从读取第一个shell的输出到侦听来自任何其他进程的输出不会中断。当有多个进程具有待处理的输出时,对它进行循环将是更好的行为。有什么办法可以取得更好的行为? 我知道的唯一技巧是使shell缓冲自己的进程,但是不幸的是,这对我不起作用。即使这样做,我也必须运行一个子进程来侦听套接字,以使我的语音识别软件正常工作,以便我实际上可以首先控制外壳,这就是我发现这一点的方式;像上面那样运行无限循环,可以防止从套接字中取出任何数据。

1
记住下级Emacs Lisp模式下会话之间的历史记录
我无法使Emacs记住*ielm*会话之间的缓冲区的历史记录。据我所知,这种历史记录记录在buffer-local变量中comint-input-ring。因此,我在初始化文件中添加了以下表达式: (setq desktop-locals-to-save (append desktop-locals-to-save '((comint-input-ring . 50)))) 没用 我知道该desktop软件包正在运行,因为Emacs会记住我desktop-globals-to-save在init文件中添加的全局变量。 - 编辑:savehist也不起作用。我想那是因为comint-input-ring是局部缓冲区变量。

4
如何使用Shell配置文件和当前目录挂钩(例如direnv)使shell命令运行
我正在尝试获取shell-command并async-shell-command与.bashrc文件中的几个程序无缝集成,在此示例中特别是direnv。 我发现,如果我进行了自定义shell-command-switch,则可以使外壳程序进程像常规的交互式登录外壳程序一样加载我的配置文件: (setq shell-command-switch(纯副本“ -ic”)) (setqexplicit-bash-args'(“ -ic”“ export EMACS =; stty echo; bash”)) 我也在使用exec-path-from-shell。 说我有一个~/.bashrc文件: ... 评估“ $(direnv hook $ 0)” 回声“ foo” 里面~/code/foo我有一个.envrc文件: 导出PATH = $ PWD / bin:$ PATH 回声“栏” 如果我运行M-x shell与default-directory设置为~/code/foo,是bash shell会正确加载我的个人资料和运行direnv钩到添加到我的路径: direnv:加载.envrc 酒吧 direnv:导出〜PATH 〜/ code / foo $ echo $ PATH /用户/用户名/代码/ foo / bin:/ …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.