我正在OS X 10.6上运行gnu emacs 23.3.1可可。
我将以下内容添加到〜/ Library / LaunchAgents / gnu.emacs.daemon.plist中,这样它将启动一个守护程序,并且如果我无意中杀死了它,它会自动重新启动emacs。
<?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>gnu.emacs.daemon</string>
<key>ProgramArguments</key>
<array>
<string>/Applications/Emacs.app/Contents/MacOS/Emacs</string>
<string>--daemon</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>ServiceDescription</key>
<string>Gnu Emacs Daemon</string>
</dict>
</plist>
这种排序有效,但我注意到我的颜色主题无法正常工作。然后,我想起我已经在初始化文件中添加了以下内容:
(when window-system
(require 'alpha)
(require 'color-theme-ir-black)
(modify-frame-parameters (selected-frame) '((alpha . 85)))
(color-theme-ir-black))
当作为守护程序启动时,窗口系统显然是错误的,这是有道理的,但是我添加此代码的原因是因为我偶尔想从ssh等启动终端中的普通emacs构建,并且此颜色方案在iTerm中是完全不可读的,因此(当窗口系统...时)。使用--daemon启动时,是否有一种方法可以强制emacs启动窗口模式?
我注意到的另一个问题是,当我在dameon模式下运行press sw(删除帧)时,我没有收到尝试删除唯一可见或图标化帧的错误尝试,而emacs仍在后台运行。我在大多数情况下都喜欢这样做,但是我注意到,一旦最后一帧被杀死,我将无法再从文档中重新打开emacs,尽管emacs将激活并且显示菜单,但它们将无法工作,并且我无法创建新框架通过命令行使用emacsclient除外。其他人有此问题和/或建议解决方法吗?也许我可以绑定sw来检测是否是最后一帧和iconify-frame,但是不确定为什么它认为它不是最后一个窗口,并让我首先将其杀死。
更新:
我在Steve Purcell的以下博客上找到了一个评论,该评论针对一个非常相似的问题进行了修复:http : //emacs-fu.blogspot.com/2009/03/color-theming.html
看起来的秘密似乎是使用“ after-make-frame-functions”钩子来设置新创建的框架,并且还设置为“ setq color-theme-is-global nil”,以便每个框架都可以具有自己的颜色主题。因此,我的init的相关部分如下所示:
(defvar after-make-console-frame-hooks '()
"Hooks to run after creating a new TTY frame")
(defvar after-make-window-system-frame-hooks '()
"Hooks to run after creating a new window-system frame")
(defun run-after-make-frame-hooks (frame)
"Selectively run either `after-make-console-frame-hooks' or
`after-make-window-system-frame-hooks'"
(select-frame frame)
(run-hooks (if window-system
'after-make-window-system-frame-hooks
'after-make-console-frame-hooks)))
(add-hook 'after-make-frame-functions 'run-after-make-frame-hooks)
(add-hook 'after-init-hook (lambda ()
(run-after-make-frame-hooks (selected-frame))))
(setq color-theme-is-global nil)
(add-hook 'after-make-window-system-frame-hooks
'(lambda ()
(require 'alpha)
(require 'color-theme-ir-black)
(modify-frame-parameters (selected-frame) '((alpha . 85)))
(color-theme-ir-black)
(global-set-key (kbd "s-w") 'delete-frame)))
但是,我仍然遇到这样的问题:当emacs作为守护程序启动时,删除帧会关闭最后一帧,并且除了使用emacsclient之外,不允许我创建新帧。
更新:
如果我eval (frame-list)
看到列出了2个帧,即使只有一个可见。我注意到如果我用open /Applications/Emacs.app
而不是emacsclient 启动Emacs,则不会发生这种情况。我通常从命令行使用别名e='emacsclient -c -n '
创建emacs,这是创建第二个框架的原因。我似乎只能通过使用open命令启动emacs来附加到其他框架。如果我尝试emacsclient -n somefile却-c
一无所获,如果我运行,emacsclient -n -e '(frame-list)'
我会看到一个框架,直到我-c
用来创建新框架或从应用程序文件夹打开emacs 之前,它是不可见的。