Next: Format Conversion Piecemeal, Previous: Format Conversion Overview, Up: Format Conversion [Contents][Index]
読み取りと書き込みのもっとも一般的な機能は、変数format-alist
で制御されます。これはファイルフォーマット(file
format)仕様のリストで、Emacsバッファー内のデータにたいして、ファイル内で使用されるテキスト表現を記述します。読み取りと書き込みの仕様記述はペアーになっており、わたしたちがそれを“ラウンドトリップ(round-trip)”仕様と呼ぶのは、これが理由です(非ペアー仕様については、see Format Conversion Piecemealを参照)。
このリストには、定義されるファイルフォーマットごとに、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つである。そうでないと、おそらく再度変換が呼び出される。
このフォーマットのデータをエンコード、すなわち通常のEmacsデータ表現をこのフォーマットに変換するためのシェルコマンド、または関数。
to-fnが文字列の場合、それはシェルコマンドである。Emacsは変換処理のためのフィルターとして、このコマンドを実行する。
to-fnが関数の場合、それは3つの引数で呼び出される。beginとendは変換されるべきバッファー部分、bufferでそれがどのバッファーかを指定する。変換を行うには、2つの方法がある:
(position
.
string)
という形式の要素をもつリストで、positionは書き込まれるテキスト内での相対位置を指定する整数、stringはそこに追加される注釈である。このリストは、to-fnがそれをリターンする際、位置順でソートされていなければならない。
write-region
が実際にバッファーからファイルにテキストを書き込む際には、指定された注釈を対応する位置に混合する。これはすべて、バッファーを変更せずに行われる。
フラグ。エンコード関数がバッファーを変更する場合は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
と同様、ファイルのどの部分を読み込むかを指定する(Reading from Filesを参照)。
リターン値は、絶対ファイル名のリスト、および挿入されたデータの長さ(変換後)であり、これはinsert-file-contents
がリターンするものと同様である。
引数formatは、フォーマット名のリストである。formatがnil
の場合、何の変換も行われない。interactiveに呼び出した場合は、formatにたいして単にRETをタイプすると、nil
が指定される。
この変数は、自動保存(auto-saving)にたいして使用するフォーマットを指定する。値はbuffer-file-format
と同様、ファイル名のリストであるが、これはauto-saveファイルへの書き込みで、buffer-file-format
のかわりに使用される。値がt
(デフォルト)の場合、自動保存は当バッファーの通常の保存時と同じフォーマットを使用する。この変数は、すべてのバッファーにおいて、常にバッファーローカルである。