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

34.10.5 デフォルトのコーディング体系

本節では、特定のファイルや特定のサブルーチンの実行時にデフォルトのコーディングシステムを指定する変数と、I/O操作がそれらにアクセスする際に使用する関数について説明します。

これらの変数の考え方は、一度で希望するデフォルト値に設定し、その後は変更しないというものです。Lispプログラムの特定の操作に対して特定のコーディングシステムを指定する場合、これらの変数は変更せず、代わりに coding-system-for-read と coding-system-for-write を用いて上書きしてください(単一の操作に対するコーディングシステムの指定を参照)。

ユーザーオプション: auto-coding-regexp-alist

この変数は、テキストパターンとそれに対応するコーディングシステムのalistです。各要素は (regexp . coding-system) という形式をしており、先頭の数キロバイトが regexp に一致するファイルは、その内容をバッファに読み込む際に coding-system でデコードされます。このalistの設定は、ファイル内の coding: タグや file-coding-system-alist の内容(後述)よりも優先されます。デフォルト値は、Emacs が Babyl 形式のメールファイルを自動的に認識し、コード変換なしで読み込むように設定されています。

ユーザーオプション: file-coding-system-alist

この変数は、特定のファイルの読み書きに使用するコーディングシステムを指定するalistです。各要素は (pattern . coding) という形式をしており、ここで pattern は特定のファイル名にマッチする正規表現です。その要素は、pattern にマッチするファイル名に適用されます。

要素のCDRであるcodingは、コーディングシステム、2つのコーディングシステムを含むコンスセル、または関数名(関数定義を持つシンボル)のいずれかである必要があります。codingがコーディングシステムである場合、そのコーディングシステムがファイルの読み込みと書き込みの両方に使用されます。codingが2つのコーディングシステムを含むコンスセルである場合、そのCARがデコード用のコーディングシステムを、CDRがエンコード用のコーディングシステムを指定します。

coding が関数名である場合、その関数は find-operation-coding-system に渡されたすべての引数のリストを1つの引数として受け取る必要があります。また、コーディングシステム、または2つのコーディングシステムを含むコンスセルを返す必要があります。この値は、上述と同じ意味を持ちます。

coding(または上記の関数が返す値)がundecidedの場合、通常のコード検出が行われます。

ユーザーオプション: auto-coding-alist

この変数は、特定のファイルの読み書きに使用するコーディングシステムを指定するalistです。その形式はfile-coding-system-alistと同様ですが、後者とは異なり、この変数はファイル内のあらゆるcoding:タグよりも優先されます。

変数: process-coding-system-alist

この変数は、サブプロセスでどのプログラムが動作しているかに応じて、どのコーディングシステムを使用するかを指定するalistです。file-coding-system-alistと同様に動作しますが、patternはサブプロセスの起動に使用されたプログラム名と照合されます。このalistで指定されたコーディングシステム(または複数のシステム)は、サブプロセスのI/Oに使用されるコーディングシステムの初期化に用いられますが、後からset-process-coding-systemを使用して別のコーディングシステムを指定することも可能です。

警告: undecided のように、データからコーディングシステムを決定する方式は、非同期のサブプロセス出力において完全には安定して動作しません。これは、Emacs が非同期のサブプロセス出力を、到着次第バッチ単位で処理するためです。コーディングシステムが文字コード変換を指定していない場合や、行末変換を指定していない場合、Emacs はバッチごとに適切な変換を検出しようとしますが、これが常に機能するとは限りません。

したがって、非同期サブプロセスでは、可能な限り、文字コード変換と改行変換の両方を規定するコーディング体系――すなわち、undecidedやlatin-1ではなく、latin-1-unixのようなもの――を使用してください。

変数: network-coding-system-alist

この変数は、ネットワークストリームで使用するコーディングシステムを指定するalistです。動作はfile-coding-system-alistとほぼ同様ですが、要素内のpatternがポート番号または正規表現のいずれかになり得る点が異なります。正規表現の場合は、ネットワークストリームを開く際に使用したネットワークサービス名と照合されます。

変数: default-process-coding-system

この変数は、他に指定がない場合に、サブプロセス(およびネットワークストリーム)の入出力に使用するコーディングシステムを指定します。

