ファイルのコンテンツをバッファーにコピーするためには関数insert-file-contents
を使用します(マークをセットするのでLispプログラム内でコマンドinsert-file
は使用してはならない)。
この関数はファイル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
により使用されるものであり、恐らくあなた自身が使用するべきではない。
begとendが非nil
なら、それらはファイル挿入範囲を指定するバイトオフセット数値であること。この場合、visitはnil
でなければならない。たとえば、
(insert-file-contents filename nil 0 500)
これはファイルの先頭500文字(バイト)でコードされた文字を挿入する。
begかendが偶然マルチバイトシーケンス文字の中間だった場合には、Emacsお文字コード規約によりバッファーに1つ以上の8ビット文字(いわゆる“rawバイト”)が挿入されるだろう(文字セットを参照)。この方法でバッファーの一部にたいして読み取りを行いたければ、この関数の呼び出し前後に適切な値をcoding-system-for-read
にバインドして(単一の操作にたいするコーディングシステムの指定を参照)、境界にあるrawバイトをチェックするとともに、これらのバイトシーケンス全体を読み取り有効な文字に変換して戻すLisp関数を記述することをお勧めする。
引数replaceが非nil
なら、それはバッファーのコンテンツ(実際にはアクセス可能な範囲)をファイルのコンテンツで置き換えることを意味する。これは単にバッファーのコンテンツを削除してファイル全体を挿入するより優れている。なぜなら、(1)マーカー位置を維持して、(2)undoリストに配置するデータも少ないからである。
replace、nil
、if-regular
、visit、begがnil
ならinsert-file-contents
で(FIFOやI/Oデバイスのような)スペシャルファイルの読み取りが可能。とはいえバッファーに(潜在的には)無制限のデータが挿入されることを防ぐために(たとえば/dev/urandomからのデータ挿入時)、これらのファイルにたいしては通常はend引数を使用するべきだろう。
この関数はinsert-file-contents
のように機能するが、ファイル内の各バイトを必要なら8ビット文字へ変換するために個別に処理する点が異なる。またafter-insert-file-functions
を実行せずフォーマットのデコード、文字コード変換、自動解凍、...などを行わない。
他のプログラムがファイルを読めるように他プロセスにファイル名を渡したければ関数file-local-copy
を使用します。特定のファイル名の“Magic”の作成を参照してください。