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上でバッファを編集し終るのを待たずにただちに終了します。