Emacs作为带有窗口系统的OS X上的守护程序


13

我正在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 之前,它是不可见的。


这看起来不像是Emacs问题。
ceving 2011年

Answers:


1

将进程或应用程序作为启动的守护程序运行会为它提供与正常运行或在命令行上运行完全不同的环境。我想知道将shell脚本用作登录项是否会更好。

例如:

#!/bin/bash
while true
do
  open -W /Applications/Emacs.app
done

该脚本需要保存到具有.command扩展名和755权限(chmod 0755 myemacsscript.command)的文件中,然后添加到“系统偏好设置:登录:登录项”窗格中。

登录时,终端将启动并运行此脚本。您可能需要设置一个默认的终端配置文件,该配置文件将终端排除在退出该特定脚本的提示之外,以便退出时不会阻止您运行。

我不知道这是否可以解决Emacs.app的特定问题,但它至少可以提供一个更接近Emacs.app期望的环境。

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.