在 Emacs 中使用 emacsclient 会卡住 Emacs

M-! emacsclient --eval emacs-version 或者 Org Babel

#+begin_src sh
emacsclient --eval emacs-version
#+end_src

貌似是因为 Emacs 没法同时执行 M-! 和 Emacs Server,M-! 执行结束的条件是 emacsclient 执行结束,而 emacsclient 也就是 Emacs Server 要等 M-! 完了才能开始执行,这里卡死了。异步的 M-& 没问题。

应该是「而 emacsclient 要等 Emacs Server (也就是当前 Emacs) 执行完了才能返回」吧?

如果 Emacs Server 在另一个独立的进程,emacsclient 就能立即返回了:

#+NAME: start_server
#+BEGIN_SRC emacs-lisp :results value
(with-emacs-server "bar" :ensure t)
#+END_SRC

#+RESULTS: start_server

#+BEGIN_SRC sh :results value :var _=(progn (org-babel-goto-named-src-block "start_server") (org-ctrl-c-ctrl-c '(4)))
emacsclient --eval emacs-version -s bar
#+END_SRC

#+RESULTS:
: 28.0.50

貌似立即返回的也不行

M-! emacsclient --no-wait --eval "hi"

给Emacs一个SIGINT,message buffer里:

Waiting for process to die...done
(Shell command failed with error)
apply: call-process invoked recursively

立即返回并不立即,它还是需要等 Server 接收完 eval 表达式,只是不等执行结果而已。

然而 Server 同时又是当前 Emacs,所以它又必须在 emacsclient 结束之后才能开始接收。

嗯,这样解释听起来更合理,emacsclient 的 --eval 应该还没有执行,应该跟 M-: (while t) 然后 emacsclient 也会卡死原因一样。