Emacs als Daemon unter OS X mit Windows-System

13

Ich verwende Gnu Emacs 23.3.1 Cocoa Build auf OS X 10.6.
Ich habe ~ / Library / LaunchAgents / gnu.emacs.daemon.plist Folgendes hinzugefügt, damit ein Daemon gestartet wird und Emacs automatisch neu gestartet wird, wenn ich ihn versehentlich beendet habe.

<?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>

Diese Art funktioniert, aber ich habe festgestellt, dass mein Farbschema nicht richtig funktioniert. Dann fiel mir ein, dass ich meiner Init-Datei Folgendes hinzugefügt hatte:

(when window-system 
  (require 'alpha)
  (require 'color-theme-ir-black)
  (modify-frame-parameters (selected-frame) '((alpha . 85)))
  (color-theme-ir-black))

Wenn als Daemon Windows-System gestartet wird, ist dies anscheinend falsch und das macht Sinn, aber der Grund, warum ich dies hinzufügte, ist, dass ich gelegentlich die normalen Emacs, die in einem Terminal von ssh usw. eingebaut sind, starten möchte und dieses Farbschema in iTerm daher völlig unlesbar ist (beim Fenstersystem ...). Gibt es eine Möglichkeit, Emacs zu zwingen, den Fenstermodus zu starten, wenn Sie mit --daemon beginnen?

Ein weiteres Problem, das mir aufgefallen ist, ist, dass ich beim Ausführen von sw (Delete-Frame) im Dameon-Modus nicht den Fehler versuche, den einzigen sichtbaren oder symbolisierten Frame zu löschen, und dass Emacs weiterhin im Hintergrund ausgeführt wird. Ich mag das größtenteils, aber ich habe bemerkt, dass ich, sobald der letzte Frame getötet ist, keine Emacs mehr aus dem Dokument öffnen kann und obwohl Emacs aktiviert werden und Menüs angezeigt werden, funktionieren sie nicht und ich kann keinen neuen Frame erstellen außer mit emacsclient von der Kommandozeile. Hat jemand anderes dieses Problem und / oder eine Empfehlung zur Problemumgehung? Vielleicht kann ich sw binden, um festzustellen, ob stattdessen der letzte Frame und der Iconify-Frame vorhanden sind, aber ich bin mir nicht sicher, warum er denkt, dass es nicht das letzte Fenster ist, und erlaubte mir, es überhaupt zu töten.

AKTUALISIEREN:

Ich habe einen Kommentar in dem folgenden Blog von Steve Purcell gefunden, der ein sehr ähnliches Problem behebt: http://emacs-fu.blogspot.com/2009/03/color-theming.html

Das Geheimnis scheint zu sein, 'after-make-frame-functions hook' zu verwenden, um den neu erstellten Frame einzurichten und (setq color-theme-is-global nil), damit jeder Frame sein eigenes Farbschema haben kann. Die relevanten Abschnitte meines Init sehen nun so aus:

(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)))

Ich habe jedoch immer noch das Problem, dass delete-frame das letzte Bild schließt, als emacs als Dämon gestartet wurde, und mir nicht erlaubt, ein anderes Bild als mit emacsclient zu erstellen.

AKTUALISIEREN:

Wenn ich eval (frame-list)sehe, werden 2 Frames aufgelistet, obwohl nur einer sichtbar ist. Mir ist aufgefallen, dass dies nicht der Fall ist, wenn ich Emacs mit open /Applications/Emacs.appanstelle von emacsclient starte. Normalerweise starte ich Emacs von der Kommandozeile aus mit einem Alias, e='emacsclient -c -n 'der den zweiten Frame erzeugt. Ich kann mich nur anscheinend mit dem anderen Frame verbinden, indem ich Emacs mit dem Befehl open starte. Wenn ich emacsclient -n in einer Datei versuche, ohne dass -cich nichts erhalte, und wenn ich starte, sehe ich, emacsclient -n -e '(frame-list)'dass es einen Rahmen gibt, der nur dann sichtbar ist, wenn ich -ceinen neuen Rahmen erstelle oder Emacs aus dem Anwendungsordner öffne.

Kurt Harriger
quelle
Das sieht nicht nach einer Emacs-Frage aus.
4.

Antworten:

1

Wenn Sie einen Prozess oder eine Anwendung als launchd-Daemon ausführen, unterscheidet sich die Umgebung erheblich von der normalen Ausführung oder der Befehlszeile. Ich frage mich, ob es möglicherweise nicht besser funktioniert, stattdessen ein Shell-Skript als Anmeldeelement zu verwenden.

Beispielsweise:

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

Dieses Skript muss in einer Datei mit einer .commandErweiterung und 755-Berechtigungen ( chmod 0755 myemacsscript.command) gespeichert und dann dem Bereich Systemeinstellungen: Anmeldung: Anmeldeelemente hinzugefügt werden.

Wenn Sie sich anmelden, wird Terminal dieses Skript starten und ausführen. Möglicherweise möchten Sie ein Standard-Terminalprofil einrichten, das verhindert, dass das Terminal beim Beenden dieses bestimmten Skripts aufgefordert wird, damit Sie beim Abmelden nicht gestört werden.

Ich habe keine Ahnung, ob dies die besonderen Probleme mit Emacs.app behebt, aber es kann zumindest eine Umgebung bieten, die näher an den Erwartungen von Emacs.app liegt.

Seth Noble
quelle