快速的Emacs shell模式?

12

我正在运行一个交互式程序,输出大约10MB [编辑:实际上更接近100MB]的ASCII文本。在emacs shell-mode(Aquamacs)中的性能非常慢,需要数小时才能完成。我已经执行了buffer-disable-undo,这使速度稍微快了一些,但仍然太慢了。

我尝试隐藏缓冲窗口运行程序,但程序已经完成,当我重新选择缓冲区时,我仍然需要等待数小时才能输出结果。

是否有一些命令可以使emacs的性能可接受?我不明白为什么shell-mode会如此缓慢:这是一台32GB多核机器,具有64位现代多核CPU和SSD。


1
你能详细说明一下你的情况吗?最重要的是,你是如何运行这个程序的?例如通过 M-x compile 命令或在 M-x shell 缓冲区中执行,还是其他方式? - Stefan
我使用M-x shell创建了一个缓冲区。在该缓冲区中,我执行了buffer-disable-undo操作。然后,在缓冲区内部运行了lldb,并在lldb中运行了我的程序。由于程序还在开发中,它会输出很多内容,而我喜欢监控这些输出;这也是为什么它应该是交互式的原因。这是在emacs下开发的常见正常方式之一 - 这是shell-mode的优势之一,你不需要一直使用单独的日志文件。除了emacs运行得非常慢之外,其他都能正常工作。 - kdog
2个回答

2

将变量comint-move-point-for-outputcomint-scroll-show-maximum-output设置为nil。这样可以防止缓冲区不断滚动到输出的末尾,从而需要频繁地重新显示。


还没有尝试过,不确定在输出正在打印时是否应该尝试。然而,即使缓冲区窗口没有显示输出的末尾,输出也很慢。例如,现在缓冲区显示我在大约第200万行,而输出从大约第220万行打印。我所能看到的只是滚动条指示缓慢向上移动。没有重新显示任何内容。虽然也许输出更接近50MB而不是10MB。 - kdog
在这种情况下,我认为你正在尽力而为。它必须处理输出,以便可以更新滚动条和模式行百分比。我认为有一个变量指定了在模式行中显示位置和百分比的最大缓冲区大小,但我记不清是什么了。 - Barmar
4
谢谢。我感到非常沮丧的是,emacs 的维护者似乎把所有时间都花在了没人想要或需要的白痴功能上,比如网页浏览,而人们使用 emacs 进行编程的基本工具却有 bug 或不稳定。例如,仍然没有像样的 C++ 模式,只有 50 种不可能安装并且实际上不起作用的包(根据我的经验)。如果他们想加入一个网络浏览器,那也好,但是首先让基本的工具能够正常工作:代码浏览、程序开发等。 - kdog
3
Emacs是最古老和最流行的开源项目之一。它由用户维护,拥有的功能都是用户所需的。 - Barmar
2
显示多兆字节文件的连续输出并不是常见的活动。这可不是“基础知识”。 - Barmar
显示剩余3条评论

1
你的交互式程序是否作为shell脚本在shell模式下运行?
是否可能直接将shell进程分叉到一个shell(而不是在emacs中的shell模式),然后在完成时只需让emacs加载结果?

2
看到之前的评论了。我可以重写我的程序来避免emacs的问题,但我宁愿不这样做。我期望经过30或40年的发展,emacs应该有一种能够以合理速度运行shell模式的方法。 - kdog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接