Next: , Previous: , Up: ファイル   [Contents][Index]


26.3 ファイルからの読み込み

ファイルのコンテンツをバッファーにコピーするためには関数insert-file-contentsを使用します(マークをセットするのでLispプログラム内でコマンドinsert-fileは使用してはならない)。

Function: insert-file-contents filename &optional visit beg end replace

この関数はファイルfilenameのコンテンツをカレントバッファーのポイントの後に挿入する。これは絶対ファイル名と挿入だれたデータの長さからなるリストをリターンする。filenameが読み取り可能なファイルの名前でなければエラーがシグナルされる。

この関数は定義されたファイルフォーマットに照らしてファイルのコンテンツをチェックして、適切ならそのコンテンツの変換、およびリストafter-insert-file-functions内の関数の呼び出しも行う。ファイルのフォーマット変換を参照のこと。通常はリストafter-insert-file-functions内のいずれかの関数がEOL変換を含むファイルコンテンツのデコードに使用されるコーディングシステム(コーディングシステムを参照)を判断する。しかしファイルにnullバイトが含まれる場合には、デフォルトではコード変換なしでvisitされる。inhibit-null-byte-detectionを参照のこと。

visitが非nilなら、この関数は追加でそのバッファーを未変更とマークしてそのバッファーのさまざまなフィールドをセットアップして、バッファーがファイルfilenameをvisitしているようにする。これらのフィールドにはバッファーがvisitしたファイルの名前、最終保存したファイルのmodtimeが含まれる。これらの機能はfind-file-noselectにより使用されるものであり、恐らくあなた自身が使用するべきではない。

begendが非nilなら、それらはファイル挿入範囲を指定するバイトオフセット数値であること。この場合、visitnilでなければならない。たとえば、

(insert-file-contents filename nil 0 500)

これはファイルの先頭500文字(バイト)でコードされた文字を挿入する。

begendが偶然マルチバイトシーケンス文字の中間だった場合には、Emacsお文字コード規約によりバッファーに1つ以上の8ビット文字(いわゆる“rawバイト”)が挿入されるだろう(文字セットを参照)。この方法でバッファーの一部にたいして読み取りを行いたければ、この関数の呼び出し前後に適切な値をcoding-system-for-readにバインドして(単一の操作にたいするコーディングシステムの指定を参照)、境界にあるrawバイトをチェックするとともに、これらのバイトシーケンス全体を読み取り有効な文字に変換して戻すLisp関数を記述することをお勧めする。

引数replaceが非nilなら、それはバッファーのコンテンツ(実際にはアクセス可能な範囲)をファイルのコンテンツで置き換えることを意味する。これは単にバッファーのコンテンツを削除してファイル全体を挿入するより優れている。なぜなら、(1)マーカー位置を維持して、(2)undoリストに配置するデータも少ないからである。

replacevisitbegnilならinsert-file-contentsで(FIFOやI/Oデバイスのような)スペシャルファイルの読み取りが可能。とはいえバッファーに(潜在的には)無制限のデータが挿入されることを防ぐために(たとえば/dev/urandomからのデータ挿入時)、これらのファイルにたいしては通常はend引数を使用するべきだろう。

Function: insert-file-contents-literally filename &optional visit beg end replace

この関数はinsert-file-contentsのように機能するが、ファイル内の各バイトを必要なら8ビット文字へ変換するために個別に処理する点が異なる。またafter-insert-file-functionsを実行せずフォーマットのデコード、文字コード変換、自動解凍、...などを行わない。

他のプログラムがファイルを読めるように他プロセスにファイル名を渡したければ関数file-local-copyを使用します。特定のファイル名の“Magic”の作成を参照してください。