ファイルの内容をバッファにコピーするには、関数 insert-file-contents
を使用します。 (Lispプログラムではコマンド insert-file
はマークを設定するため、使用しないでください。)
この関数は、ファイル filename の内容をポイント以降のカレントバッファに挿入します。絶対ファイル名と挿入されたデータの長さのリストを返します。filename が読み取り可能なファイルを指定していない場合、またはディレクトリを指定している場合は、エラーが通知されます。
この関数は、ファイルの内容を定義済みのファイル形式と照合し、適切であればファイル内容を変換するとともに、リスト after-insert-file-functions 内の関数を呼び出します。ファイル形式の変換 を参照してください。通常、after-insert-file-functions
リスト内の関数のいずれかが、行末変換を含むファイル内容のデコードに使用される符号化方式(符号化方式
を参照)を決定します。ただし、ファイルにヌルバイトが含まれている場合、デフォルトでは符号化変換を行わずに処理されます。inhibit-null-byte-detection
を参照してください。
visit が nil
でない場合、この関数はさらにバッファを未変更としてマークし、バッファ内の各種フィールドを設定してファイル filename を訪問するようにします。これには、バッファの訪問済みファイル名や直近の保存ファイルの
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) アンドゥリストに記録されるデータ量が少なくなるためです。
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 を使用してください。特定のファイル名を「マジック」にする を参照してください。