ウィンドウシステムを備えたOS X上のデーモンとしてのEmacs


13

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.appemacsclientではなくopenでEmacsを起動した場合、これは発生しません。私は通常e='emacsclient -c -n '、2番目のフレームを作成するエイリアスでコマンドラインからemacsを起動します。openコマンドでemacsを起動することによってのみ、他のフレームにアタッチするように見えます。-c何も取得せずにemacsclient -n somefileを試してみると、実行emacsclient -n -e '(frame-list)'する-cと、新しいフレームを作成するか、アプリケーションフォルダーからemacsを開くまで表示されないフレームが表示されます。


これはEmacsの質問のようには見えません。
11

回答:


1

プロセスまたはアプリケーションをlaunchdデーモンとして実行すると、通常の実行またはコマンドラインでの実行とはまったく異なる環境が得られます。代わりにシェルスクリプトをログイン項目として使用する方がうまく機能しないのではないかと思います。

例えば:

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

このスクリプトは、.command拡張子と755のアクセス許可(chmod 0755 myemacsscript.command)を持つファイルに保存し、[システム環境設定:ログイン:ログインアイテム]ペインに追加する必要があります。

ログインすると、ターミナルが起動してこのスクリプトを実行します。おそらく、この特定のスクリプトの終了時にプロンプ​​トを表示することから端末を除外するデフォルトの端末プロファイルをセットアップして、ログアウト時にあなたを保持しないようにしたいと思うでしょう。

これがEmacs.appの特定の問題を解決するかどうかはわかりませんが、少なくともEmacs.appが期待する環境により近い環境を提供するかもしれません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.