我可以有一个“单例”emacs 实例吗?

Ale*_*lex 6 emacs

换句话说,我可以启动 emacs 一次吗,每当我在终端中输入 emacs 时,是否将它作为缓冲区打开我现有的 emacs 实例?

jwe*_*rny 5

是的。

您如何操作取决于您正在运行的操作系统和 emacs(XEmacs、GNU emacs)版本。一个好的起点是查看GnuClientEmacsClient


Mar*_*ans 5

[rant]这又是一个很简单的功能,默认情况下在许多其他编辑器上启用,但在 Emacs 中被证明是相当困难的。[/rant]

无论如何,这就是我如何做到的。首先,正如 jwernerny 提到的,EmacsClient可以解决问题。编辑 foo.txt 所需要做的就是

emacsclient --alternate-editor='' foo.txt
Run Code Online (Sandbox Code Playgroud)

此命令将尝试连接到正在运行的 Emacs 服务器。如果没有服务器,它将启动一个。然后它将连接到服务器并指示它打开指定的文件。

服务器作为守护进程(后台进程)运行。如果您运行,ps x | grep emacs您将看到一个带有命令行的进程emacs --daemon。我遇到的问题是,如果你这样做,Emacs 只能在终端中运行,所以如果你想在图形窗口中运行它,请继续阅读......(并首先杀死该守护进程)

这是我添加到我的 .bashrc 中的内容:

alias e='emacsclient --no-wait --alternate-editor ~/.emacs.d/start.sh'
Run Code Online (Sandbox Code Playgroud)

和内容~/.emacs.d/start.sh是:

#!/bin/sh
emacs --eval '(server-start)' $* &
Run Code Online (Sandbox Code Playgroud)

所述e然后别名可以被使用,或者通过启动一个新的Emacs实例(与服务器)打开一个文件,或使用现有的一个。

对于等待您完成文件的编辑器命令(适用于 Git 提交等),请删除该--no-wait选项。我在我的 .bashrc 中这样做:

export EDITOR='emacsclient --alternate-editor ~/.emacs.d/start.sh'
Run Code Online (Sandbox Code Playgroud)

使用C-x #当你完成编辑的文件。老好人C-x k会问这个恼人的问题“Buffer foo.txt 仍然有客户端;杀死它?”