web-dev-qa-db-fra.com

Comment arrêter avec gracieusement emacs Daemon?

Sur la connexion à Ubuntu, je démarre un démon EMACS (version 23) utilisant les programmes de démarrage d'Ubuntu. Je commence ensuite les clients d'Emacs chaque fois que je dois éditer quelque chose. Lorsque je me déconnecte de Ubuntu, il dit que Emacs est toujours en cours d'exécution, bien sûr. Je dois joindre un script quelque part pour dire à Gnome d'arrêter les emacs lorsque je me déconnecte/arrêt.

1) Quel devrait ressembler le script? "Kill-Emacs" ne semble pas fonctionner.

2) Où devrais-je mettre ce script? Il n'y a rien dans le panneau Programmes de démarrage (System-> Sessions Menu) qui a l'air utile. Je préférerais quelque chose qui fonctionne dans le compte de l'utilisateur plutôt que de pirater le script de postsession ou autre chose avec un accès root.

45
projectshave

cette page LinuxQuestions.org a un Python Script pouvant être exécuté lors de la connexion qui écoute pour l'événement "Savez-vous" que Gnome émet pendant l'arrêt. Vous pouvez modifier que faire le:

emacsclient -e '(save-buffers-kill-emacs)'

Docs officiels: https://www.emacswiki.org/emacs/emacsasdaemon#toc8

14
genehack

Shreevatsar a raison, la réponse est kill-emacs ou save-buffers-kill-emacs, qui sont tous deux interactifs, et peuvent donc être exécutés à partir d'emacs avec M-x save-buffers-kill-emacs. C'est probablement le meilleur moyen de le faire, car vous obtiendrez des fichiers modifiés.

Une autre alternative est de créer un fichier shell comme celui-ci:

#!/bin/bash
emacsclient -e "(kill-emacs)"

Que vous pouvez exécuter de partout où vous le souhaitez (icône de menu, panneau, etc.).

31
haxney

Si vous utilisez Systemd Vous pouvez être intéressé par ce fichier d'unité qui vous permet de gérer un serveur EMACS gracieusement de votre console/système distant:

[Unit]
Description=Emacs: the extensible, self-documenting text editor

[Service]
Type=forking
ExecStart=/usr/bin/emacs --daemon
ExecStop=/usr/bin/emacsclient --eval "(kill-emacs)"
Restart=always

# Remove the limit in startup timeout, since emacs
# cloning and building all packages can take time
TimeoutStartSec=0

[Install]
WantedBy=default.target

(Il tue le démon de la même manière que les gens ont déjà suggéré ci-dessus.)

Vous pouvez mettre et nommer le fichier de l'unité comme ~/.config/Systemd/User/Emac.Service afin qu'il soit lié à votre utilisateur l'exécutant en tant que root; Pour le gérer:

$ SystemCl --User {Activer, désactiver, démarrer, redémarrer, arrêter} emacs.service

Remarque: j'ai pris cette note d'ailleurs, je ne me souviens pas d'où cependant.

5
cig0

Je pense que l'utilisation d'un script dans /etc/init.d est une solution plus propre. Vérifiez ici pour plus de détails http://www.emacswiki.org/emacs/emacsasdaemon

5
sub

la réponse de Willard contient un petit bug. Ça doit ressembler


(defun shutdown-emacs-server () (interactive)
  (when (not (eq window-system 'x))
    (message "Initializing x windows system.")
    (x-initialize-window-system)
    (when (not x-display-name) (setq x-display-name (getenv "DISPLAY")))
    (select-frame (make-frame-on-display x-display-name '((window-system . x))))
  )
  (let ((last-nonmenu-event nil)(window-system "x"))(save-buffers-kill-emacs)))
2
Soenke

Peut-être que la solution la plus générale serait de mettre un script dans le répertoire des postes d'études système qui exécute chaque script exécutable dans ~/.Logout-D, ou quelque chose de similaire. Ensuite, vous pouvez mettre les scripts que vous aimez dans ~/.Logout-D, et ils seront exécutés sur la déconnexion.

Le script pourrait être aussi simple que run-parts ~/.logout.d.

Remarque: non testée, bien que j'utilise un script de démarrage qui fait run-parts ~/.autostart.d, et cela fonctionne bien pour toujours.

EDIT: Bien sûr, il serait tout aussi facile de modifier ce qui précède python Script pour exécuter cette même commande, mais je n'aime personnellement pas l'idée de charger un script pour toute la session Pour exécuter des commandes sur la déconnexion.

1
Ryan Thompson

vous pouvez mettre emacsclient -e "(kill-emacs)" dans le répertoire des postes d'études de GDM ou directement dans le script par défaut:

/etc/gdm/PostSession/Default

voir aussi Documentation GDM .

1
danielpoe