さまざまなプログラムが、特定のテキストを編集するために任意のエディタを呼び出すことができます。例えば、バージョン管理プログラムはバージョン管理ログを入力するためにエディタを呼び出し(バージョン管理を参照)、Unixのmailユーティリティは送信するメッセージを入力するためにエディタを呼び出します。慣習的に、使用するエディタは環境変数EDITORで指定されます。EDITORに‘emacs’を設定した場合、Emacsが呼び出されますが、新しいEmacsプロセスを起動するという不便な方法になります。これが不便なのは、新しいEmacsプロセスが、既存のいかなるEmacsプロセスともバッファやコマンド履歴、その他の種類の情報を共有しないためです。
Emacsを編集サーバーとして設定し、外部からの編集リクエストを「待ち受け」てそれに応じて動作させることで、この問題を解決できます。Emacsサーバーを起動する方法はいくつかあります:
server-start を実行します。M-x
server-start と入力するか、initファイルに式 (server-start) を記述してください(Emacs初期化ファイル
を参照)。既存のEmacsプロセスがサーバーとなり、Emacsを終了すると、サーバーはEmacsプロセスと共に終了します。
server-startを呼び出し、初期フレームは開きません。その後、クライアントからの編集リクエストを待機します。
emacsclient
を実行します。これにより、Emacsデーモンが起動していない場合に限り、Emacsデーモンが起動します。
systemd を使用している場合、提供されている
systemd ユニットファイル を利用することで、ログイン時に Emacs
をデーモンモードで自動的に起動できます。これを有効にするには:
systemctl --user enable emacs
(Emacsを標準外の場所にインストールした場合は、emacs.serviceファイルを~/.config/systemd/user/などの標準ディレクトリにコピーする必要があるかもしれません。)
systemdのソケット機能です。systemdサービスがソケットを作成して接続を待ち受け、emacsclientが初めて接続すると、systemdがEmacsサーバーを起動し、emacsclientの接続を処理するためにそのソケットを引き渡します。
この機能を利用するための設定例は以下の通りです。
~/.config/systemd/user/emacs.socket:
[Socket] ListenStream=/path/to/.emacs.socket DirectoryMode=0700 [Install] WantedBy=sockets.target
(上記 emacs.service ファイルもインストールする必要があります。)
ListenStream パスは、Emacs が emacsclient からの接続を待ち受けるパスとなります。これは任意に指定したファイルです。
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サーバーに接続できます。デーモンがまだ起動していない場合は、起動します。
プログラムによっては異なる環境変数を使用する場合があります。例えば、TeXに‘emacsclient’を使わせるには、環境変数TEXEDITを‘emacsclient +%d
%s’に設定します。