検索エンジンから来た人に注意

このマニュアルは、Emacs ver. 19.x 向けのマニュアルを Mule 2.x の開発にあたり邦訳したものを、 電脳外道学会がミラーリングしているものであり、旧版製品パラノイアであるところの椅子人の趣味によるものです。

しかしながら、現在の Emacs の主流は ver. 20 以降であり、ver 19.x と ver 20.x とでは、仕様の違いが少なからずあります。

したがって、一般的な Emacs ユーザーにとっては、 このマニュアルと実機の動作とが符合しない場合があります。
特に、公開用の Emacs Lisp コードを書こうとする人は、 新バージョンのマニュアル(英語)を参照することを強くおすすめします。


トップページ&リンク | マニュアルの目次 | 検索
Go to the first, previous, next, last section, table of contents.


ファイル

Emacsでは、ファイルとファイル・ディレクトリに対し、探索する、新規作成する、 ながめる、保存する、などの作業ができます。本章ではEmacs lispのファイル に関係する関数のうちの大部分のものを説明しますが、section バッファで説明して いるのもあります。また、バックアップや自動セーブに関連する関数は、 section バックアップと自動セーブで説明しています。

ファイル関数の多くは、 引数として一つないしはそれ以上の数のファイル名を取ります。 ファイル名とは、実際には文字列のことです。 これらの関数のほとんどは、expand-file-nameを使ってファイル名を 展開します。これにより相対ファイル名(`../'を含む)を取り扱うように、 `~'を正しく取り扱います。これらの関数は`$HOME'などの環境変数の 置換は行ないません。See section ファイル名を展開する関数

ファイルをvisitする

ファイルをvisitするとは、バッファにファイルを読み込むことを意味します。 visitを一度した後は、バッファがそのファイルを visitしている(visiting)といい、 そのファイルを、バッファにより"visitされているファイル"と呼びます。

ファイルとバッファは二つの異なったものです。 ファイルはコンピュータの中に(消さないかぎりは)ずっと記録されている情報です。 一方バッファは、Emacsの内部的な情報であり、Emacsの編集のセッションが 終ったとき(あるいはバッファをkillしたとき)にはなくなってしまうものです。 通常、バッファはあなたがファイルからコピーした情報を持っています。 このとき、そのバッファはファイルをvisitしているといいます。 バッファ中のコピーに対して、あなたは編集のコマンドを使って編集をします。 そのようなバッファに対しての修正は、ファイルには反映されません。 ですから、その変更点をファイルに反映させるには、バッファを保存(save) しなければなりません。それは変更されたバッファの内容を、ファイルにコピー しなおすことを意味します。

ファイルとバッファには以上のような違いがあるのですが、バッファを意味して いるときにファイルのことを言及してみたり、またこの逆の場合があったりとい うことがあります。実際、 "私はバッファを編集していて、すぐに同じ名前をもつファイルとして保存します" という言い方よりはむしろ、"私はファイルを編集しています"という言い方を します。 人は通常この区別を明示的にする必要はありません。しかし、コンピュータ・ プログラム中でファイル、バッファを扱うときは、この区別を念頭に置くとよい でしょう。

ファイルをvisitするための関数

本節では、ファイルをvisitするのに通常使われる関数について説明します。 歴史的な理由により、これらの関数は`visit-'で始まる名前ではなく、 `find-'で始まる名前を持ちます。バッファがvisitしているファイルの名前に アクセスする、あるいは、ファイルの名前から存在するバッファをみつける関数と 変数についてはSee section バッファ・ファイル名

Lispプログラムで、ファイルの中身は見たいが、変更はしたくない場合、 最も手っ取り早い方法は、一時バッファでinsert-file-contentsを 使うことです。ファイルをvisitする必要はなく、visitする方が時間もかかります。 See section ファイルからの読込み

Command: find-file filename
このコマンドは、ファイルfilenameをvisitするバッファを選択します。 これは、そのようなバッファがある場合には、それを使用し、 もしなければ新しいバッファを作り、そのファイルを読み込みます。 またこのコマンドは、そのバッファを返値として返します。

find-fileの本体はとても単純で、以下のようになっています。

(switch-to-buffer (find-file-noselect filename))

(section ウィンドウ内でのバッファの表示switch-to-bufferを参照。)

find-fileが対話的に呼ばれたときは、ミニバッファにおいて filenameの入力を促します。

Function: find-file-noselect filename
この関数は、ファイルをvisitする関数すべてのもととなるものです。 これは、ファイルfilenameをvisitするバッファをみつけるか、あるいは新しく 作成して、そのバッファを返します。 この関数は、そのバッファがすでに存在するものであれば、それを使い、 そうでなければ新しいバッファを作って、そこにファイルを読み込みます。 あなたが望めば、そのバッファをカレント・バッファにできるし、 またウィンドウにそのバッファを表示できますが、この関数自身はそれはしません。

find-file-noselectが、 すでに存在するバッファを使用するときは、まず最初に、そのファイルがその バッファにおいて最後にvisit、あるいは保存されてから、変更がないことを確認 します。変更がある場合には、この関数は、ユーザに対し、その変更前の元の ファイルを読み込み直すかどうかを尋ねます。ユーザが、この質問に`yes' と答えた場合、それまでにそのバッファにしたすべての変更は失われます。

もしfind-file-noselectが、バッファを新規に作成する必要があり、 かつfilenameという名前のファイルが存在しない場合、エコー領域に `New file'というメッセージを表示し、バッファの内容を空のままにします。

find-file-noselect関数は、ファイルを読み込んだ後、 after-find-fileを呼び出します(see section visitのためのサブルーチン)。 この関数は、バッファの主モードを設定し、ローカル変数を構文解析し、 今現在visitしているファイルよりも、新しく自動セーブされた ファイルが存在する場合には警告をユーザに出し、最後に、 find-file-hooksの中の関数を起動します。

find-file-noselect関数は、ファイルfilenameをvisitしている バッファを返値として返します。

(find-file-noselect "/etc/fstab")
     => #<buffer fstab>

Command: find-file-other-window filename
このコマンドはファイルfilenameをvisitするバッファを選択しますが、 現在選択されているウィンドウ以外のウィンドウ内で選択します。 このコマンドは、ほかの存在するウィンドウを使用するかもしれませんし、一つの ウィンドウを分割するかもしれません。section ウィンドウ内でのバッファの表示を参照のこと。

このコマンドが対話的に呼ばれた場合、filenameの入力をユーザに促します。

Command: find-file-read-only filename
このコマンドは、find-fileと同様、ファイルfilenameをvisit するバッファを選択しますが、この関数はバッファを読出し専用とします。 関連する関数および変数は、See section 読みだし専用バッファ

このコマンドが対話的に呼ばれた場合、filenameの入力をユーザに促します。

Command: view-file filename
このコマンドはViewモードでfilenameをvisitし、このコマンドの終了後には、 前に存在したバッファに戻るように、再帰編集の状態でファイルを表示 します。Viewモードはファイルをざっと眺めるためのモードで、 編集はさせません。Viewモードに入ると、正規フックview-mode-hook を起動します。See section フック

view-fileが対話的に呼ばれた場合、filenameの入力をユーザに 促します。

Variable: find-file-hooks
この変数の値は、ファイルがvisitされたあとに呼ばれる関数のリストです。 (もしあるなら)ファイルのローカル変数の仕様は、フックを走らせる前に 処理されます。このフック関数が起動されるとき、ファイルをvisitしている バッファが、カレント・バッファです。

この変数は、正規フックのように動作しますが、しかしこの変数名を変えてしまう のは、おすすめできません。

Variable: find-file-not-found-hooks
この変数の値は、find-fileないしはfind-file-noselectが 存在しないファイルに対して呼ばれたとき、呼び出される関数のリストです。 find-file-noselectは、ファイルが存在しないことを確認すると、 すぐにこれらの関数を呼び出します。この関数は、リストの要素を、 順に非nilを返す関数があるまで呼ばれます。buffer-file-nameは、 すでに設定されています。

関数の返値が使用され、その関数すべてが呼び出されないかもしれないので、 これは正規フックではありません。

visitのためのサブルーチン

find-file-noselect関数は、create-file-bufferafter-find-file関数をサブルーチンとして使います。 それらを直接的に呼び出すことは、時には便利な場合もあります。

Function: create-file-buffer filename
この関数は、filenameをvisitするために、適切に名づけられたバッファを 作成し、そのバッファを返値として返します。 この関数は、前にバッファ名として使われたものでないなら、 (ディレクトリ部分なしで)filenameをそのままバッファの名前として 使用します。 そうでなければ、`<2>'のような文字列をくっつけて、前に使用されていない 名前を作り出します。section バッファの生成も参照のこと。

注意: create-file-bufferは、ファイルとその作成された新しいバッファを 関係づけるものではありません。またバッファの選択も行ないません。 またこの関数は、デフォルトの主モードを使いません。

(create-file-buffer "foo")
     => #<buffer foo>
(create-file-buffer "foo")
     => #<buffer foo<2>>
(create-file-buffer "foo")
     => #<buffer foo<3>>

この関数は、find-file-noselectによって使われます。 この関数は、generate-new-bufferを使います。 (see section バッファの生成)

Function: after-find-file &optional error warn
この関数は、バッファの主モードを設定し、ローカル変数を構文解析します (see section 主モードの自動選択の仕組み)。この関数は、find-file-noselectと、 デフォルトの復帰の関数より呼ばれます(see section 復帰)。

ファイル読み込み時に、ファイルは存在しないが、ディレクトリは存在して エラーを引き起こした場合には、呼び出し側はerrorに非nil値 をわたすべきです。この場合、after-find-fileは、警告のメッセージを 出します。`(New File)'。より深刻なエラーの場合には、呼び出し側は、 after-find-fileを呼び出すべきではありません。

warnが非nilの場合、この関数は、自動セーブ・ファイルが存在し、 それがvisitされるファイルより新しく作成されたものならば、警告の メッセージを出します。

最後に、after-find-fileは、find-file-hooks中のすべての関数を 呼び出します。

バッファを保存する

あなたがEmacsでファイルを編集しているときは、実際は、そのファイルをvisit しているバッファに対して作業を行っています。すなわち、そのファイルの中味が バッファにコピーされ、そのコピーに対して編集作業をしているのです。 そのバッファの内容に対する変更は、あなたがバッファを保存(save)するまで 実際のファイルに反映されません。この保存というのは、バッファの内容を ファイルに対してコピーするということです。

Command: save-buffer &optional backup-option
この関数は、カレント・バッファの内容が、最後にvisitあるいは保存されてから 修正されている場合に、そのバッファの内容をvisitされているファイルに 保存します。そうでない場合はなにもしません。

save-bufferは、バックアップ・ファイルの作成に関して責任を持ちます。 通常、backup-optionnilであり、ファイルをvisitしてから 最初に保存するときのみ、save-bufferはバックアップ・ファイルを作成します。 backup-optionにほかの値を与えた場合、 それはほかの状態でバックアップ・ファイルの作成をするよう要求したことに なります。

Command: save-some-buffer &optioanl save-silently-p exiting
このコマンドはファイルをvisitしているバッファで修正されたものの複数のもの を対象にして保存を行ないます。通常、このコマンドはユーザに対し、 それぞれのバッファに対して確認を求めます。しかし、save-silently-pが 非nilである場合には、ファイルをvisitしているすべてのバッファを、 ユーザに確認をせず保存します。

オプションのexiting引数は、非nilの場合、ファイルをvisit していないほかのバッファも保存するように、この関数に要求します。 これらの対象となるバッファは、buffer-offer-saveの値として、 非nilであるローカル値をもつバッファです(これらの対象バッファに対して、 保存するかどうかの質問にyesと答えた場合、ファイル名を 聞かれます)。save-buffers-kill-emacs関数は、この引数に対して 非nilの値を渡します。

Variable: buffer-offer-save
Emacsは、バッファでこの変数が非nilのとき、そのバッファがファイルを visitしていない場合でも、Emacs終了時に保存をするような機能を提供します。 この変数は、自動的にすべてのバッファでローカルな変数です。通常、Mail モード(送信するメールを編集するのに使われます)ではこの変数をtに 設定します。

Command: write-file filename
この関数は、カレント・バッファをファイルfilenameに書き込み、 バッファがそのファイルをvisitしているものと設定し、そのバッファを修正がない ものとして記録します。 そのとき、バッファの名前を唯一なものにする必要があれば、 バッファの名前をfilenameをベースとして、`<2>'などの文字列を あとに付加して名前を変えます。 この関数は、この作業の大部分を set-visited-file-namesave-bufferを呼び出して行ないます。

Variable: write-file-hooks
この変数の値は、バッファの内容をvisitされているファイルに書き込む前に 呼び出される関数のリストです。そのリストの要素の一つが、非nilを 返した場合、そのファイルをすでに書込みがされたものとして扱い、 リストの残りの要素は呼び出さず、またファイル書込みのために 通常使われるコードは実行しません。

write-file-hooks中の関数が非nilを返した場合、 その関数はバックアップ・ファイルの作成に(もしそれが適切なものならば) 責任を持ちます。これを実行するために、以下のコードを実行してください。

(or buffer-backed-up (backup-buffer))

あなたはbackup-bufferが返すファイル・モードの値を保存したいかも しれません。そして、あなたが書き込むファイルに対し、モード・ビットを 設定するために、それを使いたいかもしれません。これはsave-bufferが 通常行っていることです。

これは正規フックではないのですが、このリストを取り扱うのに add-hookremove-hookを使うことができます。See section フック

Variable: local-write-file-hooks
これはちょうどwrite-file-hooksのように働きます。 しかしこれは特定のバッファにローカルなことをさせるためのフックです。 バッファローカルなことをするのにwrite-file-hooksを使うのは よい考えではありません。その代わりにこの変数を使ってください。

この変数はつねにバッファローカルなものですので、 主モードを変えても、バッファローカルな値は変わりません。 この変数は、特別な方法で"ファイル"の中味を読み込み、 それに対応する方法でそのデータを保存するためのフックをセットするような パッケージにとって便利です。

Variable: write-contents-hooks
これはちょうどwrite-file-hooksのように働きます。 しかしこのフックは、ファイルがどういう属性のものかということに関係するフック に対応させて、ファイルの中身に関係するものとして使われることを意識された フックです。 このようなフックは、通常主モードが設定を行ない、バッファローカルな 束縛をします。 新しい主モードに変わるときは、つねにこの変数をリセットします。

Variable: after-save-hook
この正規フックは、バッファの内容がそのvisitされているファイルに保存 されたあとに起動されるフックです。

Variable: file-precious-flag
この変数が非nilの場合、save-bufferは、そのファイルがもつことに なっていた名前の代わりに一時的な新しい名前で保存し、そしてエラーがないこと がわかった後に、予定していた名前にそのファイルの名前替えをする、という処理の 間に発生するI/Oエラーからファイルを保護します。 この手続きは、不適切なファイルで、ディスク空間が不足するような場合に 発生する問題点を回避します。

副作用として、バックアップは必ずコピーで実行されます。See section バックアップの手段は名前の変更?それともコピー?。 また同時に、貴重なファイルを保存することは、その保存する ファイルとそのほかの別名の間のハードリンクをつねに壊すことになります。

いくつかのモードは、この変数に対して特定のバッファでローカルに 非nilを設定します。

User Option: require-final-newline
この変数は、改行でファイルが終わらないように ファイルを書き込むかどうかを決めるものです。 もし変数の値がtならば、save-bufferは保存されるバッファが そのときに改行で終わってないときは、常にそのファイルの終わりに改行を確認なしに 加えます。 save-bufferは、もしこの変数の値が非nilであるが tでない場合、改行を加えるような場合が発生するごとに、 ユーザに確認を求めます。

もしその変数の値がnilならば、save-bufferは改行 を全く加えません。nilがこの変数に対するデフォルトの値ですが、 主モードの中には、特定のバッファでtを設定するものもあります。

ファイルからの読込み

insert-file-contents関数を使って、ディスクからファイルをコピーし、 バッファのなかにそのファイルを挿入することができます。ユーザレベル・コマンド insert-fileは、内部で印づけをするため、Lispプログラムの中では 使用してはいけません。

Function: insert-file-contents filename &optional visit beg end replace
この関数は、カレント・バッファのポイントの後にファイル filenameの内容を挿入します。 この関数は、そのファイルの絶対ファイル名と、 挿入されたデータ長のリストを返します。filenameが読み出すことのできる ファイルの名前でない場合は、エラーを発生します。

関数insert-file-contentsは、このファイルの内容に対して、 定義されたファイル・フォーマットでチェックを行ないます。 それが適切ならば、ファイルの内容を変換します。 See section ファイル・フォーマットの変換。 またこの関数は、リストafter-insert-file-functionsの関数を 呼び出します。section テキスト属性をファイルへセーブするを参照のこと。

もしvisitが非nilならば、この関数はさらに、バッファを修正が ないものとしてマークし、バッファ中のさまざまなフィールドをセットして、 ファイルfilenameをvisitしているように設定します。これらのフィールドと しては、バッファのvisitされているファイル名、最後に保存されたときの ファイルの修正時間などの情報があります。この特徴は、find-file-noselect が使用し、ほとんどの場合においては、ユーザ自身からは使用すべきではありません。

もしbegendが非nilならば、これらは、挿入されるファイル の部分を決める整数です。この場合、visitnilでなけ ればなりません。たとえば、

(insert-file-contents filename nil 0 500)

はファイルの最初の500文字を挿入します。

もし引数replaceが非nilならば、バッファの内容(実際はアクセス 可能な部分のみ)をファイルの内容で置き換えることを意味します。 これは、単純にバッファの内容を削除し、ファイルの全内容を挿入する、という 方法よりよい方法です。というのはこの関数は、 (1)いくつかのマーカの位置を保存する、 (2)undoリストに入るデータの量が少ない、 という利点があるからです。

もしほかのプログラムがそのファイルを読むことができるように、ほかのプロセスに ファイル名を渡したいならば、関数file-local-copyを使用してください。 section ファイル名を"魔力のあるもの"にするを参照のこと。

ファイルへの書込み

append-to-filewrite-region関数を使用して、 バッファの内容全部ないしは一部を、直接ディスク上のファイルとして 書き込むことができます。 これらの関数を、現在visitしているファイルに書込みを行なうのに 使用してはいけません。使用した場合、visitのメカニズムに混乱を引き起こす 可能性があります。

Command: append-to-file start end filename
この関数は、カレント・バッファ中のstartendで囲まれたリージョンの 内容を、filenameの終わりに追加書き込みします。もしそのようなファイルが 存在しない場合、新規に作成されます。この関数はnilを返します。

もしfilenameが、書き込み可能でないファイル、ないしは ファイル作成ができないディレクトリの中の存在しないファイルをさしていた場合、 エラーを発生します。

Command: write-region start end filename &optional append visit
この関数は、カレント・バッファのstartendで囲まれたリージョンを、 filenameで指定されたファイルに書き込みます。

もしstartが文字列ならば、write-regionはバッファからの テキストでなく、その文字列自身を書き込み、ないしは追加書き込みします。

もしapeendが非nilならば、その指定されたテキストは (もしあるならば)存在するファイルの内容に追加書き込みされます。

もしvisittならば、Emacsはバッファとファイルとの間に 関連性を確立します。そのときこのバッファは、そのファイルをvisitしている ことになります。 この関数はまた、filenameの修正時刻に、カレント・バッファの 最後のファイル修正の時刻をセットします。 そしてそのバッファが修正がないものとして記録します。 この特徴はsave-bufferが使用しますが、 ユーザはほとんどの場合この特徴を使用すべきではありません。

もしvisitが文字列ならば、これはvisitするファイル名を指定します。 これにより、データをあるファイル(filename)に書き込み、 一方でバッファは、別のファイル(visit)をvisitしているとして 記録することができます。 引数visitはエコー領域メッセージに使用され、またファイル・ロックの ためも使われます。 visitbuffer-file-nameに記録されます。 この特徴は、file-precious-flagを実装するのに使用されます。 ユーザは本当に自分が何をしているのかが知りたいのでなければ、 この特徴は使用してはいけません。

関数write-regionは、buffer-file-formatで指定されている 場合に、適切なファイル・フォーマットにそのデータを変換します。 See section ファイル・フォーマットの変換。 またこの関数は、リストwrite-region-annotate-functionsの関数を 呼び出します。section テキスト属性をファイルへセーブするを参照のこと。

通常、write-regionは、メッセージ`Wrote file filename'を エコー領域に表示します。 もし、visittあるいはnilあるいは文字列のどれでも ないならば、このメッセージの表示はされません。 この特徴は、内部の目的のためで、ユーザがそれについて知る必要が ないようなファイルを使うプログラムを作成する場合に便利です。

ファイルのロック

二人のユーザが同時に同じファイルを編集する場合、お互いに干渉してしまう 可能性があります。 Emacsは、ファイルが修正されているときに、 ファイル・ロック(file lock)を記録して、 このような状況が発生するのを回避しようとします。 これによりEmacsは、ほかのEmacsジョブによりロックされているファイルが バッファにvisitされて修正されようとするのを、 その最初の時点で検出することができ、ユーザにどのようにするか確認を求めます。

ファイル・ロックは、NFSのように、複数のマシンがファイル・システムを 共有している場合には正しく機能しません。 おそらく将来にはよりよいファイル・ロック・システムが実装されることでしょう。 ファイル・ロックが機能しないときには、二人のユーザにより、同時に一つの ファイルを修正をすることは可能にはなってしまうのですが、 Emacsはこの場合も、2番目に保存をしようとするユーザに注意を促します。 また、そのファイルがディスク上で変更されている場合に、その元ファイルを visitしているバッファが修正されているのを検出する機構は、 同時編集のケースを発見することができる場合があります。 section 変更時間の比較を参照。

Function: file-locked-p filename
この関数は、ファイルfilenameがこのEmacsプロセスによりロックされて いない場合にはnilを返します。 このEmacsによってロックされている場合は、tを返し、 ほかのユーザによってロックされている場合には、そのユーザの名前を返します。
(file-locked-p "foo")
     => nil

Function: lock-buffer &optional filename
この関数は、カレント・バッファが修正されている場合には、 ファイルfilenameを ロックします。この引数filenameは、カレント・バッファのvisitしている ファイルがデフォルトです。もしカレント・バッファが、ファイルを visitしていない、あるいは修正がない場合には、なにもしません。

Function: unlock-buffer
この関数は、カレント・バッファが修正されている場合に、そのバッファでvisitして いるファイルをアンロックします。バッファが修正されていない場合には、 その対応するファイルはロックされるべきではないので、 この関数はなにもしません。 カレント・バッファがファイルをvisitしていない場合もなにもしません。

Function: ask-user-about-lock file other-user
この関数は、ユーザがfileを修正しようとしたが、ほかのother-user という名前の別のユーザによりロックされている場合に呼ばれます。 この関数が返す値により、次に何が起こるかが決まります。

この関数のデフォルトの定義は、ユーザに何をするかについての選択を 促すことです。よって望むならば、ask-user-about-lockを、 あなた自身が作成したほかの決定をするバージョンのもので置き換える こともできます。この関数の通常の定義のコードは、 `userlock.el'に記述されています。

ファイルについての情報

この節で説明する関数はすべて、ファイル名を表す文字列に対して作用します。 これらの関数の名前はみな単語`file'で始まります。 これらの関数はすべて、実在するファイルあるいはディレクトリについての 情報を返します。 よって、これらの関数に対する引数は、ほかに注釈がなければ、 すべて実在するファイルあるいはディレクトリでなければなりません。

アクセス可能性をテストする

これらの関数は特定の方法でファイル・アクセスのパーミッションを検査します。

Function: file-exists-p filename
この関数は、filenameの名前のファイルが存在するように見えるとき、 tを返します。これは、そのファイルがあなたにとって可読であることを 必ずしも意味しておらず、ファイルに付随する属性を参照することができる、と いうだけです(Unixでは、ファイルが存在し、かつ、そのファイル自身のプロテ クションに関係なく、あなたがそのファイルが含まれるディレクトリに対して 実行権をもっている場合には、これは正しいです)。

そのファイルが存在しない場合、あるいはアクセス制御が厳しく、 ファイルの属性を参照できないようになっている場合は、この関数はnil を返します。

Function: file-readable-p filename
この関数は、filenameの名前をもつファイルが存在し、かつあなたが可読の 場合にはtを返します。それ以外の場合、nilを返します。
(file-readable-p "files.texi")
     => t
(file-exists-p "/usr/spool/mqueue")
     => t
(file-readable-p "/usr/spool/mqueue")
     => nil

Function: file-executable-p filename
この関数は、filenameの名前をもつファイルが存在し、かつ実行可能ならば、 tを返します。それ以外の場合はnilを返します。 そのファイルがディレクトリの場合で、実行パーミッションがあるということは、 そのディレクトリの中にあるファイルの存在と属性を確認することができ、 そのファイル自身は、ファイル・モードが許していれば、 オープンできるということを意味しています。

Function: file-writable-p filename
この関数は、ファイルfilenameが書き込みができる、ないしは新規作成が できるならば、tを返し、それ以外はnilを返します。 そのファイルは存在し、かつ書き込みができるならば、ファイルは書き込み可能です。 ファイルは存在しないが、指定したディレクトリは存在し、 かつそのディレクトリに書き込み可能ならば、ファイルは作成可能です。

以下の3番目の例の場合、`foo'は、親ディレクトリが存在しないために、 ユーザはそのディレクトリを作ることはできるかもしれませんが、 書き込み可能ではありません。

(file-writable-p "~/foo")
     => t
(file-writable-p "/foo")
     => nil
(file-writable-p "~/no-such-dir/foo")
     => nil

Function: file-accessible-directory-p dirname
この関数は、ファイル名としてdirnameの名前をもつディレクトリの中の 実在するファイルに対し、あなたがオープンできるパーミッションをもつ場合、 tを返します。それ以外の場合(あるいはそのようなディレクトリが存在 しない場合)、nilを返します。dirnameの値は、ディレクトリ名 ないしはディレクトリのファイル名のどちらかであるかもしれません。

例:以下の実行結果のもとで、

(file-accessible-directory-p "/foo")
     => nil

`/foo/'の中にあるファイルをどのように読み込もうとしても エラーになります。

Function: file-ownership-preserved-p filename
この関数は、ファイルfilenameを削除して次に新しく作成するときに、 ファイルの所有者が変わらない場合は、tを返します。

Function: file-newer-than-file-p filename1 filename2
この関数は、ファイルfilename1がファイルfilename2よりも新しいとき、 tを返します。filename1が存在しない場合、nilを返します。 filename2が存在しない場合、tを返します。

以下の例では、ファイル`aug-19'は、19日に書き込まれたファイルであり、 ファイル`aug-20'は、20日に書き込まれたファイルであり、ファイル `no-file'は全く存在しないファイルを表わしているとします。

(file-newer-than-file-p "aug-19" "aug-20")
     => nil
(file-newer-than-file-p "aug-20" "aug-19")
     => t
(file-newer-than-file-p "aug-19" "no-file")
     => t
(file-newer-than-file-p "no-file" "aug-19")
     => nil

file-attributesを使って、二つの数のリストという形式でファイル の最終修正時刻を得ることができます。 See section ファイルに関するそのほかの情報

ファイルの種類の区別

この節は、さまざまな種類のファイルをどのように区別するかについて説明します。 そのファイルとは、ディレクトリ、シンボリック・リンク、通常ファイルです。

Function: file-symlink-p filename
ファイルfilenameがシンボリック・リンクの場合、file-symlink-p 関数は、リンク元のファイル名を返します。 これはテキスト・ファイル名か、ディレクトリか、あるいはまたほかのシンボリック・リンクの名前かもしれませんし、あるいは存在しないファイル名かもしれません。

ファイルfilenameがシンボリック・リンクでない(あるいはそのような ファイルがない)時には、file-symlink-pnilを返します。

(file-symlink-p "foo")
     => nil
(file-symlink-p "sym-link")
     => "foo"
(file-symlink-p "sym-link2")
     => "sym-link"
(file-symlink-p "/bin")
     => "/pub/bin"

Function: file-directory-p filename
この関数は、filenameが実在するディレクトリの名前の場合、tを 返します。そうでない場合、nilを返します。
(file-directory-p "~rms")
     => t
(file-directory-p "~rms/lewis/files.texi")
     => nil
(file-directory-p "~rms/lewis/no-such-file")
     => nil
(file-directory-p "$HOME")
     => nil
(file-directory-p
 (substitute-in-file-name "$HOME"))
     => t

Function: file-regular-p filename
この関数は、ファイルfilenameが存在し、かつ正規のファイル(ディレクトリ、 シンボリック・リンク、名前つきパイプ、端末、そのほかのI/Oデバイス、の いずれでもないもの)である場合には、tを返します。

実名

 ファイルの実名(truename)は、シンボリック・リンクを なくなるまでたどり、`.', `..'の要素を展開した結果得られる名前です。厳密には、ファイルはただ一つ の実名をもつとはかぎりません。つまり、あるファイルがもつ別個の実名の数は、 そのファイルに対するハード・リンクの数と同じです。しかし実名は、名前の つけ方の多様性を生む原因となるシンボリック・リンクを取り除くので、 便利なものです。

Function: file-truename filename
関数file-truenameは、ファイルfilenameの実名を返します。 これはシンボリック・リンクを、それがなくなるまでたどることにより 得られる名前です。引数は絶対ファイル名でなければなりません。

関連する情報は See section バッファ・ファイル名

ファイルに関するそのほかの情報

この節では、ファイルの内容以外の詳細な情報を得るための関数について 説明します。この情報とは、アクセス・パーミッションを制御するモード・ビット、 所有者およびグループ番号、名前の数、inode数、サイズ、アクセス時間、 修正時間、などです。

Function: file-modes filename
この関数はfilenameのモード・ビットを整数で返します。モード・ビットは ファイル・パーミッションとも呼ばれ、通常のUnixの方式で、アクセス制御の方針を 指定します。もし最下位ビットが1ならば、そのファイルはすべてのユーザが実行可能 であり、2番目の下位ビットが1ならば、そのファイルはすべてのユーザが書き込み 可能である、などです。

返値として可能な最大値は4095(8進で7777)で、これはすべてのユーザが読込み、 書込み、実行パーミッションがあり、かつ、SUIDビットが他人とグループの 両方にセットされ、かつ、stickyビットがセットされていることを意味します。

(file-modes "~/junk/diffs")
     => 492               ; 10進の整数
(format "%o" 492)
     => "754"             ; 8進に変換

(set-file-modes "~/junk/diffs" 438)
     => nil

(format "%o" 438)
     => "666"             ; 8進に変換

% ls -l diffs
  -rw-rw-rw-  1 lewis 0 3063 Oct 30 16:00 diffs

Function: file-nlinks filename
この関数はファイルfilenameが持っている名前(つまりハード・リンク)の数 を返します。ファイルが存在しない場合、この関数はnilを返します。 シンボリック・リンクは、リンク元のファイルに対する名前とは解釈され ないため、この関数に対し影響をおよぼさないことに注意してください。
% ls -l foo*
-rw-rw-rw-  2 rms       4 Aug 19 01:27 foo
-rw-rw-rw-  2 rms       4 Aug 19 01:27 foo1

(file-nlinks "foo")
     => 2
(file-nlinks "doesnt-exist")
     => nil

Function: file-attributes filename
この関数はファイルfilenameの属性をリストとして返します。 指定されたファイルがオープンできない場合は、nilを返します。

返値のリストの要素は、以下に示す順序になります。

  1. ディレクトリに対してはtを、シンボリック・リンクに対しては文字列 (リンク元の名前)を、あるいはテキスト・ファイルに対してはnilを 返します。
  2. ファイルが持っている名前の数。別の名前、つまりハード・リンクは、 add-name-to-file関数を使って生成できます。 (see section ファイルの名前と属性の変更)
  3. ファイルのUID。
  4. ファイルのGID。
  5. 最終アクセス時間で、これは二つの整数のリストです。 第一の整数は時間を表す数字の上位16ビットを持ち、 第二の整数はその下位16ビットを持ちます。 (これはcurrent-timeの値に似た書式です。section 1日の時刻を参照)
  6. (上と同様に)二つの整数のリストで表現された最終修正時間。
  7. (上と同様に)二つの整数のリストで表現された最終状態変更時間。
  8. バイト表現のファイルのサイズ。
  9. `ls -l'の出力と同様の、10個の英文字ないしはダッシュの列で 表現されたファイルのモード。
  10. ファイルが削除されて再び作成される場合に、ファイルのGIDが変わるような 場合は、tを返します。それ以外はnilを返します。
  11. ファイルのinode番号。
  12. そのファイルが含まれるファイル・システムの、ファイル・システム番号。これと inode番号により、そのシステム上の任意の二つのファイルを区別できます。 すなわち、これらの番号の両方が同じ値であるような二つのファイルはありません。

例として、ここに`files.texi'のファイル属性を示します。

(file-attributes "files.texi")
     =>  (nil 
          1 
          2235 
          75 
          (8489 20284) 
          (8489 20284) 
          (8489 20285)
          14906 
          "-rw-rw-rw-" 
          nil 
          129500
          -32252)

そして、この出力結果がどのように解釈されるかを以下に示します。

nil
はディレクトリ、シンボリック・リンクのどちらでもないことを表しています。
1
はただ一つの名前を(現在のデフォルト・ディレクトリに名前`files.texi'で) もつことを表しています。
2235
はUID 2235のユーザが所有していることを表しています。
75
はGID 75のグループに属していることを表しています。
(8489 20284)
は最後にアクセスされた時間がAug 19 00:09であることを表しています。 不幸なことにEmacs内部では、この番号を時間を表わす文字列に変換できません。
(8489 20284)
は最終修正時間がAug 19 00:09であることを表しています。
(8489 20285)
はこのinodeを最後に変更したのはAug 19 00:09であることを表しています。
14906
はこのファイルには14906文字を含んでいることを表しています。
"-rw-rw-rw-"
は所有者、グループ、他人に対する、読込み、書込みアクセスのモードを 表わしています。
nil
はファイルが再び作られる場合、同じGIDを保持することを表わしています。
129500
は129500というinode番号を表わしています。
-32252
は-32252というファイル・システムの番号です。

ファイルの名前と属性の変更

この節で説明する関数は、ファイルに対し、名前の変更、コピー、削除、 リンク、モードの設定を行ないます。

newnameを引数としてもつ関数は、この名前をもつファイルが すでに存在する場合に、引数ok-if-already-existsの値に 依存して、とられる動作が決まります。

Function: add-name-to-file oldname newname &optional ok-if-already-exists
この関数は、名前oldnameをもつファイルに、追加の名前newnameを 与えます。これは、newnameが、oldnameに対する新しい "ハード・リンク"になることを意味します。

以下でまず最初に、二つのファイル`foo'`foo3'のリストを例として 挙げます。

% ls -l fo*
-rw-rw-rw-  1 rms       29 Aug 18 20:32 foo
-rw-rw-rw-  1 rms       24 Aug 18 20:31 foo3

ここで、形式(add-name-to-file "~/lewis/foo" "~/lewis/foo2) を評価します。再びファイルのリストを示します。これにより`foo'`foo2'という二つの名前が表示されます。

(add-name-to-file "~/lewis/foo" "~/lewis/foo2")
     => nil

% ls -l fo*
-rw-rw-rw-  2 rms       29 Aug 18 20:32 foo
-rw-rw-rw-  2 rms       29 Aug 18 20:32 foo2
-rw-rw-rw-  1 rms       24 Aug 18 20:31 foo3

最後に、次の式を評価します。

(add-name-to-file "~/lewis/foo" "~/lewis/foo3" t)

そしてファイルのリストを再度挙げます。ここでは一つのファイルに対し、 三つの名前があります。すなわち、`foo', `foo2', `foo3'です。 古い`foo3'の内容は失われます。

(add-name-to-file "~/lewis/foo" "~/lewis/foo3")
     => nil

% ls -l fo*
-rw-rw-rw-  3 rms       29 Aug 18 20:32 foo
-rw-rw-rw-  3 rms       29 Aug 18 20:32 foo2
-rw-rw-rw-  3 rms       29 Aug 18 20:32 foo3

この関数はVMSでは無意味です。VMSでは、一つのファイルが複数の名前を もつことは許されません。

section ファイルに関するそのほかの情報file-nlinksも参照のこと。

Command: rename-file filename newname &optional ok-if-already-exists
このコマンドはファイルfilenameの名前をnewnameに変えます。

filenamefilename以外の別名をもつ場合、このファイルは、 それらの名前を引き続き持ちます。事実、add-name-to-fileを使って名前 newnameを加え、filenameを消去するというのは、一時的に中間的な 状態をもつことを除けば、名前替えと同じことをしていることになります。

この関数が対話的に呼ばれた場合には、ミニバッファにfilenamenewnameの入力を促します。また、newnameがすでに存在した 場合には確認を求めます。

Command: copy-file oldname newname &optional ok-if-already-exists time
このコマンドはファイルoldnamenewnameにコピーします。 oldnameが存在しない場合には、エラーを発生します。

timeが非nilの場合、この関数は、新しいファイルに対し、古い ファイルが持っていたものと同じ最終修正時間を与えます (これはいくつかのオペレーティングシステムでのみ機能します)。

この関数が対話的に呼び出された場合、ミニバッファに、filenamenewnameの入力を促します。また、newnameがすでに存在する 場合には、確認を求めます。

Command: delete-file filename
このコマンドは、シェル・コマンド`rm filename'と同じように、 ファイルfilenameを削除します。そのファイルが複数の名前を持っている 場合、それはその別名で存在し続けます。

ファイルが存在しない、ないしは削除可能でない場合には、適切な種類の file-errorエラーを発生させます(UNIXの場合、ディレクトリが 書き込み可能であれば、ファイルは削除可能です)。

section ディレクトリの作成と削除delete-directoryも参照のこと。

Command: make-symbolic-link filename newname &optional
ok-if-already-exists このコマンドは、filenameに対し、名前newnameのシンボリック・リンク を作成します。これは、シェル・コマンド`ln -s filename newname' と同様です。

この関数は、対話的に呼び出された場合、ミニバッファでfilenamenewnameの入力を促します。またnewnameがすでに存在する場合には、 確認を求めます。

Function: define-logical-name varname string
この関数は、値stringをもつような論理名nameを定義します。 この関数はVMSでのみ利用可能です。

Function: set-file-modes filename mode
この関数はfilenameのモード・ビットをmodeに設定します (これは整数でなければなりません)。 modeの下位12ビットのみが 使用されます。

Function: set-default-file-modes mode
この関数は、Emacsおよびそのサブプロセスによって新規に作成されるファイルの、 デフォルトのファイル・プロテクションを設定します。 Emacsで作成されるファイルは、 すべて初期状態ではこのプロテクションを持ちます。 UNIXでは、デフォルト・プロテクションは、"umask"値のビットごとの補完値です。

引数modeは整数でなければなりません。modeの下位9ビットのみが 使用されます。

実在するファイルを修正して保存する場合は、ファイルを作成したこととは 解釈されません。この場合はファイルのモードは変化せず、デフォルトの ファイル・プロテクションは使われません。

Function: default-file-modes
この関数は現在のデフォルトのプロテクション値を返します。

 MS-DOSでは、"実行可能"を表わすようなファイル・モード・ビットはありません。 よってEmacsは、ファイル名が`.com'`.bat'`.exe' で終わる場合に、実行可能であると解釈します。 これは、file-modeおよびfile-attributesが返す値に反映されます。

ファイル名

ファイルは、一般的には、Emacs内部ではどこでもその名前によって参照されます。 Emacsではファイル名は、文字列で表現されます。ファイルに対して機能する ような関数はすべて、ファイル名を引数に取ることを期待します。

ファイル自身に作用するのに加え、Emacs Lispプログラムは、その名前自体に 作用する必要があるときがあります。つまり、もとのファイル名に関係するような ファイル名を作成するために、名前を分割し、その名前の部分を使うためにです。 本節では、ファイル名をどのように操作するかについて説明します。

この節で説明する関数は、実際のファイルにはアクセスしないので、 実在しないファイルないしはディレクトリを示すようなファイル名 に対しても機能させることができます。

VMSでは、すべてのこれらの関数は、VMSファイル名構文とUNIX構文の両方を 理解します。これは、すべての標準Lispライブラリが、UNIX構文でファイル名を 指定しており、そのコードの変更なしに、VMSで適正に動作させるためです。 MS-DOSでは、これらの関数はUNIX構文と同様に、MS-DOSファイル名構文を理解します。

ファイル名の構成要素

オペレーティングシステムは、ディレクトリに含まれるファイルをグループ化 します。あるファイルを指定するには、ディレクトリとそのディレクトリ内での ファイル名を指定する必要があります。よってEmacsは、ファイル名を二つの主要な 部分をもつものとして解釈します。それはディレクトリ名(directory name) 部分と、非ディレクトリ(nondirectory)部分 (すなわち そのディレクトリ内部でのファイル名(file name within the directory)) です。どちらかの部分が空であるかもしれません。 これら二つの部分をつなげると、オリジナルのファイル名が再度作り出せます。

Unixでは、ディレクトリ部分とは、ファイル名の最初から最後のスラッシュ までの部分です。非ディレクトリ部分はその残りの部分です。 VMSの構文でのこの規則は複雑です。

いくつかの目的のために、非ディレクトリ部分は、さらに厳密な意味での 名前とバージョン番号(version number)に分割されます。 Unixでは、バックアップ・ファイル のみが名前の中にバージョン番号を持ちます。VMSでは、すべてのファイルが バージョン番号を持ちますが、ファイル名がEmacsで実際に使われる時間の内の ほとんどは、そのバージョン番号を省略します。 バージョン番号は、ほとんどの場合ディレクトリ・リストの中でみられます。

Function: file-name-directory filename
 この関数は、filenameのディレクトリ部分を返します(あるいは filenameがディレクトリ部分をもたない場合には、nilを返します)。 Unixでは、この関数の返値は最後にスラッシュが付くような文字列です。 VMSでは、返値は、`:'`]'`>'のいずれかの文字が最後に付く ような文字列です。
(file-name-directory "lewis/foo")  ; Unixの例
     => "lewis/"
(file-name-directory "foo")        ; Unixの例
     => nil
(file-name-directory "[X]FOO.TMP") ; VMSの例
     => "[X]"

Function: file-name-nondirectory filename
 この関数はfilenameの非ディレクトリ部分を返します。
(file-name-nondirectory "lewis/foo")
     => "foo"
(file-name-nondirectory "foo")
     => "foo"
;; 以下は、VMSの場合の例です。

(file-name-nondirectory "[X]FOO.TMP")
     => "FOO.TMP"

Function: file-name-sans-versions filename
 この関数は、filenameからファイル・バージョン番号、バックアップ・ バージョン番号、および最後のチルダを除いたものを返します。
(file-name-sans-versions "~rms/foo.~1~")
     => "~rms/foo"
(file-name-sans-versions "~rms/foo~")
     => "~rms/foo"
(file-name-sans-versions "~rms/foo")
     => "~rms/foo"
;; 以下の例はVMSの場合のみ有効です。

(file-name-sans-versions "foo;23")
     => "foo"

Function: file-name-sans-extension filename
この関数は、filenameから(存在すれば)"拡張子"を除いたものを返します。 ファイル名中の拡張子とは、名前の最後の要素であり、最後の`.'から 始まる部分です。例を示します。
(file-name-sans-extension "foo.lose.c")
     => "foo.lose"
(file-name-sans-extension "big.hack/foo")
     => "big.hack/foo"

ディレクトリ名

ディレクトリ名(directory name)は、ディレクトリの名前です。 ディレクトリはファイルの 一種であり、ファイル名を持ちディレクトリ名と関係がありますが、同一のも のではありません(これは、通常のUnixでの用語法では、全く別のものです)。 同じ実体のものに対するこの二つの異なった名前は、構文的な変換によって 関連づけることができます。Unixでは、この変換は単純なものです。 ディレクトリ名はスラッシュで終わます。 一方のディレクトリのファイル名はそのスラッシュがありません。 VMSでは、この関係はより複雑です。

ディレクトリ名と、ディレクトリのファイル名の相違点は、微細な点ですが、 重要です。Emacs変数ないしは関数の引数が、ディレクトリ名として表わされて いる場合には、ディレクトリのファイル名は許されません。

以下の二つの関数は、ディレクトリ名とファイル名の間で変換をします。 これらの関数は、`$HOME'のような環境変数の置き換え、 `~'`..'の展開、などの特別なことはしません。

Function: file-name-as-directory filename
この関数は、オペレーティングシステムがディレクトリの名前として 解釈できるような形式で、filenameを表現する文字列を返します。 Unixでは、これはそのファイル名を表す文字列の最後にスラッシュを つけ加えることを意味します。 VMSでは、この関数は、形式`[X]Y.DIR.1'の文字列を、形式`[X.Y]' の文字列に変換します。
(file-name-as-directory "~rms/lewis")
     => "~rms/lewis/"

Function: directory-file-name dirname
この関数は、オペレーティングシステムがファイルの名前として解釈できる ような形式で、dirnameを表現する文字列を返します。 Unixでは、これはそのディレクトリを表す文字列から最後のスラッシュを 取り除くことを意味します。 VMSでは、この関数は、形式`[X.Y]'の文字列を、形式`[X]Y.DIR.1' の文字列に変換します。
(directory-file-name "~lewis/")
     => "~lewis"

ディレクトリ名の省略形は、通常シンボリック・リンクを介してアクセスされるような ディレクトリに対して有用です。 ユーザはまず最初に、リンク名をディレクトリの"名前"として認識し、 それからディレクトリの"本当の"名前をみつけるのにやっかいなのを 発見するのです。 リンク名を本物の名前に対する省略形として定義すれば、Emacsは代わりに、 この省略形をユーザにみせます。

Variable: directory-abbrev-alist
変数directory-abbrev-alistは、ファイル・ディレクトリを表わすために使う 省略形のalistを持ちます。おのおのの要素は、(from . to)の 形式を持ち、ディレクトリ名にfromが現われた場合、toに置き換える、 という意味を持ちます。 from文字列は、実際は正規表現です。これは、常に`^'で始まるべきです。 関数abbreviate-file-nameが、これらの置換を実行します。

あなたのサイトにあわせて省略形を設定する場合は、`site-init.el'で この変数の設定ができます。

ここで例を示します。`/home/fsf'などのファイル・システムが、通常、 `/fsf'などのシンボリック・リンクからアクセスされるようなシステムの場合の 例です。

(("^/home/fsf" . "/fsf")
 ("^/home/gp" . "/gp")
 ("^/home/gd" . "/gd"))

ディレクトリ名を省略形に変換する場合は、次の関数を使用してください。

Function: abbreviate-file-name dirname
この関数は、引数にdirectory-abbrev-alistの要素からの省略形を適用し、 ユーザのホーム・ディレクトリを`~'に置換します。

絶対ファイル名と相対ファイル名

ファイル・システムの中にあるすべてのディレクトリは、ルート・ディレクトリ からはじまる木構造を形成しています。あるファイル名というものは、この木の ルートからはじまるディレクトリ名のすべてを指定できます。この場合、これは 絶対(absolute)ファイル名と呼ばれます。 あるいは、あるファイル名は、デフォルト・ディレクトリに対して相対的に、 その木の中でのファイルの位置を、指定できます。 これは相対(relative)ファイル名と呼ばれます。 Unixでは、絶対ファイル名はスラッシュないしはチルダ(`~')で始まる名前で、 相対ファイル名はそうではありません。VMSでのこの規則は複雑です。

Function: file-name-absolute-p filename
この関数は、ファイルfilenameが絶対ファイル名である場合にはtを 返し、そうでない場合にはnilを返します。VMSでは、この関数はUnix構文と VMS構文の両方を解釈します。
(file-name-absolute-p "~rms/foo")
     => t
(file-name-absolute-p "rms/foo")
     => nil
(file-name-absolute-p "/user/rms/foo")
     => t

ファイル名を展開する関数

ファイル名の展開(expansion)とは、 相対ファイル名を絶対ファイル名に変換することを意味します。 これはデフォルト・ディレクトリに対して相対的に変換されるので、 展開対象となるファイル名と同様、デフォルト・ディレクトリを指定しなければ なりません。また展開は、`./'`name/../'などの冗長なものを ファイル名から取り除いて簡単にします。

Function: expand-file-name filename &optional directory
この関数はfilenameを絶対ファイル名に展開します。 directoryが与えられた場合、filenameが相対的表現であれば、 それは開始部分のディレクトリです (directoryの値は、それ自身は絶対ディレクトリ名でなければ いけません。それは`~'で始まるかもしれません)。 与えられない場合、カレント・バッファの default-directoryの値が使われます。 例を挙げます。
(expand-file-name "foo")
     => "/xcssun/users/rms/lewis/foo"
(expand-file-name "../foo")
     => "/xcssun/users/rms/foo"
(expand-file-name "foo" "/usr/spool/")
     => "/usr/spool/foo"
(expand-file-name "$HOME/foo")
     => "/xcssun/users/rms/lewis/$HOME/foo"

`.'あるいは`..'を含むファイル名は、正準な形式に単純化されます。

(expand-file-name "bar/../foo")
     => "/xcssun/users/rms/lewis/foo"

`~/'はユーザのホーム・ディレクトリに展開されます。`/'に続く `/'ないしは`~'に対しては、そこから絶対ファイル名が開始されると 解釈され、そこに先立つ部分を無視します。 よってこの`/'ないしは`~'の前にあるものはすべて取り除かれます。 例を挙げます。

(expand-file-name 
 "/a1/gnu//usr/local/lib/emacs/etc/MACHINES")
     => "/usr/local/lib/emacs/etc/MACHINES"
(expand-file-name "/a1/gnu/~/foo")
     => "/xcssun/users/rms/foo"

この両方の場合で`/a1/gnu/'は、絶対ファイル名がそれに続くことに より捨てられます。

expand-file-nameは、環境変数は展開しないことに 注意してください。これをするのはsubstitute-in-file-nameだけです。

Function: file-relative-name filename directory
この関数は、展開の逆のことをします。ファイル名がdirectoryに対して 相対的に解釈されたとき、filenameと等価な相対ファイル名を返そう とします(もしそのような相対ファイル名が絶対ファイル名より長ければ、 この関数は代わりに絶対名を返します)。
(file-relative-name "/foo/bar" "/foo/")
     => "bar")
(file-relative-name "/foo/bar" "/hack/")
     => "/foo/bar")

Variable: default-directory
このバッファローカルな変数の値は、 カレント・バッファのデフォルト・ディレクトリです。 これは絶対ディレクトリ名であるべきです。これは`~'で始まっているかも しれません。この変数は、すべてのバッファでローカルな変数です。

expand-file-nameは、 2番目の引数がnilのとき、このデフォルト・ディレクトリを使います。

Unixシステムでは、この値は、つねにスラッシュで終わる文字列です。

default-directory
     => "/user/lewis/manual/"

Function: substitute-in-file-name filename
この関数はfilename中で参照される環境変数を、環境変数の値で置換します。 標準のUnixのシェル構文では、`$'は環境変数の値を置き換えるための 接頭辞です。

環境変数の名前は、`$'に続く、英数字(_を含む)の列です。 `$'に続く文字が`{'である場合、それに対応する`}'までの すべてが変数名です。

ここで、ユーザのホーム・ディレクトリを表わす環境変数HOMEが、 値`/xcssun/@linebreak{'users/rms}をもつものとします。

(substitute-in-file-name "$HOME/foo")
     => "/xcssun/users/rms/foo"

置換後の表現で、`/'の後に`~'ないしは`/'が現われる場合は、 前の`/'より前のものはすべて捨てられます。

(substitute-in-file-name "bar/~/foo")
     => "~/foo"
(substitute-in-file-name "/usr/local/$HOME/foo")
     => "/xcssun/users/rms/foo"

VMSでは、`$'についての置換はされません。よってVMSでは、この関数は、 上に示したような不必要な最初の要素の除去以外の操作は、なにもしません。

唯一存在するファイル名を生成する

プログラムでは、一時的なファイルを作成する必要がある場合があります。 ここでは、そのようなファイルの名前をつくるために通常使われる手法を 説明します。

(make-temp-name (concat "/tmp/" name-of-application))

ここではディレクトリは`/tmp/'を使用します。というのは、これはUnixでは、 一時ファイルを作成するのには標準の場所だからです。 make-temp-nameの仕事は、二人の異なるユーザ、ないしは二つの異なる ジョブが、同じファイル名を使うのを回避することです。

Function: make-temp-name string
この関数は唯一の名前として使うことができる文字列を生成します。 その名前はstringで始まり、それぞれのEmacsジョブで異なるような数値で 終わります。
(make-temp-name "/tmp/foo")
     => "/tmp/foo021304"

同一のEmacs上で動作する別のライブラリの間で、ファイル名が衝突するのを 避けるために、make-temp-nameを使うEmacs lispプログラムは、すべて自身 のstringをもつべきです。名前の最後に加えられる数字は、別のEmacsの ジョブで動作する同一のアプリケーションを区別します。

ファイル名補完

この節ではファイル名を補完するための低レベルのサブルーチンについて 説明します。ほかの補完関数は、section 補完を参照のこと。

Function: file-name-all-completions partial-filename directory
この関数は、ディレクトリdirectoryにあり、partial-filenameで 始まるファイル名をもつファイル名について、すべての補完候補ファイル名のリスト を返します。補完リスト中の要素の順序というものは、そのディレクトリにある ファイルの順序であり、これは、前もって予期できるものでもありませんし、 有益な情報を提供するわけでもありません。

引数partial-filenameは、ディレクトリ部分もスラッシュも含まないような ファイル名でなければいけません。もしdirectoryが絶対表記でなければ、 カレント・バッファのデフォルト・ディレクトリがそれに先立ちます。

以下の例では、現在のデフォルト・ディレクトリ`~rms/lewis'に、 `f'で始まる名前のファイルが五つあるものとしています。 `foo'`file~'`file.c'`file.c.~1~'`file.c.~2~'です。

(file-name-all-completions "f" "")
     => ("foo" "file~" "file.c.~2~" 
                "file.c.~1~" "file.c")

(file-name-all-completions "fo" "")  
     => ("foo")

Function: file-name-completion filename directory
この関数はディレクトリdirectoryにあるファイル名filenameに対し、 補完を行ないます。ディレクトリdirectory中の、filenameで始まる すべてのファイルに対し、共通な最も長い接頭辞を返します。

一致するものがただ一つで、filenameに完全に一致する場合、 この関数はtを返します。ディレクトリdirectory中に filenameで始まるファイルがない場合にはnilを返します。

以下の例で、現在のデフォルト・ディレクトリに、`f'で始まる五つのファイル があるとします。そのファイルは`foo'`file~'`file.c'`file.c.~1~'`file.c.~2~'です。

(file-name-completion "fi" "")
     => "file"

(file-name-completion "file.c.~1" "")
     => "file.c.~1~"

(file-name-completion "file.c.~1~" "")
     => t

(file-name-completion "file.c.~3" "")
     => nil

User Option: completion-ignored-extensions
file-name-completionは、通常このリストにある文字列で終わるような ファイル名はすべて無視します。 可能な補完候補の最後の部分が、すべてこれらの接尾辞のどれかである場合、 または、すべての補完候補を示すためのバッファが表示される場合は、 無視しません。

典型的な値はこのようなものかもしれません。

completion-ignored-extensions
     => (".o" ".elc" "~" ".dvi")

ディレクトリの内容

ディレクトリは一種のファイルで、さまざまな名前を持ったほかのファイルを 含んでいます。ディレクトリは、ファイル・システムを特徴づけるものの一つです。

Emacsは、ディレクトリ中のファイルの名前を、Lispのリストとしてリスト アップすることができます。あるいは、lsシェル・コマンドを使用して、 バッファにその名前を表示することができます。 後者の場合では、lsコマンドに渡すオプションに応じて、 それぞれのファイルについての情報を選択的に表示することができます。

Function: directory-files directory &optional full-name match-regexp nosort
この関数は、ディレクトリdirectoryにあるファイル名のリストを返します。 デフォルトでは、リストはアルファベット順で並べられます。

full-nameが非nilの場合、この関数はファイルの絶対ファイル名 を返します。そうでない場合、指定のディレクトリに対する相対名を返します。

match-regexpが非nilの場合、この関数は、その正規表現に 一致する部分を含むようなファイル名のみを返します。それ以外のファイル名はリスト から外します。

nosortが非nilの場合、directory-filesは リストをソートしませんので、特定の順序をつけずにファイル名を返します。 可能なかぎりの最大の処理速度が必要で、ファイルの処理順序が関係ない場合に、 これを使用してください。 ファイル処理の順序がユーザから分かってしまう場合は、あなたがそのファイル の名前をソートしてやれば、ユーザにとってはおそらく便利でしょう。

(directory-files "~lewis")
     => ("#foo#" "#foo.el#" "." ".."
         "dired-mods.el" "files.texi" 
         "files.texi.~1~")

directoryが、読み出すことのできるディレクトリの名前でない場合には、 エラーを発生します。

Function: file-name-all-versions file dirname
この関数は、ディレクトリdirnameにある、fileという名前の ファイルのすべてのバージョンのリストを返します。

Function: insert-directory file switches &optional wildcard full-directory-p
この関数は、ディレクトリfile中のファイル・リストを(カレント・バッファに) 挿入します。これは、switchesつきのlsでフォーマットした ものです。この関数により、ポイントは挿入されたテキストの後に移動します。

引数fileは、ディレクトリ名か、ワイルドカードを含むような ファイル仕様であるかもしれません。wildcardが非nilの場合、 これは、fileをワイルドカードを含むファイル仕様として取り扱う ことを意味します。

full-directory-pが非nilの場合、これはfileがディレクトリで、 スイッチが`-d'を含まないということを意味します。そしてこの場合の リストは、ディレクトリ中のすべての内容を表示すべきです (ls`-d'オプションは、ディレクトリの内容ではなく、 ディレクトリ自身の情報を表示することを意味します)。

この関数は、ディレクトリのリストを作るために、 変数insert-directory-programで示される名前のプログラムを起動します。 またwildcardが非nilの場合、ワイルドカードを展開するために、 shell-file-nameで指定されるシェルもまた同様に起動します。

Variable: insert-directory-program
この変数の値は、関数insert-directoryが、あるディレクトリ中の ファイルのリストをつくるために起動するプログラムです。

ディレクトリの作成と削除

Emacs Lispでのたいていのファイル操作関数は、それがディレクトリであるような ファイルに対して使われた場合は、エラーとなります。 たとえば、delete-fileを使って、ディレクトリを削除することはできません。 ここで説明する特別な関数は、このディレクトリを作成したり削除するために あります。

Function: make-directory dirname
この関数はdirnameという名前のディレクトリを作成します。

Function: delete-directory dirname
この関数は、dirnameという名前のディレクトリを削除します。 関数delete-fileは、ディレクトリであるようなファイルには機能しません。 この場合には、delete-directoryを使わなければいけません。 そのディレクトリがなんらかのファイルを含んでいる場合には、 delete-directoryはエラーを発生します。

ファイル名を"魔力のあるもの"にする

 あるファイル名に対し、特別な扱いをさせることができます。 これは、これらのファイル名を魔力のあるもの(magic)にする、と言います。 これには、名前のクラスを定義する正規表現 (このクラスのメンバはその正規表現に一致するようなものすべてです)と、 この一致するファイル名に対して機能するハンドラ、 すなわちすべてのプリミティブなEmacsファイル操作を実装する ハンドラ、を与えてやらなければなりません。

変数file-name-handler-alistはハンドラのリストで、それぞれの ハンドラがいつ適用されるかを決定する正規表現をともに持ちます。 各要素は次の形式です。

(regexp . handler)

ファイル・アクセスとファイル名変換を行なうすべてのEmacsプリミティブは、 引数として与えられたファイル名を、file-name-handler-alistに 照らし合します。ファイル名がregexpに一致する場合、 そのプリミティブは、handlerを呼び出してそのファイルをハンドルします。

handlerには、そのプリミティブの名前が第一の引数として与えられます。 残りの引数は、そのファイル操作に与えられた引数がそのまま渡されます (典型的には、この残りの引数の一番最初のものはファイル名そのものです)。 たとえば、

(file-exists-p filename)

の場合で、filenameがハンドラhandlerをもつ時、 handlerはこのように呼び出されます。

(funcall handler 'file-exists-p filename)

ここに、魔法ファイル名のハンドラがハンドルする権利を得る操作を示します。

add-name-to-file, copy-file, delete-directory, delete-file, diff-latest-backup-file, directory-file-name, directory-files, dired-compress-file, dired-uncache, expand-file-name, file-accessible-directory-p, file-attributes, file-directory-p, file-executable-p, file-exists-p, file-local-copy, file-modes, file-name-all-completions, file-name-as-directory, file-name-completion, file-name-directory, file-name-nondirectory, file-name-sans-versions, file-newer-than-file-p, file-readable-p, file-regular-p, file-symlink-p, file-truename, file-writable-p, get-file-buffer, insert-directory, insert-file-contents, load, make-directory, make-symbolic-link, rename-file, set-file-modes, set-visited-file-modtime, unhandled-file-name-directory, verify-visited-file-modtime, write-region.

insert-file-contentsに対するハンドラでは、 その関数のvisit引数が非nilの場合では、 典型的な処理として、 (set-buffer-modified-p nil)で、 そのバッファの修正のフラグをクリアしてやる必要があります。 またこれは、バッファがロックされている場合には、それをアンロックするという 効果があります。

ハンドラ関数は上の操作のすべてと、おそらく将来加わるほかの操作 とをハンドルしなければいけません。 これらのすべての操作を実装する必要はありません。 ハンドラ関数は、ある操作に対して特別にすべきことがないときは、 プリミティブを再起動してやれば、その操作を"通常のやり方"でハンドル することができます。 ハンドラ関数が関係しないような操作のプリミティブは、つねに再起動すべきです。 以下にこれを行う方法の例を示します。

(defun my-file-handler (operation &rest args)
  ;; 最初に、特別な扱いが必要な演算についてチェックする
  (cond ((eq operation 'insert-file-contents) ...)
        ((eq operation 'write-region) ...)
        ...
        ;; 知らない操作に対するハンドル
        (t (let ((inhibit-file-name-handlers
                 (cons 'my-file-handler 
                       (and (eq inhibit-file-name-operation operation)
                            inhibit-file-name-handlers)))
                (inhibit-file-name-operation operation))
             (apply operation args)))))

ハンドラ関数が、その中でその通常のEmacsプリミティブを呼び出す時には、 そのプリミティブが同じハンドラから再度呼ばれないようする必要があります。 そうでなければ無限の再帰が生じてしまいます。 上の例では、変数inhibit-file-name-handlersinhibit-file-name-operationを使って、これをどうやるかを示しています。 これらの変数は上で示したように注意して正確に使ってください。 複数のハンドラをもつ場合に適切な振る舞いをさせる場合と、 二つのファイル名をもち、そのそれぞれがハンドラをもつような操作の場合に、 この例のような詳細な部分が重要になります。

Variable: inhibit-file-name-handlers
この変数は、ある操作に対して現在使用を禁止されているハンドラのリストを 持ちます。

Variable: inhibit-file-name-operation
現在、ハンドラの使用禁止の対象となっている操作。

Function: find-file-name-handler file operation
この関数は、ファイル名fileに対するハンドラ関数を返します。もしハンドラ がなければnilを返します。引数operationは、ファイルに対して機能 する操作でなければいけません。operationは、その操作が呼ばれたときに、 その最初の引数としてハンドラに渡される値です。この操作を表わす引数は、 inhibit-file-name-operationとの比較を行なうために必要です。

Function: file-local-copy filename
この関数は、ファイルfilenameがすでに魔法ファイルであれば、 これを通常の非魔法ファイルにコピーします。

filenameが、Emacsの外のプログラムからは直接は読み書きできない ような"魔法"ファイル名を指している場合、この関数は、通常のファイルに 内容をコピーし、そのファイル名を返します。

filenameが通常のファイル名で魔法ファイル名でない場合、この関数は なにもせずnilを返します。

Function: unhandled-file-name-directory filename
この関数は、魔力を持たないディレクトリの名前を返します。 ファイルfilenameが魔力を持たない場合、 この関数はfilenameのディレクトリ部分を返します。 そうでなければハンドラに対して何をすべきかを尋ねます。

これは、サブプロセスを起動する場合に便利です。すべてのサブプロセスは カレント・ディレクトリとして魔力を持たないディレクトリを持たなければなりません。 この関数を使うのは、この要求にあったよい方法です。

ファイル・フォーマットの変換

変数format-alistは、ファイル・フォーマット(file formats) のリストを定義します。 これは、Emacsバッファ中のデータ(テキストやテキスト属性、場合によると ほかの情報も)がファイルとなるときに、テキスト的にどのような表現になるかを 記述したものです。 Emacsは、ファイルを読んだり書いたりするときに、適切ならばフォーマット 変換をします。

Variable: format-alist
このリストの要素は、定義されたファイル・フォーマットごとに、一つのフォーマット 定義を持ちます。

フォーマット定義は、このような形式のリストです。


(name doc-string regexp from-fn to-fn
modify mode-fn)

フォーマット定義の各要素の意味は次のようになります。

name
このフォーマットの名前です。
doc-string
このフォーマットを説明した文字列です。
regexp
このフォーマットで表現されたファイルを識別するために使う正規表現です。
from-fn
(ファイル・データを、通常のEmacsでのデータの表現に変換するために) データをこのフォーマットで復号化するために呼びだされる関数です。 from-fnは、二つの引数beginendをともなって呼び出されます。 これらはバッファの変換すべき部分を指定します。 この関数は、そのテキストを適切に編集することにより、変換を行うべきです。 これによって、テキストの長さが変わるので、from-fnは修正後のバッファの 最後の位置を返すべきです。 from-fnは、ファイルの頭がregexpに一致しないようにしてやらなけれ ばなりません。そうでなければ、またフォーマット変換が行なわれてしまいます。
to-fn
(通常のEmacsでのデータの表現をこのフォーマットに変換するために) データをこのフォーマットで符号化するために呼び出される関数です。 to-fnは、二つの引数beginendをともなって呼び出されます。 これらはバッファの変換すべき部分を指定します。 この関数がフォーマット変換をする方法は、二つあります。
modify
フラグです。符号化関数によりバッファを修正する場合にはtを、 注釈のリストを返す場合はnilをいれてください。
mode
visitしてファイルをこのフォーマットから変換した後に 呼び出すモード関数です。

関数insert-file-contentsは、その指定したファイルを読み込んだときに、 自動的にファイル・フォーマットを識別します。 この関数は、そのファイルの始めの部分のテキストをフォーマット定義の 正規表現と比較します。このときに一致部分があった場合には、そのフォーマットの 復号化関数を呼び出します。そして再びすべてのフォーマットをチェックします。 この関数は、ファイル・フォーマットが適用できなくなるまでこれを繰り返します。

find-file-noselectあるいはこれを呼び出すコマンド を使ってファイルをvisitするときは、同じように変換を実行します (というのはこの関数はinsert-file-contentsを呼び出すからです)。 またこの関数は、それが復号化したフォーマットに対応するモード関数を 呼び出します。この関数は、バッファローカルな変数buffer-file-format に、フォーマット名のリストを記録します。

Variable: buffer-file-format
この変数は、visitされているファイルのフォーマットを表わしています。 つまりこれは、カレント・バッファにファイルをvisitしたときに、復号化を行なった ファイル・フォーマット名のリストです。 この関数は、すべてのバッファでつねにローカルです。

write-regionを使ってデータをファイルに書き込むとき、 この関数はまず最初に、buffer-file-formatのフォーマット に対する符号化関数を、そのリスト中の順で呼び出します。

Function: format-write-file file format
このコマンドは、カレント・バッファの内容をフォーマットformatで ファイルfileに書き込みます。そして、このバッファが後に保存される 場合に使うために、そのフォーマットがデフォルトであるとします。 引数formatは、フォーマット名のリストです。

Function: format-find-file file format
このコマンドは、fileをvisitしますが、そのときにフォーマット formatにしたがってそのファイルを変換します。 またこのコマンドは、そのバッファが後に保存される場合のために、 formatをそのバッファに対するデフォルトのフォーマットにします。

引数formatはフォーマット名のリストです。formatnil の場合には、変換はされません。このコマンドが対話的に呼ばれた場合には、 formatに対しては単にRETを入力すれば、 値nilが割り当てられます。

Function: format-insert-file file format &optional beg end
このコマンドは、ファイルfileの内容を現在のバッファに 挿入しますが、そのときにフォーマットformatにしたがって変換を行ないます。 begendが非nilの場合には、これはそのファイルの 読み込まれる部分を指定することになります。これはinsert-file-contents と同様です(see section ファイルからの読込み)。

返値はinsert-file-contentsと同様です。すなわち、その絶対ファイル名 と(変換後の)挿入されたデータ長のリストを返します。

引数formatはフォーマット名のリストです。formatnil の場合には、変換はされません。このコマンドが対話的に呼ばれた場合には、 formatに対しては単にRETを入力すれば、 値nilが割り当てられます。

Variable: auto-save-file-format
この変数は、自動セーブのときに使うフォーマットを指定します。 この値は、buffer-file-formatと同様、フォーマット名のリストですが、 自動セーブ・ファイルの書き込み時には、buffer-file-formatの 代わりに使われるリストです。 この変数は、すべてのバッファでつねにローカルです。

ファイルとMSDOS

MS-DOS上のEmacsは、テキストとバイナリ・ファイルを区別して扱います。MS-DOS上 での通常のテキストは、行間で二つの文字シーケンス、 キャリッジ・リターンとラインフィード (CRLF)を使用するため、この区別は必要です。Emacsは、行間に一つの改行文字 (一つのラインフィード)があることだけを期待しています。Emacsが、MS-DOS上で テキスト・ファイルを読む、ないしは書くとき、行のセパレータを変換する 必要があります。 これはEmacsが、どのファイルがテキストで、どのファイルがバイナリかを知る必要 があるということを意味しています。 Emacsは、このバイナリ・ファイルかテキスト・ファイルかという決定を ファイルをvisitしたときに行ない、その決定結果をそのファイルを保存するときに 使うために、変数buffer-file-typeに記録します。

サブプロセスについて関係する特徴については、See section MS-DOSでのサブプロセス

Variable: buffer-file-type
この変数は、自動的にそれぞれのバッファにローカルで、バッファがvisitする ファイルのファイル・タイプを記録します。値は、テキストの場合はnil であり、バイナリの場合はtです。

Function: find-buffer-file-type filename
この関数は、ファイルfilenameがテキスト・ファイルであるかバイナリ ファイルであるかを決定します。テキスト・ファイルの場合はnilを返し、 バイナリ・ファイルの場合はtを返します。

User Option: file-name-buffer-file-type-alist
この変数は、テキスト・ファイルとバイナリ・ファイルを区別するために使うalist を持ちます。 リストの要素はそれぞれ(regexp . type)という形式を持ちます。 regexpは、ファイル名と照合します。 typeは、nilの場合はテキストを、 tの場合はバイナリを意味します。 あるいはtypeは、そのどちらかであるかを判断するための関数が格納されます。 typeが関数の場合は、一つの引数(ファイル名)を 取って呼び出されて、tnilを返すべきです。

User Option: default-buffer-file-type
この変数は、名前からは特に判断がつかないようなファイルに対して デフォルトのタイプを指定します。この値は、テキストの場合にはnil、 バイナリの場合にはtであるべきです。

Command: find-file-text filename
find-fileと同様の機能を持ちますが、そのファイルを名前と無関係に、 テキスト・ファイルとして取り扱います。

Command: find-file-binary filename
find-fileと同様の機能を持ちますが、そのファイルを名前と無関係に、 バイナリ・ファイルとして取り扱います。


Go to the first, previous, next, last section, table of contents.