就在最近,这种情况才开始发生;我运行:
/usr/bin/emacsclient --alternate-editor="" --no-wait -c
并得到:
错误:显示:0.0 无法打开
没有其他应用程序这样做。
输出xdpyinfo
:
name of display: 0.0
version number: 11.0
vendor string: The X.Org Foundation
vendor release number: 10707000
X.Org version: 1.7.7
编辑: 我发现旧的 emacs 服务器/守护进程仍在运行。
$ ps ux | grep [e]macs
richard 2642 0.0 0.8 38788 24984 ? Ss Jun22 0:25 emacs --daemon
richard 7512 0.0 0.6 33896 19720 ? Ss Jun23 0:05 emacs --daemon
richard 15458 0.0 0.6 32836 19076 ? Ss 09:40 0:01 emacs --daemon
有人知道如何在我注销时将其关闭吗?
答案1
鉴于附加信息,我猜测您的 emacsclient 正在连接到“错误的”emacs 服务器。 (或者更好的是,启动第一个:后续调用emacs --daemon
将无法启动服务器,因为通信套接字已在使用中。)如果 emacs 守护进程在先前的 X 会话中启动,则它使用错误的连接凭据到 X 显示,因此失败。
您可以通过以非图形/tty 模式连接到服务器来找出哪个 emacs 进程正在运行服务器;在终端中使用以下-nw
选项运行 emacsclient:
emacsclient -nw
你可以通过 emacsclient 让它运行 LISP 代码来终止正在运行的 emacs:
emacsclient -t --eval '(progn (server-save-buffers-kill-terminal 1) (save-buffers-kill-emacs 1))'
在哪里:
- 该选项(或
-t
的别名)是为了避免 Emacs 连接到 X 显示;-nw
--tty
server-save-buffers-kill-terminal
在告诉 Emacs 停止之前分离 emacsclient(否则它将发出确认提示);- 该
save-buffers-kill-emacs
函数通常由 调用C-x C-c
,参数1
告诉 Emacs 不要要求确认。
另外,我猜你运行这么多的原因emacs --daemon
是你使用以下选项调用 emacsclient --alternate-editor=""
:手册页 emacsclient(1)指出:
如果(备用)EDITOR 的值为空字符串,则 Emacs 将以守护进程模式启动,并且 emacsclient 将尝试连接到它。
emacs --daemon
从 X 会话启动脚本(例如,或 GNOME 会话配置)启动可能是一个更好的选择,.gnomerc
以便会话管理器在会话终止时负责杀死 emacs 守护进程。
答案2
我想我猜出发生了什么事。我需要了解有关如何登录以及如何启动 Emacs 的更多信息,以便告诉您如何修复它。
X 程序需要有两条信息才能连接到 X 显示。它需要知道显示的名称,该名称通常取自DISPLAY
环境变量。它还需要有一个用于显示的密码,称为 X cookie,通常存储在~/.Xauthority
由环境变量调用或指示的文件中XAUTHORITY
。 (更多解释请看这里)
我怀疑 Emacsclient 正在将正确的显示信息 ( :0.0
) 传递给主 Emacs 进程,但它没有传递 X cookie。通常,Emacsclient 将其自己的环境(包括XAUTHORITY
如果存在)发送到 Emacs 服务器,并且两个进程可以访问同一文件系统来读取 cookie 文件。这在这里失败了。
为了找出原因,以下问题的答案可能会有用:
- 的价值是什么
$XAUTHORITY
? (如果未设置,则该值就好像是~/.Xauthority
。) - 该文件在哪里以及它的权限是什么?
- Emacs 进程和当前客户端是否以某种方式在不同的上下文中启动(机器、用户、chroot,...)?
- Emacs 进程是否有不同的值
$XAUTHORITY
? (ps -C emacs wwe
或者grep -az XAUTHORITY= /proc/$(pidof emacs)/environ
) - 您如何登录(在显示管理器(其中)、文本模式、通过 SSH,...)? Emacs 进程是如何启动的(从哪里、在什么时候)?它是作为守护进程启动的吗?