読み取りと書き込みのもっとも一般的な機能は変数format-alist
で制御されます。これはファイルフォーマット(file
format)仕様のリストで、Emacsバッファー内のデータにたいしてファイル内で使用されるテキスト表現を記述します。読み取りと書き込みの仕様記述はペアーになっており、わたしたちがそれを“ラウンドトリップ(round-trip)”仕様と呼ぶのはこれが理由です(非ペアー仕様については漸次仕様を参照)。
このリストには定義されるファイルフォーマットごとに1つのフォーマット定義が含まれる。フォーマット定義はそれぞれ以下の形式のリスト:
(name doc-string regexp from-fn to-fn modify mode-fn preserve)
以下はフォーマット定義内で要素がもつ意味:
フォーマットの名前。
フォーマットのドキュメント文字列。
このフォーマットで表現されるファイルの認識に使用される正規表現。nil
ならフォーマットが自動的に適用されることは決してない。
このフォーマットのデータをデコードする、(ファイルデータを通常のEmacsデータ表現に変換するための)シェルコマンドか関数。
シェルコマンドは文字列として表され、Emacsはそのコマンドを変換処理用のフィルターとして実行する。
from-fnが関数なら、それは変換するべきバッファー部分を指定する2つの引数beginとendで呼び出される。これはインプレースでテキストを編集することにより変換を行うこと。これはテキスト長を変更する可能性があるのでfrom-fnは変更されたend位置をリターンすること。
ファイルの先頭が変換によりregexpにマッチしないようにするのはfrom-fnの役目の1つである。そうでないとおそらく再度変換が呼び出される。さらにfrom-fnはデコードされるバッファーやバッファーではないこと。さもなければフォーマット用の内部バッファーが上書きされるかもしれない。
このフォーマットのデータをエンコード、すなわち通常のEmacsデータ表現をこのフォーマットに変換するためのシェルコマンドか関数。
to-fnが文字列ならそれはシェルコマンドである。Emacsは変換処理のためのフィルターとしてこのコマンドを実行する。
to-fnが関数なら、それは3つの引数で呼び出される。beginとendは変換されるべきバッファー部分、bufferでそれがどのバッファーかを指定する。変換を行うには2つの方法がある:
(position
.
string)
という形式の要素をもつリストで、positionは書き込まれるテキスト内での相対位置を指定する整数、stringはそこに追加される注釈である。このリストはto-fnがそれをリターンする際には、位置順でソートされていなければならない。
write-region
が実際にバッファーからファイルにテキストを書き込む際には、指定された注釈を対応する位置に混合する。これはすべてバッファーを変更せずに行われる。
from-fnはデコードされるバッファーやバッファーではないこと。さもなければフォーマット用の内部バッファーが上書きされるかもしれない。
フラグ。エンコード関数がバッファーを変更するならt
、注釈リストをリターンすることによって機能するならnil
。
このフォーマットから変換されたファイルをvisit後に呼び出されるマイナーモード関数。この関数は1つの引数で呼び出されて、それが整数1ならマイナーモード関数はそのモードを有効にする。
フラグ。format-write-file
がbuffer-file-format
からこのフォーマットを取り除くべきでなければt
。
関数insert-file-contents
は指定されたファイルを読み込む際にファイルフォーマットを自動的に認識します。これはフォーマット定義の正規表現にたいしてファイルの先頭テキストをチェックして、マッチが見つかったら、そのフォーマットにたいするデコード関数を呼び出します。その後は再度すべての既知のフォーマットをチェックします。適用できるフォーマットがない間はチェックを続行します。
find-file-noselect
やそれを使用するコマンドでファイルをvisitすることにより、同じように変換が行われます(内部でinsert-file-contents
を呼び出すため)。さらにそれをデコードする各フォーマットのモード関数も呼び出します。これはバッファーローカル変数buffer-file-format
内にフォーマット名のリストを格納します。
この変数はvisitしているファイルのフォーマットを表す。より正確にはこれはカレントバッファーのファイルをvisitに起因するデコードのファイルフォーマット名のリストである。これはすべてのバッファーにたいして常にローカル。
write-region
がデータをファイルに書き込む際には、まずbuffer-file-format
にリストされたフォーマットにたいするエンコード関数をリスト内での出現順に呼び出します。
このコマンドはカレントバッファーのコンテンツをフォーマット名のリストformatにもとづいたフォーマットでファイルfileに書き込む。これはformatを起点に、buffer-file-format
の値からpreserveフラグ(上記参照)が非nil
の要素にたいして、それがまだformat内に存在しなければ任意の個数それらを追加する。その後に将来の保存においてデフォルトとなるように、このフォーマットでbuffer-file-format
を更新する。format引数を除けばこのコマンドはwrite-file
と似ている。特にconfirmはwrite-file
での対応する引数と、意味やinteractiveでの扱いが同じである。Definition of write-fileを参照のこと。
このコマンドはファイルfileを探してそれをフォーマットformatにしたがって変換する。これは後でそのバッファーを保存する場合にformatをデフォルトにすることも行う。
引数formatはフォーマット名のリスト。formatがnil
なら何の変換も行われない。interactiveに呼び出した場合には、formatにたいして単にRETをタイプするとnil
が指定される。
このコマンドはファイルfileのコンテンツをフォーマットformatにしたがって変換して挿入する。begとendが非nil
なら、それはinsert-file-contents
と同様、ファイルのどの部分を読み込むかを指定する(ファイルからの読み込みを参照)。
リターン値は絶対ファイル名のリスト、および挿入されたデータの長さ(変換後)であり、これはinsert-file-contents
がリターンするものと同様。
引数formatはフォーマット名のリスト。formatがnil
なら何の変換も行われない。interactiveに呼び出した場合には、formatにたいして単にRETをタイプするとnil
が指定される。
この変数は自動保存(auto-saving)にたいして使用するフォーマットを指定する。値はbuffer-file-format
と同様、ファイル名のリストだが、これはauto-saveファイルへの書き込みでbuffer-file-format
のかわりに使用される。値がt
(デフォルト)なら自動保存は当バッファーの通常の保存時と同じフォーマットを使用する。この変数はすべてのバッファーにおいて常にバッファーローカル。