使用 emacsclient 打开文件时在 OS X 上使用 GUI Emacs

Posted

技术标签:

【中文标题】使用 emacsclient 打开文件时在 OS X 上使用 GUI Emacs【英文标题】:Use GUI Emacs on OS X when opening files with emacsclient 【发布时间】:2014-07-30 18:47:30 【问题描述】:

我正在尝试设置 Emacs(我通过 brew install emacs --cocoa 安装),以便我可以通过以下方式使用它:

    emacsclient file.txt 如果还没有,则创建一个新的 GUI 框架 emacsclient file2.txt 替换现有框架的内容,如果有的话 emacsclient 应该总是立即返回,而不是阻塞调用它的 shell 在任何给定时间点,基本上都应该有一个 Emacs 窗口和一个 emacs --daemon 进程

正如我所说,我通过自制软件安装了 Emacs。为了在我登录时启动一个守护进程,我添加了 ~/Library/LaunchAgents/org.gnu.emacs.plist 并包含以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>org.gnu.emacs</string>
    <key>ProgramArguments</key>
    <array>
      <string>/usr/local/Cellar/emacs/HEAD/bin/emacs</string>
      <string>--daemon</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
  </dict>
</plist>

我确认这将启动该过程。到目前为止,我尝试了各种变体来调用 emacsclient:

    /usr/local/Cellar/emacs/HEAD/bin/emacsclient file.txt 这会在我的终端中打开 emacs /usr/local/Cellar/emacs/HEAD/bin/emacsclient -c file.txt 这打开了一个新的 Emacs GUI 框架(好!),但不知何故它没有相同的字体大小/字体设置。此外,当我关闭该框架并使用 emacsclient -c 打开另一个文件时,Emacs 进程似乎崩溃了。 /usr/local/Cellar/emacs/HEAD/bin/emacsclient -n file.txt 马上退出

我不确定我应该做什么。我找到了很多关于这方面的教程,但很多人不清楚目标是否是让守护进程只为 emacs 等终端使用而工作。

我很想听听您如何在 OS X 上使用 Emacs,尤其是如何设置 Emacs 守护程序以及如何/是否使用 GUI 变体。

【问题讨论】:

【参考方案1】:

因为它经常发生,我在写这篇文章时找到了解决方案。将以下内容放入我的init.el 允许我在现有的 GUI 框架中打开文件。

(require 'server)
(unless (server-running-p)
  (server-start))

我认为这是可行的,因为服务器进程绑定到 Emacs 的 GUI 实例,但我仍然非常愿意接受其他人对此的启发。

【讨论】:

【参考方案2】:

就 2019 年而言,这个答案确实对我有用。这是我在带有emacs-mac v.26.2的macos Mojave中使用emacsclient和emacs守护进程的配置:

1) 首先,我将这一行放在我的 init 文件中:

(server-start)

正如EmacsWiki 和 Martin 解释的那样,这一行对于将 GUI Emacs 链接到它创建的服务器是必需的。

2) 然后,我将 Emacs GUI 设置为在我的 mac 会话开始时启动(这里没有魔法,它被设置为任何其他应用程序)。

3) 最后,我使用自动机为这个终端命令创建了一个shortcut:

/usr/local/Cellar/emacs-mac/emacs-26.2-z-mac-7.6/bin/emacsclient -c -a ""

并使用我的 mac 偏好设置的键盘菜单将其绑定到我偏好的任何键绑定(我将我的设置为 shift + super + e)。

在此之后,您就可以出发了。 Emacs GUI 将在会话开始时启动,并且只需一个快速快捷方式,它将快速打开一个 emacsclient 框架。

PD:不要关闭 emacs GUI,保持它运行是必不可少的,因为 emacsclient 需要它来创建一个新的图形框架。请参阅documentation。

【讨论】:

【参考方案3】:

通过从其他线程收集信息,我终于想出了一个非常简单的解决方案。

像这样创建一个 shell 脚本:

#!/bin/sh
if ps -e | grep '[E]macs.app' > /dev/null; then
    emacsclient -n "$@"
else
    open -a "Emacs" --args --chdir $PWD "$@"
fi
# The --chdir argument is necessary to pass relative paths to Emacs.

并将其命名为 emacs 并将其放在 PATH 包含的位置。

然后,您只需键入

$ emacs fileyouwanttoopen

如果 GUI emacs 没有运行,脚本会启动它。如果它正在运行,脚本会要求它处理文件。

【讨论】:

以上是关于使用 emacsclient 打开文件时在 OS X 上使用 GUI Emacs的主要内容,如果未能解决你的问题,请参考以下文章

Mac OS X:如何在emacs客户端的shell中永久更改提示符(PS1的值)?

Emacs服务器模式以及emacsclient配置

以其他用户身份在其他机器上使用 Emacs server 和 emacsclient

在 Max OS X 上进行 packageDebug 时在 Android Studio 中启动错误的问题

在脚本中打开文件时在编辑器中打开文件

Go 程序错误(Bettercap 2)取决于我在运行 ble 扫描时在 Ubuntu/Raspberry Pi OS 上使用的蓝牙加密狗