値は (input-coding . output-coding) 形式のコンスセルである必要があります。ここで、input-coding はサブプロセスからの入力に、output-coding は同プロセスへの出力にそれぞれ対応します。

ユーザーオプション: auto-coding-functions

この変数には、デコード前の内容に基づいてファイルの符号化方式を判定しようとする関数のリストが格納されています。

このリストにある各関数は、現在のバッファ内のテキストを参照するように記述されるべきですが、いかなる方法でもそれを変更してはなりません。バッファにはファイルの一部のテキストが含まれます。各関数は、ポイントを起点として何文字分を参照するかを指定する1つの引数 size を受け取る必要があります。関数がファイルの符号化方式の特定に成功した場合は、その符号化方式を返す必要があります。そうでない場合は、nil を返す必要があります。また、各関数は変数 auto-coding-file-name から、バッファの内容が属するファイル名を取得することもできます。

このリストにある関数は、ファイルにアクセスした際にEmacsがその内容をデコードしようとする場合、および/または、ファイルのバッファが保存されようとした際にEmacsがその内容をどのようにエンコードするかを決定しようとする場合の、いずれにおいても呼び出されます。

ファイルに ‘coding:’ タグがある場合はそれが優先されるため、これらの関数は呼び出されません。

関数: find-auto-coding filename size

この関数は、filename に適したコーディングシステムを特定しようとします。指定されたファイルを参照しているバッファを、前述の変数を順に用いて調べ、これらの変数で指定されたルールのいずれかに一致するものが見つかるまで探索を続けます。その後、(coding . source) 形式のコンスセルを返します。ここで coding は使用するコーディングシステムであり、source は auto-coding-alist、auto-coding-regexp-alist、:coding、auto-coding-functions のいずれかのシンボルで、どのルールが一致したかを示します。値 :coding は、コーディングシステムがファイル内の coding: タグで指定されたことを意味します(The GNU Emacs Manual の コーディングタグ を参照してください)。一致するルールを探す順序は、まず auto-coding-alist、次に auto-coding-regexp-alist、続いて coding: タグ、最後に auto-coding-functions となります。一致するルールが見つからなかった場合、この関数は nil を返します。

第2引数 size は、ポイント以降のテキストサイズ(文字数)です。関数は、ポイントから size 文字以内のテキストのみを対象とします。通常、この関数を呼び出す際は、バッファが先頭に配置されている必要があります。というのも、coding: タグの配置場所の一つがファイルの最初の1〜2行であるためです。その場合、size はバッファのサイズである必要があります。

関数: set-auto-coding filename size

この関数は、ファイル filename に適した符号化方式を返します。符号化方式の特定には find-auto-coding を使用します。符号化方式が特定できなかった場合、関数は nil を返します。引数 size の意味は find-auto-coding と同様です。

関数: find-operation-coding-system operation &rest arguments

この関数は、arguments を用いて operation を実行する際に(デフォルトで)使用するコーディングシステムを返します。値は以下の形式となります:

(decoding-system . encoding-system)

最初の要素 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プリミティブに渡される可能性のある引数と同じである必要があります。プリミティブに応じて、これらの引数のうちいずれか一つがターゲットとして選択されます。例えば、operationがファイルI/Oを行う場合、ファイル名を指定する引数がターゲットとなります。サブプロセスプリミティブの場合、プロセス名がターゲットとなります。open-network-streamの場合、ターゲットはサービス名またはポート番号となります。

operation に応じて、この関数は file-coding-system-alist、process-coding-system-alist、または network-coding-system-alist の中から対象を検索します。対象がアリストに見つかった場合、find-operation-coding-system はそのアリストにおける関連付けを返し、見つからなかった場合は nil を返します。

operation が insert-file-contents である場合、ターゲットに対応する引数は (filename . buffer) という形式のコンスセルである可能性があります。その場合、filename は file-coding-system-alist 内で検索するファイル名であり、buffer はファイルの内容(まだデコードされていない)を含むバッファです。file-coding-system-alist がこのファイルに対して呼び出す関数を指定しており、その関数が(通常そうであるように)ファイルの内容を調べる必要がある場合は、ファイルを読み込むのではなく buffer の内容を調べるべきです。