如何在 Ubuntu 22.04+ 上使用 Wayland 将 emacs 守护程序作为 systemd 服务运行?

如何在 Ubuntu 22.04+ 上使用 Wayland 将 emacs 守护程序作为 systemd 服务运行?

emacs 29.1 的库存 systemd 用户服务文件如下所示:

[Unit]
Description=Emacs text editor
Documentation=info:emacs man:emacs(1) https://gnu.org/software/emacs/

[Service]
Type=notify
ExecStart=/usr/bin/emacs --fg-daemon
# ExecStop=/usr/bin/emacsclient --eval "(kill-emacs)"

# Emacs will exit with status 15 after having received SIGTERM, which
# is the default "KillSignal" value systemd uses to stop services.
SuccessExitStatus=15

# The location of the SSH auth socket varies by distribution, and some
# set it from PAM, so don't override by default.
# Environment=SSH_AUTH_SOCK=%t/keyring/ssh
Restart=on-failure

[Install]
WantedBy=default.target

但是,在我的计算机启动、登录并尝试运行后emacsclient -c,什么也没有发生,并且journalctl -u emacs -f --user包含一个错误日志:

需要授权,但未指定授权协议

重新启动 emacs ( systemctl --user restart emacs) 后,启动 emacs 没有问题,emacsclient 窗口按预期打开。但是,重新启动后,同样的问题又出现了——显然必须立即重新启动 emacs,这违背了将其设置为 systemd 用户服务的目的。

经过多次谷歌搜索后,我最终https://www.emacswiki.org/emacs/EmacsAsDaemon#h5o-19编辑1:此链接现在已失效,请参阅底部)它表示我们需要通过添加以下行来确保 emacs 在 Gnome 之后启动:

[Unit]
[email protected]
[email protected]

问题是 Ubuntu 22.04+(目前运行 23.10)没有[电子邮件保护]单元。我尝试了各种方法,例如gdm.serviceuser@%U.service而不是上一节中的 gnome shell,但似乎都不起作用。这里正确的方法是什么?

我也看过https://emacs.stackexchange.com/questions/74937/systemd-starts-emacs-daemon-without-xauthority-environment-variable-after-upgrad其中提到了 gnome/x11/fedora 上的相同问题,但解决方案略有不同,但不适用于 Gnome/Wayland/Ubuntu 组合。

我也在Emacs StackExchange并已被重定向至此处。

编辑1:

Emacs Wiki 已更新说明,因此上述链接已失效。更新后的说明(截至撰写本文时)位于https://www.emacswiki.org/emacs/EmacsAsDaemon#h5o-1

但是,这些说明在 Ubuntu 23.10 上也不起作用。emacsclient -c重启后启动时,我仍然收到与上述相同的错误日志(是的,我daemon-reload也遇到了这种情况)。添加一个插件:

[Unit]
After=graphical-session.target

没有帮助。

答案1

除了设置之外,还有什么有帮助的:

[Unit]
After=graphical-session.target

[Install]
WantedBy=graphical-session.target

是将配置文件从符号链接~/.config/systemd/user/default.target.wants/emacs.service(指向/usr/lib/systemd/user/emacs.service)移动到新目录graphical-session.target.wants

所以现在应该是:

~/.config/systemd/user/graphical-session.target.wants/emacs.service -> /usr/lib/systemd/user/emacs.service

相关内容