mailを始めとする多くのプログラムは、
送信メッセージなどのテキストを編集するために
ユーザーが指定したエディタを起動します。
これらのプログラムは、
習慣として、環境変数EDITORで指定されたエディタを起動します。
EDITORに`emacs'を設定しておけばEmacsが起動しますが、
新たに別のEmacsプロセスが開始されるので不便です。
というのは、新しいEmacsプロセスは既存のEmacsプロセスとバッファを
共有しないからです。
EmacsクライアントとEmacsサーバーを用いて、
mailなどのプログラムが既存のEmacsプロセスを
エディタとして使うようにできます。
以下のようにします。
まずは準備です。
Emacsの中で関数server-startを呼び出します。
(個人のファイル.emacsに式(server-start)を書いておけば、
これを自動的に行える。)
つぎに、Emacsの外で環境変数EDITORに`emacsclient'を設定します。
(プログラムによっては別の環境変数を使う。
たとえば、TeXに`emacsclient'を使わせるには、
環境変数TEXEDITに`emacsclient +%d %s'と設定する。)
こうすると、どのプログラムがEDITORに指定されたプログラムをエディタ
として起動しても、結果としては、訪れるべきファイルを伝える
メッセージが現在動いているEmacsに送られます。
(これがemacsclientの役割。)
Emacsはただちにバッファを表示し、ユーザーはすぐに編集を開始できます。
そのバッファの編集が終ったら、C-x #と打ちます(server-edit)。
これにより、ファイルが保存され、
終了せよとのメッセージをemacslientに送り返します。
EDITORを参照したプログラムは
『エディタ』(実際にはemacsclient)が終了するのを待ちます。
C-x #は複数のファイルに対する外部からの編集要求で
他に残っているものがないかどうかも検査し、
もしあればつぎのファイルを訪問します。
望むなら手でサーバーバッファに切り替えてもかまいません。 必ずC-x #を使わなければならないということはありません。 ただし、C-x #はサーバーバッファの編集が終ったということを 告げる唯一の方法です。
変数server-windowにウィンドウやフレームを設定してあれば、
C-x #はサーバーバッファをそのウィンドウやフレームに表示します。
mailやその他のアプリケーションがemacsclientの終了を
待っているあいだ、emacsclientは端末入力を読みません。
したがって、mailが使っている端末は、そのあいだ実質的に
ブロックされた状態にあります。
サーバーとして使うEmacsで編集をするためには、
その(ブロックしている)端末を使わずに行う必要があります。
それには2つの方法があります。
mailとEmacsとを別のウィンドウで動かす。
mailがemacsclientを待っているあいだ、
mailが動いてるウィンドウはブロックされるが、
他のウィンドウに切り替えればEmacsを使える。
mailなどのプログラムを動かす。
こうすれば、emacsclientはEmacsの下で動いている
サブシェルのみをブロックするので、
Emacsを使ってファイルを編集するのは通常どおり行える。
プログラムによっては、エディタで編集するための作業ファイルを作成します。
ユーザーが作業ファイルを編集し終ると、
プログラムはそのファイルを読み込んでから消去します。
Emacsサーバーがあとで同じ名前のファイルを編集するように告げられた場合、
それはたまたまファイル名が一致しただけで、
内容はまえのファイルと何ら関係ないものと考えなければなりません。
このため、サーバーはファイルを編集し終ると作業ファイルのバッファを削除します。
変数server-temp-file-regexpを使って、
どのようなファイルがここでいう意味での作業ファイルであるか指定します。
この変数の値は、作業ファイルであるようなファイルの名前に
一致する正規表現である必要があります。
オプション`--no-wait'を指定してemacsclientを起動すると、
Emacs上でバッファを編集し終るのを待たずにただちに終了します。