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 也会卡死原因一样。