Emacsclient:从启动开始一直一直只有一个emacs进程,永远不会关闭,更好地隐藏GUI


9

由于emacsclient可以适当地处理较长的程序包加载时间,因此我真的想保留至少一个emacs进程,并且大多数时候只保留一个emacs进程,作为后台进程打开并更好地隐藏GUI。

现在,我在.bashrc中定义了以下函数:

emc () 
{ 
    if [[ $# -eq 0 ]]; then
        emacs --eval "(suspend-frame)" &
        return
    fi
    args=($*);
    setsid emacsclient -c -e "(find-file \"${args[*]}\")"
}

在.bashrc中也有以下行:

emc

因此,每次打开外壳程序时,我都会遇到一个新的emacs进程。

问题是打开许多外壳后,我将有许多其他不必要的emacs进程。但是,我只希望在启动后一直保持一个emacs进程更好,更好地隐藏GUI


5
我不熟悉(emacs --eval "(suspend-frame)"而不是emacs --daemonemacswiki.org/emacs/EmacsAsDaemon)。您是否选择不将emacs作为守护程序进行调用?您可以使用类似的方法pgrep -U `whoami` emacs || emacs --daemon &来确保其正在运行。
ebpa

查看MJ Wall使用Emacs客户端的脚本
Tianxiang Xiong

Answers:


13

我通过在登录时启动emacs守护程序来做到这一点。放置此命令的位置取决于您的桌面管理器。我使用i3,将其配置为在登录时运行包含以下内容的脚本:

emacs --daemon &

这样,emacs始终在后台运行,我用打开一个新客户端emacsclient -c -n,该客户端绑定到窗口管理器中的便捷键绑定。如果你在终端下工作,你只需要一个简单的别名一样alias emc='emacsclient',可能与-n-c-t争论,这取决于你如何使用它。

请在手册中检出emacsclient的选项:((emacs)emacsclient Options,可以通过Emacs访问C-h r m emacsclient options <enter>)。您可以使用该-a标志自动启动emacs守护程序(如果尚未运行),-c或者-t打开一个新的框架或终端客户端,而不用重用现有的(在同一会话中):

'-一个命令'
'--alternate-editor = COMMAND'
     指定一个命令,如果'emacsclient'无法联系Emacs。
     在脚本中运行“ emacsclient”时,这很有用。

     作为特殊例外,如果COMMAND为空字符串,则
     'emacsclient'以守护程序模式启动Emacs(作为'emacs --daemon'),
     然后尝试再次连接。

'-C'
'-创建框架'
     创建一个新的图形“客户端框架”,而不是使用现有的
     Emacs框架。有关以下内容的“ Cx C-c”的特殊行为,请参见下文
     客户框架。如果Emacs无法创建新的图形框架(例如,
     如果无法连接到X服务器),它将尝试创建文本
     终端客户端框架,就像您提供了“ -t”选项一样
     代替。

'-t'
'--tty'
'-nw'
     在当前文本终端上创建一个新的客户端框架,而不是
     使用现有的Emacs框架。行为就像'-c'
     选项,如上所述,不同之处在于它创建了文本终端
     框架(*注意非窗口终端::)。

4

如果您使用的操作系统使用systemd服务管理器(如今包括大多数GNU / Linux发行版),那么最好的解决方案可能是使用systemd在启动时启动Emacs守护程序。您可以通过创建$HOME/.config/systemd/user/emacs.service具有以下内容的文件来做到这一点:

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

[Service]
Type=simple
ExecStart=/usr/bin/emacs --fg-daemon
ExecStop=/usr/bin/emacsclient --eval "(kill-emacs)"
Environment=SSH_AUTH_SOCK=%t/keyring/ssh
Restart=on-failure

[Install]
WantedBy=default.target

然后,您应该启动服务并将其设置为在以后的所有启动中自动启动:

$ systemctl enable --user emacs
$ systemctl start --user emacs

您现在可以emacsclient照常使用。如果你通常与运行它-n-c-t选项,你可以在你的shell设置别名。您可能还希望设置EDITOR和/或VISUAL环境变量以使其emacsclient喜欢的方式运行。例如,在Bash中,您可以将以下内容添加到.bashrc文件中:

alias emc="emacsclient -c"
export VISUAL="emacsclient -c"
export EDITOR="emacsclient -t"

如果您需要停止Emacs守护程序,则可以执行以下操作:

$ systemctl stop --user emacs

如果要永久阻止它在启动时运行:

$ systemctl disable --user emacs

1
也许应该承认到EmacsWiki的链接:EmacsAsDaemon
HongboZhu

0

我的方式与先前的答案非常相似,因为我在.bashrc中为 emacs --daemon

alias ds="emacs --daemon"

除此之外,我还有一个快捷键ctrl-alt-E设置为emacsclient -c。当我想开始使用emacs时,我打开一个终端并键入ds并使用我的快捷方式调用每个emacsclient实例。

希望这对某人有帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.