如何在emacsclient -e求值的表达式中打印到当前终端的输出流

我在终端里尝试了如下的代码:

emacclient -u -e "(write-region \"Hello, world!\" nil \"/dev/stdout\")"

但是这个只会显示到emacsclient的echo area,在终端里什么都没有。 有什么办法可以让它写到当前的终端上吗?我不想用emacs --batch --eval,因为它要从头启动emacs,虽然不算很慢,但还是有一点可以察觉到的延迟。我希望可以通过emacsclient -u -e这样的命令,把一些东西写到这个emacsclient的父shell里。

这似乎不太可行。如果我没理解错的话,执行ELisp代码的是server那个进程,所以stdout也是server的stdout,与client这边无关。我是了一下在终端启动一个server,再用 emacsclient打印 hello world,发现消息确实是打印到server那边的终端里了。

你担心 emacs --batch --eval 太慢,但是按理说batch模式应该不慢的。参考 Startup-Summary,在batch模式下启动,好多步骤都跳过了,应该比 emacs -Q -nw 都快吧。

我试了一下,在 Linux 下用batch打印 hello world 再退出,用了 0.06秒。可能不同平台有差异。

你看到了server的打印?我在ssh连接的同一个终端中,甚至连server的打印都没有看到。我想你是对的,但理论上emacsclient进程应该可以提供启动它的那个终端的输入输出流相关的信息。

我测了一下emacs --batch --eval的速度,在amd64的PC上速度跟你差不多,在arm64的云上跑起来比较慢,可能跟远程连接有关。

emacsclient 不带 -u 参数的情况下用 -e ...,执行完之后会把求值结果打印出来,也许你可以利用这个功能实现你想要的效果。可惜这个结果应该是用 prin1 之类的函数打印的,如果你想要的结果是字符串,那么它会有引号和内部的转义,故需要再调用其它工具进一步处理。