次: , 前: MS-DOS File Names, 上: MS-DOS


C.4 テキストファイルとバイナリファイル

GNU Emacsでは、テキスト行の区切りとして改行文字を使います。 これは、GNU Emacsが開発されたUNIXでの習慣であり、 UNIXをモデルとしたGNUシステムでの習慣でもあります。

MS-DOSとMS-Windowsでは、テキスト行の区切りとして、 通常、復帰・行送りの2文字列を使います。 (行送りは改行と同じ文字です。) したがって、Emacs において典型的なファイルを便利に編集するには、 これらの行末(end-of-line、EOL)文字列を変換する必要があります。 Emacsは通常つぎのようにします。 ファイルを読み込むときには復帰・行送りを改行に変換し、 ファイルを書き出すときには改行を復帰・行送りに変換します。 国際文字コードの変換を扱う機構でもこの変換を行います (see Coding Systems)。

ほとんどのファイルにおけるこの特別な書式変換のために、 Emacsが報告する文字位置(see Position Info)は、 オペレーティングシステム上でのファイルサイズ情報と食い違います。

内容がテキストではないある種のファイルは、変換すべきではありません。 したがって、MS-DOS用Emacsは、 ある種のファイルをバイナリファイルとして区別して、 そのまま読み書きします。 (この区別はMS-DOSのものではなく、Emacsがもたらすものです。) これらには、実行プログラム、圧縮したアーカイブなどが含まれます。 Emacsはファイル名を用いて、バイナリファイルとして扱うべきかどうか決定します。 変数file-name-buffer-file-type-alistには、 バイナリファイルを表すファイル名のパターンを定義しておきます。 file-name-buffer-file-type-alistに指定したバイナリファイルの パターンにファイル名が一致すると、 Emacsは行末変換だけでなくすべての符号変換を抑制する コーディングシステム(see Coding Systemsno-conversionを使います。

さらに、Emacsは、ファイルの内容から行区切りとして 復帰・行送りでなく改行を用いていると判断すると、 ファイルの読み書きにおいて変換を行いません。 したがって、特に努力しなくても、 UNIXやGNUシステムからのファイルをMS-DOS上で読んだり編集でき、 それらのファイルの行末はUNIX流の行末のままです。

コマンドfind-file-textやコマンドfind-file-binaryを用いると、 ファイルをテキストとして扱うか バイナリとして扱うかを指定して訪れることができます。 行末変換はコーディングシステムの一般的な変換機構の一部なので、 コーディングシステムを指定するコマンド(see Specify Coding)によって ファイルをテキストとして扱うかバイナリとして扱うかを指定することもできます。 たとえば、C-x <RET> c undecided-unix <RET> C-x C-f foobar.txt とすれば、行末変換をせずにファイルfoobar.txtを訪れることができます。

モード行にはカレントバッファで行末変換を行ったかどうか表示されます。 モード行の始めのほうにあるコーディングシステムを表す文字のうしろには、 通常、コロンが表示されます。 バッファでMS-DOSの行末変換を使っている場合には、 この文字はバックスラッシュに変わります。

NFSやSambaを用いてUNIXやGNUシステムを使った コンピュータ上のファイルシステムを参照するとき、 これらのファイルシステム上のどのファイルに対しては、 新規作成時でなくても、Emacsは行末変換を行うべきではありません。 こうするためには、 該当するファイルシステムを無変換の ファイルシステムと指定するために、 関数add-untranslated-filesystemを呼びます。 この関数は、ファイルシステム名である引数を1つとりますが、 これにはドライブ名やディレクトリ名を含めることもできます。 たとえば、

     (add-untranslated-filesystem "Z:")

は、ドライブZを無変換のファイルシステムとして指定しますし、

     (add-untranslated-filesystem "Z:\\foo")

は、ドライブZ上のディレクトリ\fooを 無変換のファイルシステムとして指定します。

個人の_emacsファイルや サイトの全ユーザーに便利なようにsite-start.elの中で、 add-untranslated-filesystemを使うことが多いでしょう。

add-untranslated-filesystemの効果を取り消すには、 関数remote-untranslated-filesystemを使います。 この関数は、まえにadd-untranslated-filesystemに使ったのと 同じ文字列を引数としてとります。