我在终端里尝试了如下的代码:
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
之类的函数打印的,如果你想要的结果是字符串,那么它会有引号和内部的转义,故需要再调用其它工具进一步处理。