OS X 10.6でGNU Emacs 23.3.1 cocoaビルドを実行しています。
次を〜/ Library / LaunchAgents / gnu.emacs.daemon.plistに追加して、デーモンを開始し、誤ってkillした場合に自動的に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>
このように動作しますが、カラーテーマが適切に動作していないことに気付きました。それから、initファイルに次を追加したことを思い出しました。
(when window-system
(require 'alpha)
(require 'color-theme-ir-black)
(modify-frame-parameters (selected-frame) '((alpha . 85)))
(color-theme-ir-black))
デーモンウィンドウシステムとして起動したときは明らかに間違っており、それは理にかなっていますが、これを追加した理由は、時々sshなどからターミナルで通常のemacsビルドを開始したいので、この配色はiTermで完全に読めないためです(window-system ...の場合)。--daemonで起動したときにemacsに強制的にウィンドウモードを起動させる方法はありますか?
私が気づいたもう1つの問題は、dameonモードでpress sw(delete-frame)を実行すると、唯一の表示またはアイコン化されたフレームを削除しようとしてエラーが発生せず、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がデーモンとして開始されたときにdelete-frameが最後のフレームを閉じるという問題がまだあり、emacsclientを使用しないと新しいフレームを作成できません。
更新:
私ならばeval (frame-list)
、私もかかわらず、記載された2つのフレームがある参照の一方だけが表示されます。/Applications/Emacs.app
emacsclientではなくopenでEmacsを起動した場合、これは発生しません。私は通常e='emacsclient -c -n '
、2番目のフレームを作成するエイリアスでコマンドラインからemacsを起動します。openコマンドでemacsを起動することによってのみ、他のフレームにアタッチするように見えます。-c
何も取得せずにemacsclient -n somefileを試してみると、実行emacsclient -n -e '(frame-list)'
する-c
と、新しいフレームを作成するか、アプリケーションフォルダーからemacsを開くまで表示されないフレームが表示されます。