GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/emacs/Emacs-Server.html ・ emacs-doc.conao3.com

41 Emacsをサーバーとして使う

さまざまなプログラムが、特定のテキストを編集するために任意のエディタを呼び出すことができます。例えば、バージョン管理プログラムはバージョン管理ログを入力するためにエディタを呼び出し(バージョン管理を参照)、Unixのmailユーティリティは送信するメッセージを入力するためにエディタを呼び出します。慣習的に、使用するエディタは環境変数EDITORで指定されます。EDITORに‘emacs’を設定した場合、Emacsが呼び出されますが、新しいEmacsプロセスを起動するという不便な方法になります。これが不便なのは、新しいEmacsプロセスが、既存のいかなるEmacsプロセスともバッファやコマンド履歴、その他の種類の情報を共有しないためです。

Emacsを編集サーバーとして設定し、外部からの編集リクエストを「待ち受け」てそれに応じて動作させることで、この問題を解決できます。Emacsサーバーを起動する方法はいくつかあります:

Emacsサーバーを起動したら、emacsclientというシェルコマンドを使用してEmacsプロセスに接続し、ファイルを開くよう指示できます。その後、環境変数EDITORを‘emacsclient’に設定すれば、外部プログラムは編集に既存のEmacsプロセスを利用するようになります。32

変数 server-name を使用して各サーバーに一意の サーバー名 を指定することで、同一マシン上で複数の Emacs サーバーを動作させることができます。例えば、M-x set-variable RET server-name RET "foo" RET はサーバー名を ‘foo’ に設定します。emacsclient プログラムでは、サーバーが TCP ソケットを使用しているかどうかに応じて、‘-s’ または ‘-f’ オプション(emacsclient オプション を参照)を用いてサーバー名で指定できます(TCP Emacs サーバー を参照)。

複数のEmacsデーモンを起動したい場合(初期オプションを参照)、次のように各デーモンに個別のサーバー名を指定できます。

  emacs --daemon=foo

Emacsサーバーは、特定の条件を満たした際に自動的に停止させることも可能です。これを行うには、オプション server-stop-automatically に以下のいずれかの値を設定してください:

empty

この値を設定すると、クライアントがおらず、未保存のファイル閲覧バッファもなく、実行中のプロセスもなくなった時点でサーバーが停止します。

delete-frame

この値は、最後のクライアントフレームが閉じられる際に、保存されていないファイル参照バッファをすべて保存し、未完了のプロセスをすべて停止させるかどうかを確認し、その場合はサーバーを停止することを意味します。

kill-terminal

この値は、最後のクライアントフレームを C-x C-c (save-buffers-kill-terminal) で閉じる際に、保存されていない各ファイルアクセスバッファを保存する必要があるか、未完了の各プロセスを停止できるかが問われ、その場合はサーバーが停止されることを意味します。

一意のサーバー名でサーバーを定義している場合、別のEmacsインスタンスからそのサーバーに接続し、server-eval-at関数を用いてサーバー上でLisp式を評価することが可能です。例えば、(server-eval-at "foo" '(+ 1 2))は‘foo’サーバー上で式(+ 1 2)を評価し、3を返します。(その名前のサーバーが存在しない場合は、エラーが通知されます。)現在、この機能は主に開発者にとって有用です。

OSのデスクトップ環境がfreedesktop.org互換である場合(ほとんどのGNU/Linuxやその他の近年のUnix系GUIがこれに当たります)、‘Emacs (Client)’メニュー項目を使用してemacsclientでEmacsサーバーに接続できます。デーモンがまだ起動していない場合は、起動します。


脚注

(32)

プログラムによっては異なる環境変数を使用する場合があります。例えば、TeXに‘emacsclient’を使わせるには、環境変数TEXEDITを‘emacsclient +%d %s’に設定します。