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.app
vez 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 -c
receber 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 -c
para criar um novo quadro ou abrir o emacs a partir da pasta de aplicativos.