web-dev-qa-db-ja.com

emacsデーモンを正常にシャットダウンする方法は?

Ubuntuにログインすると、Ubuntuのスタートアッププログラムを使用してEmacs(バージョン23)デーモンを起動します。その後、何かを編集する必要があるときはいつでも、Emacsクライアントを起動します。もちろん、Ubuntuからログオフすると、Emacsがまだ実行中であると表示されます。ログオフ/シャットダウン時にemacsをシャットダウンするようにGnomeに指示するスクリプトをどこかに添付する必要があります。

1)スクリプトはどのように見えるべきですか? 「kill-emacs」が機能しないようです。

2)このスクリプトはどこに配置すればよいですか?起動プログラム([システム]-> [セッション]メニュー)パネルには、便利なものは何もありません。 PostSessionスクリプトやその他の何かをrootアクセスでハッキングするよりも、ユーザーのアカウントで機能するものがいいと思います。

45
projectshave

このlinuxquestions.orgページ にはPythonスクリプトがあり、シャットダウン中にGnomeが発行する「自分を保存」イベントをリッスンします。これを変更できます。行うには:

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

公式ドキュメント: https://www.emacswiki.org/emacs/EmacsAsDaemon#toc8

14
genehack

ShreevatsaRは正しいです。答えはkill-emacsまたはsave-buffers-kill-emacsです。どちらもインタラクティブなので、M-x save-buffers-kill-emacsを使用してEmacs内から実行できます。変更したファイルを保存できるので、これがおそらく最良の方法です。

別の方法は、次のようなシェルファイルを作成することです。

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

どこからでも実行できる(メニューアイコン、パネルなど)。

31
haxney

ShreevatsaRへの別の補足:pythonスクリプトは魅力のように機能しますが、使用することをお勧めします

emacsclient -e '(let ((last-nonmenu-event nil))(save-buffers-kill-emacs))'

またはさらにもっと凝った(emacs設定のどこかに):

_(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 display '((window-system . x))))
  )
  (let ((last-nonmenu-event nil)(window-system "x"))(save-buffers-kill-emacs)))
_

その後:

emacsclient -e '(shutdown-emacs-server)'
9
willert

systemdを使用する場合、コンソール/リモートシステム内からEmacsサーバーを適切に管理できるこのユニットファイルに興味があるかもしれません。

[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

(すでに上で提案されたのと同じ方法でデーモンを殺します。)

ユニットファイルを〜/ .config/systemd/user/emacs.serviceのように配置して名前を付けると、ルートとして実行する代わりにユーザーにバインドされます。それを管理する:

$ systemctl --user {enable、disable、start、restart、stop} emacs.service

注意してください:私はどこかからこのメモを取りましたが、どこで覚えていません。

5
cig0

/etc/init.dでスクリプトを使用する方がよりクリーンなソリューションだと思います。詳細については、ここをチェックしてください http://www.emacswiki.org/emacs/EmacsAsDaemon

5
sub

willertからの回答には小さなバグが含まれています。それは次のようでなければなりません


(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

おそらく最も一般的な解決策は、システムのPostSessionディレクトリにスクリプトを置き、〜/ .logout-dなどの実行可能スクリプトをすべて実行することです。次に、好きなスクリプトを〜/ .logout-dに置くと、ログアウト時に実行されます。

スクリプトはrun-parts ~/.logout.dと同じくらい簡単かもしれません。

注:未テストですが、run-parts ~/.autostart.dを実行する起動スクリプトを使用していますが、これは永遠に問題なく機能しています。

編集:もちろん、上記のpythonスクリプトを変更して同じコマンドを実行するのと同じくらい簡単ですが、私は個人的にセッション全体のスクリプトをロードするのは好きではありません。ログアウト時にコマンドを実行します。

1
Ryan Thompson

emacsclient -e "(kill-emacs)"をGDMのPostSessionディレクトリに配置するか、デフォルトのスクリプトに直接配置できます。

/etc/gdm/PostSession/Default

GDMドキュメント も参照してください。

1
danielpoe