Emacs como daemon no OS X com sistema de janelas

13

Estou executando o gnu emacs 23.3.1 cacau build no OS X 10.6.
Adicionei o seguinte a ~ / Library / LaunchAgents / gnu.emacs.daemon.plist para que ele inicie um daemon e reinicie automaticamente o emacs se eu o matar 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>

Isso meio que funciona, mas notei que meu tema de cores não estava funcionando corretamente. Lembrei que havia adicionado o seguinte ao meu arquivo de inicialização:

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

Quando iniciado como um sistema de janelas daemon é falso, aparentemente, e isso faz sentido; no entanto, a razão pela qual adicionei isso é porque ocasionalmente gosto de iniciar a compilação normal do emacs em um terminal a partir do ssh etc, e esse esquema de cores é completamente ilegível no iTerm, portanto (quando o sistema de janelas ...). Existe uma maneira de forçar o emacs a iniciar o modo janela quando iniciar com --daemon?

Outro problema que notei é que, quando executo pressione sw (delete-frame) no modo dameon, não recebo a tentativa de erro para excluir o único quadro visível ou iconificado e o emacs continua em execução em segundo plano. Eu gosto disso na maioria das vezes, no entanto, notei que depois que o último quadro é eliminado, não consigo mais reabrir o emacs do documento e, embora o emacs seja ativado e os menus sejam exibidos, eles não funcionam e não consigo criar um novo quadro exceto usando o emacsclient na linha de comando. Alguém mais tem esse problema e / ou recomendação sobre a solução alternativa? talvez eu possa ligar o sw para detectar o último quadro e o quadro de ícones, mas não sei por que ele acha que não é a última janela e me permitiu matá-lo em primeiro lugar.

ATUALIZAR:

Encontrei um comentário no blog de Steve Purcell a seguir com uma correção para um problema muito semelhante: http://emacs-fu.blogspot.com/2009/03/color-theming.html

Parece que o segredo é usar o gancho 'after-make-frame-functions para configurar o quadro recém-criado e também para (setq cor-tema-é-global-nulo) para que cada quadro possa ter seu próprio tema de cores. Portanto, as seções relevantes do meu init agora são assim:

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

No entanto, ainda estou tendo o problema em que o delete-frame fecha o último quadro quando o emacs foi iniciado como daemon e não me permite criar um novo quadro diferente do uso do emacsclient.

ATUALIZAR:

Se eu eval (frame-list)vejo, há 2 quadros listados, mesmo que apenas um esteja visível. Percebi que isso não ocorre se eu iniciar o Emacs com open em /Applications/Emacs.appvez de emacsclient. Normalmente inicio o emacs a partir da linha de comando com um alias, e='emacsclient -c -n 'que é o que cria o segundo quadro. Só consigo anexar ao outro quadro iniciando o emacs com o comando open. Se eu tentar o emacsclient -n somefile sem -creceber nada, e se eu executar emacsclient -n -e '(frame-list)', vejo que há um quadro que não fica visível até que eu use -cpara criar um novo quadro ou abrir o emacs a partir da pasta de aplicativos.

Kurt Harriger
fonte
Isso não parece uma pergunta do Emacs.
ceving 04/06/11

Respostas:

1

A execução de um processo ou aplicativo como um daemon launchd fornece um ambiente muito diferente da execução normal ou na linha de comandos. Gostaria de saber se pode não funcionar melhor para usar um script de shell como um item de login.

Por exemplo:

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

Esse script precisaria ser salvo em um arquivo com uma .commandextensão e 755 permissões ( chmod 0755 myemacsscript.command) e, em seguida, adicionado ao painel Preferências do Sistema: Login: Itens de Login.

Quando você faz login, o Terminal inicia e executa esse script. Você provavelmente desejará configurar um perfil de terminal padrão que impeça o terminal de solicitar o encerramento desse script em particular, para que ele não o prenda quando você se desconectar.

Não tenho idéia se isso resolverá os problemas específicos do Emacs.app, mas pode pelo menos fornecer um ambiente mais próximo do que o Emacs.app espera.

Seth Noble
fonte