このセクションでは特定のファイルや特定のサブプロセス実行時のデフォルトコーディングシステムを指定する変数、およびそれらへアクセスするためのI/O処理が使用する関数について説明します。
これらの変数は希望するデフォルトにそれらすべてを一度セットして、その後は再びそれを変更しないというアイデアにもとづいています。Lispプログラム内の特定の処理で特定のコーディングシステムを指定するために、これらの変数を変更しないでください。かわりにcoding-system-for-read
やcoding-system-for-write
を使用して、それらをオーバーライドしてください(単一の操作にたいするコーディングシステムの指定を参照)。
この変数はテキストパターンと対応するコーディングシステムのalist。要素はそれぞれ(regexp
.
coding-system)
という形式をもつ。冒頭の数キロバイトがregexpにマッチするファイルは、そのコンテンツをバッファーに読み込む際にcoding-systemによりデコードされる。このalist内のセッティングはファイル内のcoding:
タグ、およびfile-coding-system-alist
(以下参照)の内容より優先される。デフォルト値は、Emacsが自動的にBabylフォーマットのメールファイルを認識してコード変換なしでそれらを読み取れるようにセットされている。
この変数は特定のファイルの読み書きに使用するコーディングシステムを指定するalist。要素はそれぞれ(pattern
.
coding)
という形式をもち、patternは特定のファイル名にマッチする正規表現。この要素はpatternにマッチするファイル名に適用される。
要素のCDRとなるcodingはコーディングシステム、2つのコーディングシステムを含むコンスセル、または関数名(関数定義をもつシンボル)であること。codingがコーディングシステムなら、そのコーディングシステムはファイルの読み込みと書き込みの両方で使用される。codingが2つのコーディングシステムを含むコンスセルなら、CARはデコード用のコーディングシステム、CDRはエンコード用のコーディングシステムを指定する。
codingが関数名なら、それはfind-operation-coding-system
に渡されたすべての引数からなるリストを唯一の引数とする関数であること。これはコーディングシステム、または2つのコーディングシステムを含むコンスセルをリターンしなければならない。この値は上記と同じ意味をもつ。
coding (または上記関数のリターン値)がundecided
なら通常のコード検出が行われる。
この変数は特定のファイルの読み書きに使用するコーディングシステムを指定するalist。この変数の形式はfile-coding-system-alist
の形式と似ているが、後者と異なるのはこの変数がファイル内のcoding:
タグより優先されること。
この変数は何のプログラムがサブプロセス内で実行中かによって、そのサブプロセスにたいしてどのコーディングシステムを使用するかを指定するalist。これはfile-coding-system-alist
と同じように機能するが、patternがそのサブプロセスを開始するために使用されたプログラム名にたいしてマッチされる点が異なる。コーディングシステム、またはalist内で指定されたコーディングシステムは、そのサブプロセスへのI/Oに使用されるコーディングシステムの初期化に使用されるが、set-process-coding-system
を使用して後から他のコーディングシステムを指定できる。
警告:
データからコーディングシステムを判断するundecided
のようなコーディングシステムは、非同期のサブプロセスでは完全な信頼性をもって機能はしない。これはEmacsが非同期サブプロセスの出力を到着によりバッチ処理するためである。そのコーディングシステムが文字コード変換や行末変換を未指定にしておくと、Emacsは一度に1バッチから正しい変換の検出を試みなければならず、これは常に機能するとは限らない。
したがって非同期サブプロセスでは可能なら文字コード変換と行末変換の両方を判断するコーディングシステム、つまりundecided
やlatin-1
ではなくlatin-1-unix
のようなコーディングシステムを使用すること。
この変数はネットワークストリームに使用するコーディングシステムを指定するalist。これはfile-coding-system-alist
と同じように機能するが、要素内のpatternがポート番号、または正規表現かもしれない点が異なる。正規表現ならそのネットワークストリームのオープンに使用されたネットワークサービス名にたいしてマッチされる。
この変数は他に何を行うか指定されていない際に、サブプロセス(とネットワークストリーム)への入出力に使用するコーディングシステムを指定する。
値は(input-coding
.
output-coding)
という形式のコンスセルであること。ここでinput-codingはサブプロセスからの入力、output-codingはサブプロセスへの出力に適用される。
この変数はファイルのデコードされていないコンテンツにもとづいて、ファイルにたいするコーディングシステムの判断を試みる関数のリストを保持する。
このリスト内の各関数はカレントバッファー内のテキストを調べるように、ただしいかなる方法にせよそれを変更しないよう記述されるべきである。そのバッファーはファイルの一部であるデコードされていないUnicodeテキストを含むだろう。各関数はポイントを始点に何文字を調べる可を告げる唯一の引数sizeをとること。そのファイルにたいするコーディングシステムの決定に関数が成功したら、そのコーディングシステムをリターンすること。それ以外はnil
をリターンするべきである。関数は変数auto-coding-file-name
を調べることによっても、バッファーのコンテンツがどのファイルのものなのか知ることができる。
このリスト内の関数はファイルがvisitされる際にEmacsがファイルのコンテンツのデコードをしようとする場合、および/またはそのファイルのバッファーを保存しようとする際にEmacsがファイルのコンテンツのエンコード方法を決定しようと場合に呼び出されるかもしれない。
ファイルに‘coding:’タグがある場合にはそれが優先されるので、これらの関数が呼び出されることはないだろう。
この関数はfilenameに適するコーディングシステムの判定を試みる。これは上記で説明した変数により指定されたルールのいずれかにマッチするまで、それらの変数を順に使用してファイルをvisitするバッファーを調べる。そして(coding
.
source)
という形式のコンスセルをリターンする。ここでcodingは使用するコーディングシステム、sourceはauto-coding-alist
、auto-coding-regexp-alist
、:coding
、auto-coding-functions
のいずれかであるようなシンボルであり、マッチングルールとして提供されるルールを示す。値:coding
はファイル内のcoding:
タグによりコーディングシステムが指定されたことを意味する(coding tag in The GNU Emacs
Manualを参照)。マッチングルールを調べる順序はauto-coding-alist
、auto-coding-regexp-alist
、coding:
、auto-coding-functions
の順。マッチングルールが見つからなければこの関数はnil
をリターンする。
2つ目の引数sizeはポイントの後のテキストの文字単位のサイズ。この関数はポイントの後のsize文字のテキストだけを調べる。coding:
タグが置かれる箇所としてはファイルの先頭2行が想定される箇所の1つなので、通常はバッファーの先頭位置でこの関数を呼び出すこと。その場合にはsizeはそのバッファーのサイズであること。
この関数はファイルfilenameに適するコーディングシステムをリターンする。これはコーディングシステムを探すためにfind-auto-coding
を使用する。コーディングシステムを決定できなかったら、この関数はnil
をリターンする。引数sizeの意味はfind-auto-coding
と同様。
この関数はoperationをargumentsで行う際に、(デフォルトで)使用するコーディングシステムをリターンする。値は以下の形式:
(decoding-system . encoding-system)
1つ目の要素decoding-systemはデコード(operationがデコードを行う場合)、encoding-systemはエンコード(operationがエンコードを行う場合)に使用するコーディングシステム。
引数operationはシンボルでwrite-region
、start-process
、call-process
、call-process-region
、insert-file-contents
、open-network-stream
のいずれかであること。これらは文字コード変換と行末変換を行うことができるEmacsのI/Oプリミティブの名前である。
残りの引数は対応するI/Oプリミティブに与えられる引数と同じであること。そのプリミティブに応じてこれらの引数のうち1つがターゲットとして選択される。たとえばoperationがファイルI/Oならファイル名を指定する引数がターゲット。サブプロセス用のプリミティブではプロセス名がターゲット。open-network-stream
ではサービス名またはポート番号がターゲット。
operationに応じてこの関数はfile-coding-system-alist
、process-coding-system-alist
、network-coding-system-alist
の中からターゲットを探す。このalist内でターゲットが見つかったらfind-operation-coding-system
はalist内のassociation(連想:
キーと連想値からなるコンスセル)、それ以外はnil
をリターンする。
operationがinsert-file-contents
ならターゲットに対応する引数は(filename
.
buffer)
という形式のコンスセルだろう。この場合にはfilenameはfile-coding-system-alist
内で照合されるファイル名であり、bufferはそのファイルの(デコードされていない)コンテンツを含むバッファー。file-coding-system-alist
がこのファイルにたいして呼び出す関数を指定していて、かつ(通常行われるように)ファイルのコンテンツを調べる必要があるならファイルを読み込むかわりにbufferのコンテンツを調べること。