Emacs en tant que démon sur OS X avec système de fenêtres


13

J'exécute gnu emacs 23.3.1 cacao construit sur OS X 10.6.
J'ai ajouté ce qui suit à ~ / Library / LaunchAgents / gnu.emacs.daemon.plist pour qu'il lance un démon et redémarre automatiquement emacs si je le tue par inadvertance.

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

Cela fonctionne, mais j'ai remarqué que mon thème de couleur ne fonctionnait pas correctement. Puis je me suis souvenu que j'avais ajouté ce qui suit à mon fichier init:

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

Démarré en tant que démon, le système de fenêtre est apparemment faux, ce qui est logique. Cependant, j’ai ajouté ceci parce que j’aime parfois lancer la construction normale d’emacs dans un terminal à partir de ssh, etc. (quand le système de fenêtre ...). Existe-t-il un moyen de forcer emacs à démarrer en mode fenêtre lors du démarrage avec --daemon?

Un autre problème que j'ai remarqué est que lorsque j'exécute, j'appuie sur sw (delete-frame) en mode dameon. Je ne reçois pas la tentative d'erreur consistant à supprimer l'unique cadre visible ou iconifié, et emacs continue de s'exécuter en arrière-plan. J'aime la plupart du temps, mais j'ai remarqué qu'une fois la dernière image supprimée, je ne pouvais plus rouvrir emacs à partir de la doc et, bien qu'emacs s'active et que les menus sont affichés, ils ne fonctionnent pas et je ne peux pas créer de nouvelle image. sauf en utilisant emacsclient à partir de la ligne de commande. Quelqu'un d'autre a ce problème et / ou une recommandation sur la solution de contournement? peut-être que je peux lier sw pour détecter si dernière image et iconify-frame à la place, mais je ne sais pas pourquoi il pense que ce n’est pas la dernière fenêtre et m’a permis de le tuer en premier lieu.

METTRE À JOUR:

J'ai trouvé un commentaire sur le blog suivant de Steve Purcell avec un correctif pour un problème très similaire: http://emacs-fu.blogspot.com/2009/03/color-theming.html

Le secret semble être d'utiliser le crochet 'after-make-frame-functions pour configurer le cadre nouvellement créé ainsi que pour (setq color-theme-is-global nil) afin que chaque cadre puisse avoir son propre thème de couleur. Donc, les sections pertinentes de mon init ressemblent maintenant à ceci:

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

Cependant, je suis toujours confronté au problème suivant: delete-frame ferme la dernière image lorsque emacs a été démarré en tant que démon et ne me permet pas de créer une nouvelle image autrement qu'avec emacsclient.

METTRE À JOUR:

Si je eval (frame-list)vois, il y a 2 cadres listés même si un seul est visible. J'ai remarqué que cela ne se produit pas si je lance Emacs avec open /Applications/Emacs.appau lieu de emacsclient. Je commence normalement emacs à partir de la ligne de commande avec un alias e='emacsclient -c -n 'qui crée le deuxième cadre. Je ne peux que sembler m'attacher à l'autre cadre en démarrant emacs avec la commande open. Si j'essaie emacsclient -n un fichier sans -crien obtenir, et si je lance, emacsclient -n -e '(frame-list)'je vois qu'il y a un cadre qui n'est tout simplement pas visible jusqu'à ce que je l'utilise -cpour créer un nouveau cadre ou ouvrir emacs à partir du dossier des applications.


Cela ne ressemble pas à une question d'Emacs.
Ceving

Réponses:


1

L'exécution d'un processus ou d'une application en tant que démon launchd lui confère un environnement très différent de son exécution normale ou en ligne de commande. Je me demande si cela ne fonctionnerait pas mieux si vous utilisiez plutôt un script shell comme élément de connexion.

Par exemple:

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

Ce script doit être enregistré dans un fichier avec une .commandextension et 755 autorisations ( chmod 0755 myemacsscript.command), puis ajouté au volet Préférences système: Connexion: éléments de connexion.

Lorsque vous vous connectez, Terminal lancera et exécutera ce script. Vous voudrez probablement configurer un profil de terminal par défaut qui exclut le terminal de l'invite à quitter pour ce script particulier, afin qu'il ne vous bloque pas lorsque vous vous déconnectez.

Je ne sais pas du tout si cela résoudra les problèmes particuliers posés par Emacs.app, mais cela peut au moins fournir un environnement plus proche de celui attendu par Emacs.app.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.