Mac上的Emacsdaemon和Emacsclient


25

作业系统:OS X 10.9.5,Mavericks

2014年4月3日在Rainers-MacBook-Pro-3.local上的GNU Emacs 24.3.1(x86_64-apple-darwin13.1.0,Carbon版本1.6.0 AppKit 1265.19)

我通过安装了Emacs 自制railwaycat和它工作得很好-没有抱怨。我不在终端中使用emacs,通常是通过应用程序启动它。

正如我所说-到目前为止我很高兴。

我只有一件事我没有设法正确解决(这在Linux之前可以很好地工作),那就是:

  1. 登录后获取emacs守护程序
  2. 使用emacsclient打开
  3. 关闭emacsdaemon并在注销时保存所有文件

有什么可行的食谱可以帮助我进行设置吗?

补充信息

登录后启动emacs守护程序

我创建了一个执行bash命令的Automator应用程序

/usr/local/bin/emacs --daemon

并将其添加到登录项目中,效果很好。

从终端使用守护程序

我可以通过使用emacs守护程序

emacsclient .bashrc

这将在emacs终端会话中打开.bashrc。

从GUI使用

现在仍然存在问题:如何从GUI中利用它?

据我了解emacsclient,除非指定要打开的文件,否则无法打开emacsclient。

我想打开emacsclient GUI并打开以前打开的所有文件?这可能吗?

我发现我可以使用

emacsclient -c

在终端中做我想做的-但是我可以对GUI做同样的事情吗?


我不明白“来自GUI”的含义。这可能意味着“双击Finder中的文件”或完全不然。
tarsius

使用应用启动器(例如,通过Spotlight)
Rainer

App Launcher是否允许选择文件(然后使用文件类型的默认应用程序打开文件)。还是只有“应用”?emacsclient就OS X而言,它不是一个应用程序,而仅Emacs是(并且只有以这种方式安装的情况下)。您为什么不只使用系统键绑定来选择打开的应用程序/窗口?(如果Emacs是在守护程序模式下启动的,并且还没有框架(“窗口”),则无法使用)。
tarsius 2014年

我定义了一个名为Emacsclient的应用程序,它将启动emacsclient-因此该应用程序Emacsclient在那里。我显然可以切换到正在运行的emacs实例-但这不重要,请看上面描述的工作流程。
Rainer

1
这个问题几乎比回答更有用:)
Roy Truelove

Answers:


6

我真的不介意Emacs.app始终运行,但是我无法不小心杀死Emacs服务器就无法关闭窗口这一事实令人讨厌。即使您真的非常想杀死最后一帧,它也仍然不允许您:“尝试删除唯一可见或图标化的帧”。...所以我们作弊。

当您尝试通过单击关闭按钮关闭最后一个窗口时,此解决方案仅隐藏Emacs(如Command+ h)。

将以下内容添加到您的Emacs初始化中:

(defadvice handle-delete-frame (around my-handle-delete-frame-advice activate)
  "Hide Emacs instead of closing the last frame"
  (let ((frame   (posn-window (event-start event)))
        (numfrs  (length (frame-list))))
    (if (> numfrs 1)
      ad-do-it
      (do-applescript "tell application \"System Events\" to tell process \"Emacs\" to set visible to false"))))

并将Emacs添加到“用户和组>登录项”,然后单击“隐藏”复选框。

您的Emacs初始化也需要在(start-server)某个地方调用。

我正在使用此emacsclient包装器将Emacs首先带到最前面:

#!/bin/sh
osascript -e 'tell application "Emacs" to activate'
exec emacsclient "$@"

问题:

  • 激活/取消隐藏Emacs将所有窗口置于最前面。这有点烦人。
  • 单击Dock中的Emacs图标似乎有时会随机创建一个新窗口。但不总是。
  • TODO:也许最后一帧的make Command+ w也隐藏了Emacs?
  • 编辑的新功能:当所有窗口均最小化时,单击停靠图标不会自动最大化其中之一。

