Next: , Previous: , Up: Format Conversion   [Contents][Index]


24.12.2 Round-Trip Specification

読み取りと書き込みのもっとも一般的な機能は、変数format-alistで制御されます。これはファイルフォーマット(file format)仕様のリストで、Emacsバッファー内のデータにたいして、ファイル内で使用されるテキスト表現を記述します。読み取りと書き込みの仕様記述はペアーになっており、わたしたちがそれを“ラウンドトリップ(round-trip)”仕様と呼ぶのは、これが理由です(非ペアー仕様については、see Format Conversion Piecemealを参照)。

Variable: format-alist

このリストには、定義されるファイルフォーマットごとに、1つのフォーマット定義が含まれる。フォーマット定義はそれぞれ、以下の形式のリストである:

(name doc-string regexp from-fn to-fn modify mode-fn preserve)

以下は、フォーマット定義内で要素がもつ意味である:

name

フォーマットの名前。

doc-string

フォーマットのドキュメント文字列。

regexp

このフォーマットで表現されるファイルの認識に使用される正規表現。nilの場合、フォーマットが自動的に適用されることは決してない。

from-fn

このフォーマットのデータをデコードする、(ファイルデータを通常のEmacsデータ表現に変換するための)シェルコマンド、または関数。

シェルコマンドは文字列として表され、Emacsはそのコマンドを、変換処理のためのフィルターとして実行する。

from-fnが関数の場合、それは変換するべきバッファー部分を指定する2つの引数、beginendで呼び出される。これは、インプレースでテキストを編集することにより変換を行うべきである。これはテキスト長を変更する可能性があるので、from-fnは変更されたend位置をリターンすること。

ファイルの先頭が、この変換によりregexpにマッチしないようにするのは、from-fnの役目の1つである。そうでないと、おそらく再度変換が呼び出される。

to-fn

このフォーマットのデータをエンコード、すなわち通常のEmacsデータ表現をこのフォーマットに変換するためのシェルコマンド、または関数。

to-fnが文字列の場合、それはシェルコマンドである。Emacsは変換処理のためのフィルターとして、このコマンドを実行する。

to-fnが関数の場合、それは3つの引数で呼び出される。beginendは変換されるべきバッファー部分、bufferでそれがどのバッファーかを指定する。変換を行うには、2つの方法がある:

modify

フラグ。エンコード関数がバッファーを変更する場合はt、注釈リストをリターンすることにより機能する場合はnil

mode-fn

このフォーマットから変換されたファイルをvisit後に呼び出される、マイナーモード関数。この関数は1つの引数で呼び出され、それが整数1の場合、マイナーモード関数はそのモードを有効にする。

preserve

フラグ。format-write-filebuffer-file-formatからこのフォーマットを取り除くべきでない場合はt

関数insert-file-contentsは、指定されたファイルを読み込む際にファイルフォーマットを自動的に認識します。これは、フォーマット定義の正規表現にたいしてファイルの先頭テキストをチェックして、マッチが見つかった場合は、そのフォーマットにたいするデコード関数を呼び出します。その後は再度、既知のフォーマットすべてをチェックします。適用できるフォーマットがない間は、チェックを続行します。

find-file-noselect、またはそれを使用するコマンドでファイルをvisitすることにより、同じように変換が行われます(内部でinsert-file-contentsを呼び出すため)。さらに、それをデコードする各フォーマットのモード関数も呼び出します。これは、バッファーローカル変数buffer-file-format内に、フォーマット名のリストを格納します。

Variable: buffer-file-format

この変数は、visitしているファイルのフォーマットを表す。より正確には、これはカレントバッファーのファイルをvisitに起因するデコードのファイルフォーマット名のリストである。これは、すべてのバッファーにたいして、常にローカルである。

write-regionがデータをファイルに書き込む際には、まずbuffer-file-formatにリストされたフォーマットにたいするエンコード関数を、リスト内での出現順に呼び出します。

Command: format-write-file file format &optional confirm

このコマンドは、カレントバッファーのコンテンツを、フォーマット名のリストformatにもとづいたフォーマットで、ファイルfileに書き込む。これはformatを起点に、buffer-file-formatの値からpreserveフラグ(上記参照)が非nilの要素にたいして、それがまだformat内に存在しない場合は、任意の個数それらを追加する。その後、将来の保存においてデフォルトとなるよう、このフォーマットでbuffer-file-formatを更新する。format引数を除き、このコマンドはwrite-fileと似ている。特に、confirmwrite-fileでの対応する引数と、意味およびinteractiveでの扱いが同じである。Definition of write-fileを参照のこと。

Command: format-find-file file format

このコマンドは、ファイルfileを探して、それをフォーマットformatにしたがって変換する。これは、後でそのバッファーを保存する場合に、formatをデフォルトにすることも行う。

引数formatは、フォーマット名のリストである。formatnilの場合、何の変換も行われない。interactiveに呼び出した場合は、formatにたいして単にRETをタイプすると、nilが指定される。

Command: format-insert-file file format &optional beg end

このコマンドは、ファイルfileのコンテンツを、フォーマットformatにしたがって変換して挿入する。begendが非nilの場合、それはinsert-file-contentsと同様、ファイルのどの部分を読み込むかを指定する(Reading from Filesを参照)。

リターン値は、絶対ファイル名のリスト、および挿入されたデータの長さ(変換後)であり、これはinsert-file-contentsがリターンするものと同様である。

引数formatは、フォーマット名のリストである。formatnilの場合、何の変換も行われない。interactiveに呼び出した場合は、formatにたいして単にRETをタイプすると、nilが指定される。

Variable: buffer-auto-save-file-format

この変数は、自動保存(auto-saving)にたいして使用するフォーマットを指定する。値はbuffer-file-formatと同様、ファイル名のリストであるが、これはauto-saveファイルへの書き込みで、buffer-file-formatのかわりに使用される。値がt(デフォルト)の場合、自動保存は当バッファーの通常の保存時と同じフォーマットを使用する。この変数は、すべてのバッファーにおいて、常にバッファーローカルである。