如何在Emacs中将内容写入标准输出

26

我正在尝试通过调试 Emacs 程序来优化其性能。特别是,我在使用 WLAN、手机等远程连接时遇到了非常长的启动时间(与裸 Emacs 相比大约为 5 分钟 vs. 1 分钟)。在这种情况下,任何写入的 message 都没有帮助,因为显示根本没有刷新。

我想要做的是将消息写入 Linux 进程的“标准输出”。我知道有 --batch 模式,但这对我没有帮助,因为我想要交互使用 Emacs。

那么,我该如何将消息输出到 Linux 标准输出(而不是 Emacs 标准输出)中呢?

3个回答

28

您可以使用以下方式将输出发送到标准错误输出:

(print "hello world" #'external-debugging-output)
或者
(princ "hello world" #'external-debugging-output)

这可能会缓冲,所以要小心。现在无法输出到标准输出。我想要添加它!


1
被赞美的,RMS 与你同在! - false
3
实际上,在发现那个函数之前,我已经写了一个补丁来添加这个功能。它已经存在多年了! - Phil Lord
2
哇,我不知道这个存在。谢谢分享;我已经删除了我的答案。 - user355252

7

以守护进程模式启动emacs (emacs --daemon),任何在启动过程中的消息都会被发送到stdout或stderr,如lunaryorn所述。

使用emacsclient连接服务器。

关闭服务器最简单的方法是 M-x kill-emacs RET

详情请参见 C-hig (emacs) Emacs Server RET


7

在 CentOS 6.8(GNU Emacs 23.1.1)中,此方法适用:

(append-to-file "here I come to save the day\n" nil "/dev/stdout")

尝试使用"/dev/tty"代替"/dev/stdout":
从问题中不清楚你是否想将 "emacs -nw" 的标准输出重定向到文件并在外部监控该文件 (然后使用 "/dev/stdout");或者是否愿意写入到 "/dev/tty",从而污染与主 "emacs -nw" 显示相同的 tty。
如果启动 GUI 版本的 emacs,以这种方式可能会失去对原始 tty 的附着,可以利用环境变量将原始 shell 的 tty 传达给 elisp 来通信。
在 Mac OS X 上使用 Aquamacs 运行时,从 bash shell 启动,这种方法对我有效。
$ MY_TTY=$(tty) open /Applications/Aquamacs\ Emacs.app &

然后在emacs中:

(append-to-file "here I come to save the day\n" nil (getenv "MY_TTY"))

这个可以运行,但有时会影响迷你缓冲区,这可能是一个缺点。 - Phil Lord

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