Estoy ejecutando gnu emacs 23.3.1 cocoa build en OS X 10.6.
Agregué lo siguiente a ~ / Library / LaunchAgents / gnu.emacs.daemon.plist para que inicie un demonio y reinicie automáticamente emacs si lo mato inadvertidamente.
<?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>
Esto funciona, pero noté que mi tema de color no funcionaba correctamente. Entonces recordé que había agregado lo siguiente a mi archivo init:
(when window-system
(require 'alpha)
(require 'color-theme-ir-black)
(modify-frame-parameters (selected-frame) '((alpha . 85)))
(color-theme-ir-black))
Cuando se inicia como un sistema de ventana de daemon, aparentemente es falso y eso tiene sentido, sin embargo, la razón por la que agregué esto es porque ocasionalmente me gusta iniciar la compilación normal de emacs en un terminal desde ssh, etc. y este esquema de color es completamente ilegible en iTerm, por lo tanto, el (cuando sistema de ventanas ...). ¿Hay alguna manera de obligar a emacs a iniciar el modo ventana cuando comienza con --daemon?
Otro problema que he notado es que cuando ejecuto presionar sw (delete-frame) en modo dameon, no recibo el intento de error de eliminar el único marco visible o iconificado y emacs continúa ejecutándose en segundo plano. Me gusta esto en su mayor parte, sin embargo, he notado que una vez que se elimina el último fotograma, ya no puedo volver a abrir emacs desde el documento y aunque emacs se activará y se mostrarán los menús, no funcionan y no puedo crear un nuevo fotograma excepto mediante el uso de emacsclient desde la línea de comandos. ¿Alguien más tiene este problema o recomendación sobre la solución? tal vez pueda vincular sw para detectar si el último fotograma e iconify-frame en su lugar, pero no estoy seguro de por qué cree que no es la última ventana y me permitió matarlo en primer lugar.
ACTUALIZAR:
Encontré un comentario en el siguiente blog de Steve Purcell con una solución para un problema muy similar: http://emacs-fu.blogspot.com/2009/03/color-theming.html
El secreto que parece es usar el gancho 'after-make-frame-functions' para configurar el marco recién creado y también (setq color-theme-is-global nil) para que cada marco pueda tener su propio tema de color. Entonces las secciones relevantes de mi init ahora se ven así:
(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)))
Sin embargo, todavía tengo el problema de que delete-frame cierra el último fotograma cuando emacs se inició como daemon y no me permite crear un nuevo fotograma con el uso de emacsclient.
ACTUALIZAR:
Si veo eval (frame-list)
que hay 2 cuadros enumerados aunque solo uno sea visible. Noté que esto no ocurre si inicio Emacs con open en /Applications/Emacs.app
lugar de emacsclient. Normalmente comienzo emacs desde la línea de comandos con un alias e='emacsclient -c -n '
que es lo que crea el segundo marco. Parece que solo puedo unirme al otro marco iniciando emacs con el comando abrir. Si intento emacsclient -n somefile sin -c
obtener nada, y si ejecuto emacsclient -n -e '(frame-list)'
veo que hay un marco simplemente no es visible hasta que lo uso -c
para crear un nuevo marco o abrir emacs desde la carpeta de aplicaciones.