这是@ noaham的基于关闭答案提示,以尽量减少Emacs的,而这个答案解释如何挂钩试图关闭最后一个窗口。

编辑:

通过搜索源,我找到了调用的“键绑定”mac-apple-event-mapmac-ae-reopen-applicationmac-ae-reopen-application似乎要检查可见和图标化的框架,并且必须以某种方式错过我们隐藏的框架。这可能是一个错误。

简单的解决方法是仅在init中禁用键绑定:

(define-key mac-apple-event-map [core-event reopen-application] nil)

这引入了一个新的小错误:当所有窗口都最小化时,单击停靠图标不会自动使其中一个最大化。正确的解决方法是重写mac-ae-reopen-application,但是我几乎不了解emacs和elisp。


如果有人知道如何停止随机的新窗口(第二点),请告诉我。也许这是唯一让我仍然不满意此设置的东西。
parent5446

@ parent5446,完成了!与第一个修复程序一样hacky,但是它可以工作。
bburky

谢谢!hack的部分不会困扰我,因为在大多数情况下,我始终不会从扩展坞启动Emacs。
parent5446

4

不幸的是,emacs的Yamamoto Mitsuharu端口不支持multi-tty(请参阅此问题)。这意味着您无法从终端启动emacs守护程序,也无法使用emacsclient启动gui窗口。

这是我的工作:在init.el中(server-start),我在登录时启动Emacs.app。这里的烦人之处在于,这带来了一个我必须手动最小化的窗口。

然后我有一个bash脚本emacsc,其内容如下

#!/bin/bash                                                                          
export PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
emacsclient -n -c

然后,我使用applescript创建一个包含以下内容的应用

tell application "Emacs"
    activate
end tell
do shell script "~/bin/emacsc"

-n标志传递给emacsclient 很重要,否则您将只能使用emacsc应用程序一次打开一个客户端。设置路径变量可确保OS X可以找到正确版本的emacsclient。

告诉Emacs“激活”可确保您的客户端窗口将在前台启动。

正如我所说的烦人的是,您必须在登录时手动最小化emacs窗口,然后将其放在扩展坞中。避免这种情况的一种方法是在登录后自动“隐藏” Emacs,但是将其激活会导致其取消隐藏。


2

我不确定Railwaycat Emacs与常规的自制方法有何不同,但是使用后者,您可以这样做ln -sfv /usr/local/opt/emacs/*.plist ~/Library/LaunchAgents,它将emacs --daemon在登录时运行。

plist作为公式中的HERE文档包括在内。您需要采用的只是在线更改emacs应用程序的路径<string>#{opt_bin}/emacs</string>

顺便说一句,如果您使用--cocoa选件安装Emacs,则还可以通过Homebrew Emacs将Emacs作为OS X应用程序获得。(您还需要brew linkapps随后运行,以将其链接到/Applications,或者自己创建链接。


1

在Mac守护程序上,有90%的时间是使用launchd进行管理的。它可以在许多触发器上运行它们,包括用户登录/注销。有一个名为Lingon的漂亮的Mac应用程序,用于查看和编辑启动的各种内容。emacs Wiki对此进行了一些提及,包括示例配置文件。但这似乎并没有解决您的问题,即如何在注销时关闭守护程序。


0

创建一个AppleScript应用程序,如下所示:

tell application "Terminal"
do shell script "/usr/local/bin/emacsclient -c"
endtell

您可能必须调整路径,或者您可以完全省略路径。如果还没有启动守护程序,您还可以使用一些幻想的东西来启动它。


@Rainer在这方面有成功吗?您可能还想搜索更高级的实现,甚至在必要时启动守护程序,然后再使用emacsclient连接到它。“ applescript emacsclient”在Google搜索中给出了良好的结果。
tarsius 2014年

您是否还在等待更好的答案,还是可以接受这个答案?
tarsius
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.