Emacs como demonio en OS X con sistema de ventanas


13

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.applugar 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 -cobtener nada, y si ejecuto emacsclient -n -e '(frame-list)'veo que hay un marco simplemente no es visible hasta que lo uso -cpara crear un nuevo marco o abrir emacs desde la carpeta de aplicaciones.


Esto no parece una pregunta de Emacs.
ceving

Respuestas:


1

Ejecutar un proceso o aplicación como un demonio launchd le da un entorno muy diferente de ejecutarlo normalmente o en la línea de comandos. Me pregunto si podría no funcionar mejor usar un script de shell como elemento de inicio de sesión.

Por ejemplo:

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

Este script debería guardarse en un archivo con una .commandextensión y 755 permisos ( chmod 0755 myemacsscript.command) y luego agregarse a las Preferencias del Sistema: Iniciar sesión: Panel de elementos de inicio de sesión.

Cuando inicie sesión, Terminal iniciará y ejecutará este script. Probablemente desee configurar un perfil de terminal predeterminado que excluya a la terminal de solicitar al salir de este script en particular, para que no lo detenga cuando cierre la sesión.

No tengo idea de si esto solucionará los problemas particulares con Emacs.app, pero al menos puede proporcionar un entorno más cercano a lo que Emacs.app espera.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.