26.13.2 ラウンドトリップ仕様

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

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つである。そうでないとおそらく再度変換が呼び出される。さらにfrom-fnはデコードされるバッファーやバッファーではないこと。さもなければフォーマット用の内部バッファーが上書きされるかもしれない。

to-fn

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

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

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

  • そのバッファー内でインプレースで編集を行う。to-fnはこの場合は変更にしたがいテキスト範囲のend位置をリターンすること。
  • 注釈(annotation)のリストをリターンする。これは(position . string)という形式の要素をもつリストで、positionは書き込まれるテキスト内での相対位置を指定する整数、stringはそこに追加される注釈である。このリストはto-fnがそれをリターンする際には、位置順でソートされていなければならない。

    write-regionが実際にバッファーからファイルにテキストを書き込む際には、指定された注釈を対応する位置に混合する。これはすべてバッファーを変更せずに行われる。

from-fnはデコードされるバッファーやバッファーではないこと。さもなければフォーマット用の内部バッファーが上書きされるかもしれない。

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と同様、ファイルのどの部分を読み込むかを指定する(ファイルからの読み込みを参照)。

リターン値は絶対ファイル名のリスト、および挿入されたデータの長さ(変換後)であり、これは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(デフォルト)なら自動保存は当バッファーの通常の保存時と同じフォーマットを使用する。この変数はすべてのバッファーにおいて常にバッファーローカル。


This page has generated for branch:work/emacs-30_69b16e5c63840479270d32f58daea923fe725b90, commit:5e3f74b56ff47b5bcef2526c70f53f749bbd45f6 to check Japanese translation.