[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacsでは、ファイルとファイル・ディレクトリに対し、探索する、新規作成する、 ながめる、保存する、などの作業ができます。本章ではEmacs lispのファイル に関係する関数のうちの大部分のものを説明しますが、バッファで説明して いるのもあります。また、バックアップや自動セーブに関連する関数は、 バックアップと自動セーブで説明しています。
ファイル関数の多くは、
引数として一つないしはそれ以上の数のファイル名を取ります。
ファイル名とは、実際には文字列のことです。
これらの関数のほとんどは、expand-file-name
を使ってファイル名を
展開します。これにより相対ファイル名(`../'を含む)を取り扱うように、
`~'を正しく取り扱います。これらの関数は`$HOME'などの環境変数の
置換は行ないません。See section ファイル名を展開する関数。
22.1 ファイルをvisitする | 編集のためにEmacsのバッファにファイルを読み込む | |
22.2 バッファを保存する | ||
22.3 ファイルからの読込み | visitすることなくバッファにファイルを読み込む | |
22.4 ファイルへの書込み | ||
22.5 ファイルのロック | ||
22.6 ファイルについての情報 | ||
22.7 ファイルの名前と属性の変更 | ||
22.8 ファイル名 | ||
22.9 ディレクトリの内容 | ||
22.10 ディレクトリの作成と削除 | ||
22.11 ファイル名を"魔力のあるもの"にする | ||
22.12 ファイル・フォーマットの変換 | ||
22.13 ファイルとMSDOS |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ファイルをvisitするとは、バッファにファイルを読み込むことを意味します。 visitを一度した後は、バッファがそのファイルを visitしている(visiting)といい、 そのファイルを、バッファにより"visitされているファイル"と呼びます。
ファイルとバッファは二つの異なったものです。 ファイルはコンピュータの中に(消さないかぎりは)ずっと記録されている情報です。 一方バッファは、Emacsの内部的な情報であり、Emacsの編集のセッションが 終ったとき(あるいはバッファをkillしたとき)にはなくなってしまうものです。 通常、バッファはあなたがファイルからコピーした情報を持っています。 このとき、そのバッファはファイルをvisitしているといいます。 バッファ中のコピーに対して、あなたは編集のコマンドを使って編集をします。 そのようなバッファに対しての修正は、ファイルには反映されません。 ですから、その変更点をファイルに反映させるには、バッファを保存(save) しなければなりません。それは変更されたバッファの内容を、ファイルにコピー しなおすことを意味します。
ファイルとバッファには以上のような違いがあるのですが、バッファを意味して いるときにファイルのことを言及してみたり、またこの逆の場合があったりとい うことがあります。実際、 "私はバッファを編集していて、すぐに同じ名前をもつファイルとして保存します" という言い方よりはむしろ、"私はファイルを編集しています"という言い方を します。 人は通常この区別を明示的にする必要はありません。しかし、コンピュータ・ プログラム中でファイル、バッファを扱うときは、この区別を念頭に置くとよい でしょう。
22.1.1 ファイルをvisitするための関数 | ||
22.1.2 visitのためのサブルーチン | そのインタフェース関数が使用する、低レベル関数 |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
本節では、ファイルをvisitするのに通常使われる関数について説明します。 歴史的な理由により、これらの関数は`visit-'で始まる名前ではなく、 `find-'で始まる名前を持ちます。バッファがvisitしているファイルの名前に アクセスする、あるいは、ファイルの名前から存在するバッファをみつける関数と 変数についてはSee section バッファ・ファイル名。
Lispプログラムで、ファイルの中身は見たいが、変更はしたくない場合、
最も手っ取り早い方法は、一時バッファでinsert-file-contents
を
使うことです。ファイルをvisitする必要はなく、visitする方が時間もかかります。
See section ファイルからの読込み。
このコマンドは、ファイルfilenameをvisitするバッファを選択します。 これは、そのようなバッファがある場合には、それを使用し、 もしなければ新しいバッファを作り、そのファイルを読み込みます。 またこのコマンドは、そのバッファを返値として返します。
find-file
の本体はとても単純で、以下のようになっています。
(switch-to-buffer (find-file-noselect filename)) |
(ウィンドウ内でのバッファの表示のswitch-to-buffer
を参照。)
find-file
が対話的に呼ばれたときは、ミニバッファにおいて
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> |
このコマンドはファイルfilenameをvisitするバッファを選択しますが、 現在選択されているウィンドウ以外のウィンドウ内で選択します。 このコマンドは、ほかの存在するウィンドウを使用するかもしれませんし、一つの ウィンドウを分割するかもしれません。ウィンドウ内でのバッファの表示を参照のこと。
このコマンドが対話的に呼ばれた場合、filenameの入力をユーザに促します。
このコマンドは、find-file
と同様、ファイルfilenameをvisit
するバッファを選択しますが、この関数はバッファを読出し専用とします。
関連する関数および変数は、See section 読みだし専用バッファ。
このコマンドが対話的に呼ばれた場合、filenameの入力をユーザに促します。
このコマンドはViewモードでfilenameをvisitし、このコマンドの終了後には、
前に存在したバッファに戻るように、再帰編集の状態でファイルを表示
します。Viewモードはファイルをざっと眺めるためのモードで、
編集はさせません。Viewモードに入ると、正規フックview-mode-hook
を起動します。See section フック。
view-file
が対話的に呼ばれた場合、filenameの入力をユーザに
促します。
この変数の値は、ファイルがvisitされたあとに呼ばれる関数のリストです。 (もしあるなら)ファイルのローカル変数の仕様は、フックを走らせる前に 処理されます。このフック関数が起動されるとき、ファイルをvisitしている バッファが、カレント・バッファです。
この変数は、正規フックのように動作しますが、しかしこの変数名を変えてしまう のは、おすすめできません。
この変数の値は、find-file
ないしはfind-file-noselect
が
存在しないファイルに対して呼ばれたとき、呼び出される関数のリストです。
find-file-noselect
は、ファイルが存在しないことを確認すると、
すぐにこれらの関数を呼び出します。この関数は、リストの要素を、
順に非nil
を返す関数があるまで呼ばれます。buffer-file-name
は、
すでに設定されています。
関数の返値が使用され、その関数すべてが呼び出されないかもしれないので、 これは正規フックではありません。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
find-file-noselect
関数は、create-file-buffer
と
after-find-file
関数をサブルーチンとして使います。
それらを直接的に呼び出すことは、時には便利な場合もあります。
この関数は、filenameをvisitするために、適切に名づけられたバッファを 作成し、そのバッファを返値として返します。 この関数は、前にバッファ名として使われたものでないなら、 (ディレクトリ部分なしで)filenameをそのままバッファの名前として 使用します。 そうでなければ、`<2>'のような文字列をくっつけて、前に使用されていない 名前を作り出します。バッファの生成も参照のこと。
注意:
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 バッファの生成)
この関数は、バッファの主モードを設定し、ローカル変数を構文解析します
(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
中のすべての関数を
呼び出します。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
あなたがEmacsでファイルを編集しているときは、実際は、そのファイルをvisit しているバッファに対して作業を行っています。すなわち、そのファイルの中味が バッファにコピーされ、そのコピーに対して編集作業をしているのです。 そのバッファの内容に対する変更は、あなたがバッファを保存(save)するまで 実際のファイルに反映されません。この保存というのは、バッファの内容を ファイルに対してコピーするということです。
この関数は、カレント・バッファの内容が、最後にvisitあるいは保存されてから 修正されている場合に、そのバッファの内容をvisitされているファイルに 保存します。そうでない場合はなにもしません。
save-buffer
は、バックアップ・ファイルの作成に関して責任を持ちます。
通常、backup-optionはnil
であり、ファイルをvisitしてから
最初に保存するときのみ、save-buffer
はバックアップ・ファイルを作成します。
backup-optionにほかの値を与えた場合、
それはほかの状態でバックアップ・ファイルの作成をするよう要求したことに
なります。
save-buffer
関数は、そのバッファが次に
保存されたときに、ファイルのこのバージョンのバックアップをとるように記録します。
このコマンドはファイルをvisitしているバッファで修正されたものの複数のもの
を対象にして保存を行ないます。通常、このコマンドはユーザに対し、
それぞれのバッファに対して確認を求めます。しかし、save-silently-pが
非nil
である場合には、ファイルをvisitしているすべてのバッファを、
ユーザに確認をせず保存します。
オプションのexiting引数は、非nil
の場合、ファイルをvisit
していないほかのバッファも保存するように、この関数に要求します。
これらの対象となるバッファは、buffer-offer-save
の値として、
非nil
であるローカル値をもつバッファです(これらの対象バッファに対して、
保存するかどうかの質問にyesと答えた場合、ファイル名を
聞かれます)。save-buffers-kill-emacs
関数は、この引数に対して
非nil
の値を渡します。
Emacsは、バッファでこの変数が非nil
のとき、そのバッファがファイルを
visitしていない場合でも、Emacs終了時に保存をするような機能を提供します。
この変数は、自動的にすべてのバッファでローカルな変数です。通常、Mail
モード(送信するメールを編集するのに使われます)ではこの変数をt
に
設定します。
この関数は、カレント・バッファをファイルfilenameに書き込み、
バッファがそのファイルをvisitしているものと設定し、そのバッファを修正がない
ものとして記録します。
そのとき、バッファの名前を唯一なものにする必要があれば、
バッファの名前をfilenameをベースとして、`<2>'などの文字列を
あとに付加して名前を変えます。
この関数は、この作業の大部分を
set-visited-file-name
、save-buffer
を呼び出して行ないます。
この変数の値は、バッファの内容をvisitされているファイルに書き込む前に
呼び出される関数のリストです。そのリストの要素の一つが、非nil
を
返した場合、そのファイルをすでに書込みがされたものとして扱い、
リストの残りの要素は呼び出さず、またファイル書込みのために
通常使われるコードは実行しません。
write-file-hooks
中の関数が非nil
を返した場合、
その関数はバックアップ・ファイルの作成に(もしそれが適切なものならば)
責任を持ちます。これを実行するために、以下のコードを実行してください。
(or buffer-backed-up (backup-buffer)) |
あなたはbackup-buffer
が返すファイル・モードの値を保存したいかも
しれません。そして、あなたが書き込むファイルに対し、モード・ビットを
設定するために、それを使いたいかもしれません。これはsave-buffer
が
通常行っていることです。
これは正規フックではないのですが、このリストを取り扱うのに
add-hook
とremove-hook
を使うことができます。See section フック。
これはちょうどwrite-file-hooks
のように働きます。
しかしこれは特定のバッファにローカルなことをさせるためのフックです。
バッファローカルなことをするのにwrite-file-hooks
を使うのは
よい考えではありません。その代わりにこの変数を使ってください。
この変数はつねにバッファローカルなものですので、 主モードを変えても、バッファローカルな値は変わりません。 この変数は、特別な方法で"ファイル"の中味を読み込み、 それに対応する方法でそのデータを保存するためのフックをセットするような パッケージにとって便利です。
これはちょうどwrite-file-hooks
のように働きます。
しかしこのフックは、ファイルがどういう属性のものかということに関係するフック
に対応させて、ファイルの中身に関係するものとして使われることを意識された
フックです。
このようなフックは、通常主モードが設定を行ない、バッファローカルな
束縛をします。
新しい主モードに変わるときは、つねにこの変数をリセットします。
この正規フックは、バッファの内容がそのvisitされているファイルに保存 されたあとに起動されるフックです。
この変数が非nil
の場合、save-buffer
は、そのファイルがもつことに
なっていた名前の代わりに一時的な新しい名前で保存し、そしてエラーがないこと
がわかった後に、予定していた名前にそのファイルの名前替えをする、という処理の
間に発生するI/Oエラーからファイルを保護します。
この手続きは、不適切なファイルで、ディスク空間が不足するような場合に
発生する問題点を回避します。
副作用として、バックアップは必ずコピーで実行されます。See section バックアップの手段は名前の変更?それともコピー?。 また同時に、貴重なファイルを保存することは、その保存する ファイルとそのほかの別名の間のハードリンクをつねに壊すことになります。
いくつかのモードは、この変数に対して特定のバッファでローカルに 非nilを設定します。
この変数は、改行でファイルが終わらないように
ファイルを書き込むかどうかを決めるものです。
もし変数の値がt
ならば、save-buffer
は保存されるバッファが
そのときに改行で終わってないときは、常にそのファイルの終わりに改行を確認なしに
加えます。
save-buffer
は、もしこの変数の値が非nil
であるが
t
でない場合、改行を加えるような場合が発生するごとに、
ユーザに確認を求めます。
もしその変数の値がnil
ならば、save-buffer
は改行
を全く加えません。nil
がこの変数に対するデフォルトの値ですが、
主モードの中には、特定のバッファでt
を設定するものもあります。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
insert-file-contents
関数を使って、ディスクからファイルをコピーし、
バッファのなかにそのファイルを挿入することができます。ユーザレベル・コマンド
insert-file
は、内部で印づけをするため、Lispプログラムの中では
使用してはいけません。
この関数は、カレント・バッファのポイントの後にファイル filenameの内容を挿入します。 この関数は、そのファイルの絶対ファイル名と、 挿入されたデータ長のリストを返します。filenameが読み出すことのできる ファイルの名前でない場合は、エラーを発生します。
関数insert-file-contents
は、このファイルの内容に対して、
定義されたファイル・フォーマットでチェックを行ないます。
それが適切ならば、ファイルの内容を変換します。
See section ファイル・フォーマットの変換。
またこの関数は、リストafter-insert-file-functions
の関数を
呼び出します。テキスト属性をファイルへセーブするを参照のこと。
もしvisitが非nil
ならば、この関数はさらに、バッファを修正が
ないものとしてマークし、バッファ中のさまざまなフィールドをセットして、
ファイルfilenameをvisitしているように設定します。これらのフィールドと
しては、バッファのvisitされているファイル名、最後に保存されたときの
ファイルの修正時間などの情報があります。この特徴は、find-file-noselect
が使用し、ほとんどの場合においては、ユーザ自身からは使用すべきではありません。
もしbegとendが非nil
ならば、これらは、挿入されるファイル
の部分を決める整数です。この場合、visitはnil
でなけ
ればなりません。たとえば、
(insert-file-contents filename nil 0 500) |
はファイルの最初の500文字を挿入します。
もし引数replaceが非nil
ならば、バッファの内容(実際はアクセス
可能な部分のみ)をファイルの内容で置き換えることを意味します。
これは、単純にバッファの内容を削除し、ファイルの全内容を挿入する、という
方法よりよい方法です。というのはこの関数は、
(1)いくつかのマーカの位置を保存する、
(2)undoリストに入るデータの量が少ない、
という利点があるからです。
もしほかのプログラムがそのファイルを読むことができるように、ほかのプロセスに
ファイル名を渡したいならば、関数file-local-copy
を使用してください。
ファイル名を"魔力のあるもの"にするを参照のこと。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
append-to-file
とwrite-region
関数を使用して、
バッファの内容全部ないしは一部を、直接ディスク上のファイルとして
書き込むことができます。
これらの関数を、現在visitしているファイルに書込みを行なうのに
使用してはいけません。使用した場合、visitのメカニズムに混乱を引き起こす
可能性があります。
この関数は、カレント・バッファ中のstartとendで囲まれたリージョンの
内容を、filenameの終わりに追加書き込みします。もしそのようなファイルが
存在しない場合、新規に作成されます。この関数はnil
を返します。
もしfilenameが、書き込み可能でないファイル、ないしは ファイル作成ができないディレクトリの中の存在しないファイルをさしていた場合、 エラーを発生します。
この関数は、カレント・バッファのstartとendで囲まれたリージョンを、 filenameで指定されたファイルに書き込みます。
もしstartが文字列ならば、write-region
はバッファからの
テキストでなく、その文字列自身を書き込み、ないしは追加書き込みします。
もしapeendが非nil
ならば、その指定されたテキストは
(もしあるならば)存在するファイルの内容に追加書き込みされます。
もしvisitがt
ならば、Emacsはバッファとファイルとの間に
関連性を確立します。そのときこのバッファは、そのファイルをvisitしている
ことになります。
この関数はまた、filenameの修正時刻に、カレント・バッファの
最後のファイル修正の時刻をセットします。
そしてそのバッファが修正がないものとして記録します。
この特徴はsave-buffer
が使用しますが、
ユーザはほとんどの場合この特徴を使用すべきではありません。
もしvisitが文字列ならば、これはvisitするファイル名を指定します。
これにより、データをあるファイル(filename)に書き込み、
一方でバッファは、別のファイル(visit)をvisitしているとして
記録することができます。
引数visitはエコー領域メッセージに使用され、またファイル・ロックの
ためも使われます。
visitはbuffer-file-name
に記録されます。
この特徴は、file-precious-flag
を実装するのに使用されます。
ユーザは本当に自分が何をしているのかが知りたいのでなければ、
この特徴は使用してはいけません。
関数write-region
は、buffer-file-format
で指定されている
場合に、適切なファイル・フォーマットにそのデータを変換します。
See section ファイル・フォーマットの変換。
またこの関数は、リストwrite-region-annotate-functions
の関数を
呼び出します。テキスト属性をファイルへセーブするを参照のこと。
通常、write-region
は、メッセージ`Wrote file filename'を
エコー領域に表示します。
もし、visitがt
あるいはnil
あるいは文字列のどれでも
ないならば、このメッセージの表示はされません。
この特徴は、内部の目的のためで、ユーザがそれについて知る必要が
ないようなファイルを使うプログラムを作成する場合に便利です。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
二人のユーザが同時に同じファイルを編集する場合、お互いに干渉してしまう 可能性があります。 Emacsは、ファイルが修正されているときに、 ファイル・ロック(file lock)を記録して、 このような状況が発生するのを回避しようとします。 これによりEmacsは、ほかのEmacsジョブによりロックされているファイルが バッファにvisitされて修正されようとするのを、 その最初の時点で検出することができ、ユーザにどのようにするか確認を求めます。
ファイル・ロックは、NFSのように、複数のマシンがファイル・システムを 共有している場合には正しく機能しません。 おそらく将来にはよりよいファイル・ロック・システムが実装されることでしょう。 ファイル・ロックが機能しないときには、二人のユーザにより、同時に一つの ファイルを修正をすることは可能にはなってしまうのですが、 Emacsはこの場合も、2番目に保存をしようとするユーザに注意を促します。 また、そのファイルがディスク上で変更されている場合に、その元ファイルを visitしているバッファが修正されているのを検出する機構は、 同時編集のケースを発見することができる場合があります。 変更時間の比較を参照。
この関数は、ファイルfilenameがこのEmacsプロセスによりロックされて
いない場合にはnil
を返します。
このEmacsによってロックされている場合は、t
を返し、
ほかのユーザによってロックされている場合には、そのユーザの名前を返します。
(file-locked-p "foo") ⇒ nil |
この関数は、カレント・バッファが修正されている場合には、 ファイルfilenameを ロックします。この引数filenameは、カレント・バッファのvisitしている ファイルがデフォルトです。もしカレント・バッファが、ファイルを visitしていない、あるいは修正がない場合には、なにもしません。
この関数は、カレント・バッファが修正されている場合に、そのバッファでvisitして いるファイルをアンロックします。バッファが修正されていない場合には、 その対応するファイルはロックされるべきではないので、 この関数はなにもしません。 カレント・バッファがファイルをvisitしていない場合もなにもしません。
この関数は、ユーザがfileを修正しようとしたが、ほかのother-user という名前の別のユーザによりロックされている場合に呼ばれます。 この関数が返す値により、次に何が起こるかが決まります。
t
の場合、ファイルのロックを獲得したということを意味します。
このとき、このユーザはファイルを編集するかもしれません。
other-userはロックを失います。
nil
の場合、ロックを無視し、このユーザにそのファイルを
何らかの方法で編集させる、ということを意味します。
file-locked
エラーを発生するかもしれません。
この場合は、ユーザがそれまでにしようとした変更は実行されません。
このエラーの場合のエラー・メッセージは以下のようになります。
error--> File is locked: file other-user |
ここで、fileはファイルの名前であり、other-userは、 そのファイルをロックしているユーザ名です。
この関数のデフォルトの定義は、ユーザに何をするかについての選択を
促すことです。よって望むならば、ask-user-about-lock
を、
あなた自身が作成したほかの決定をするバージョンのもので置き換える
こともできます。この関数の通常の定義のコードは、
`userlock.el'に記述されています。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
この節で説明する関数はすべて、ファイル名を表す文字列に対して作用します。 これらの関数の名前はみな単語`file'で始まります。 これらの関数はすべて、実在するファイルあるいはディレクトリについての 情報を返します。 よって、これらの関数に対する引数は、ほかに注釈がなければ、 すべて実在するファイルあるいはディレクトリでなければなりません。
22.6.1 アクセス可能性をテストする | ||
22.6.2 ファイルの種類の区別 | ||
22.6.3 実名 | ||
22.6.4 ファイルに関するそのほかの情報 |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
これらの関数は特定の方法でファイル・アクセスのパーミッションを検査します。
この関数は、filenameの名前のファイルが存在するように見えるとき、
t
を返します。これは、そのファイルがあなたにとって可読であることを
必ずしも意味しておらず、ファイルに付随する属性を参照することができる、と
いうだけです(Unixでは、ファイルが存在し、かつ、そのファイル自身のプロテ
クションに関係なく、あなたがそのファイルが含まれるディレクトリに対して
実行権をもっている場合には、これは正しいです)。
そのファイルが存在しない場合、あるいはアクセス制御が厳しく、
ファイルの属性を参照できないようになっている場合は、この関数はnil
を返します。
この関数は、filenameの名前をもつファイルが存在し、かつあなたが可読の
場合にはt
を返します。それ以外の場合、nil
を返します。
(file-readable-p "files.texi") ⇒ t (file-exists-p "/usr/spool/mqueue") ⇒ t (file-readable-p "/usr/spool/mqueue") ⇒ nil |
この関数は、filenameの名前をもつファイルが存在し、かつ実行可能ならば、
t
を返します。それ以外の場合はnil
を返します。
そのファイルがディレクトリの場合で、実行パーミッションがあるということは、
そのディレクトリの中にあるファイルの存在と属性を確認することができ、
そのファイル自身は、ファイル・モードが許していれば、
オープンできるということを意味しています。
この関数は、ファイルfilenameが書き込みができる、ないしは新規作成が
できるならば、t
を返し、それ以外はnil
を返します。
そのファイルは存在し、かつ書き込みができるならば、ファイルは書き込み可能です。
ファイルは存在しないが、指定したディレクトリは存在し、
かつそのディレクトリに書き込み可能ならば、ファイルは作成可能です。
以下の3番目の例の場合、`foo'は、親ディレクトリが存在しないために、 ユーザはそのディレクトリを作ることはできるかもしれませんが、 書き込み可能ではありません。
(file-writable-p "~/foo") ⇒ t (file-writable-p "/foo") ⇒ nil (file-writable-p "~/no-such-dir/foo") ⇒ nil |
この関数は、ファイル名としてdirnameの名前をもつディレクトリの中の
実在するファイルに対し、あなたがオープンできるパーミッションをもつ場合、
t
を返します。それ以外の場合(あるいはそのようなディレクトリが存在
しない場合)、nil
を返します。dirnameの値は、ディレクトリ名
ないしはディレクトリのファイル名のどちらかであるかもしれません。
例:以下の実行結果のもとで、
(file-accessible-directory-p "/foo") ⇒ nil |
`/foo/'の中にあるファイルをどのように読み込もうとしても エラーになります。
この関数は、ファイルfilenameを削除して次に新しく作成するときに、
ファイルの所有者が変わらない場合は、t
を返します。
この関数は、ファイル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 ファイルに関するそのほかの情報。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
この節は、さまざまな種類のファイルをどのように区別するかについて説明します。 そのファイルとは、ディレクトリ、シンボリック・リンク、通常ファイルです。
ファイルfilenameがシンボリック・リンクの場合、file-symlink-p
関数は、リンク元のファイル名を返します。
これはテキスト・ファイル名か、ディレクトリか、あるいはまたほかのシンボリック・リンクの名前かもしれませんし、あるいは存在しないファイル名かもしれません。
ファイルfilenameがシンボリック・リンクでない(あるいはそのような
ファイルがない)時には、file-symlink-p
はnil
を返します。
(file-symlink-p "foo") ⇒ nil (file-symlink-p "sym-link") ⇒ "foo" (file-symlink-p "sym-link2") ⇒ "sym-link" (file-symlink-p "/bin") ⇒ "/pub/bin" |
この関数は、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 |
この関数は、ファイルfilenameが存在し、かつ正規のファイル(ディレクトリ、
シンボリック・リンク、名前つきパイプ、端末、そのほかのI/Oデバイス、の
いずれでもないもの)である場合には、t
を返します。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ファイルの実名(truename)は、シンボリック・リンクを なくなるまでたどり、`.', `..'の要素を展開した結果得られる名前です。厳密には、ファイルはただ一つ の実名をもつとはかぎりません。つまり、あるファイルがもつ別個の実名の数は、 そのファイルに対するハード・リンクの数と同じです。しかし実名は、名前の つけ方の多様性を生む原因となるシンボリック・リンクを取り除くので、 便利なものです。
関数file-truename
は、ファイルfilenameの実名を返します。
これはシンボリック・リンクを、それがなくなるまでたどることにより
得られる名前です。引数は絶対ファイル名でなければなりません。
関連する情報は See section バッファ・ファイル名。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
この節では、ファイルの内容以外の詳細な情報を得るための関数について 説明します。この情報とは、アクセス・パーミッションを制御するモード・ビット、 所有者およびグループ番号、名前の数、inode数、サイズ、アクセス時間、 修正時間、などです。
この関数は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 |
この関数はファイル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 |
この関数はファイルfilenameの属性をリストとして返します。
指定されたファイルがオープンできない場合は、nil
を返します。
返値のリストの要素は、以下に示す順序になります。
t
を、シンボリック・リンクに対しては文字列
(リンク元の名前)を、あるいはテキスト・ファイルに対してはnil
を
返します。
add-name-to-file
関数を使って生成できます。
(see section ファイルの名前と属性の変更)
current-time
の値に似た書式です。1日の時刻を参照)
t
を返します。それ以外はnil
を返します。
例として、ここに`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というファイル・システムの番号です。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
この節で説明する関数は、ファイルに対し、名前の変更、コピー、削除、 リンク、モードの設定を行ないます。
newnameを引数としてもつ関数は、この名前をもつファイルが すでに存在する場合に、引数ok-if-already-existsの値に 依存して、とられる動作が決まります。
nil
の場合は、
file-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では、一つのファイルが複数の名前を もつことは許されません。
ファイルに関するそのほかの情報のfile-nlinks
も参照のこと。
このコマンドはファイルfilenameの名前をnewnameに変えます。
filenameがfilename以外の別名をもつ場合、このファイルは、
それらの名前を引き続き持ちます。事実、add-name-to-file
を使って名前
newnameを加え、filenameを消去するというのは、一時的に中間的な
状態をもつことを除けば、名前替えと同じことをしていることになります。
この関数が対話的に呼ばれた場合には、ミニバッファにfilenameと newnameの入力を促します。また、newnameがすでに存在した 場合には確認を求めます。
このコマンドはファイルoldnameをnewnameにコピーします。 oldnameが存在しない場合には、エラーを発生します。
timeが非nil
の場合、この関数は、新しいファイルに対し、古い
ファイルが持っていたものと同じ最終修正時間を与えます
(これはいくつかのオペレーティングシステムでのみ機能します)。
この関数が対話的に呼び出された場合、ミニバッファに、filenameと newnameの入力を促します。また、newnameがすでに存在する 場合には、確認を求めます。
このコマンドは、シェル・コマンド`rm filename'と同じように、 ファイルfilenameを削除します。そのファイルが複数の名前を持っている 場合、それはその別名で存在し続けます。
ファイルが存在しない、ないしは削除可能でない場合には、適切な種類の
file-error
エラーを発生させます(UNIXの場合、ディレクトリが
書き込み可能であれば、ファイルは削除可能です)。
ディレクトリの作成と削除のdelete-directory
も参照のこと。
ok-if-already-exists このコマンドは、filenameに対し、名前newnameのシンボリック・リンク を作成します。これは、シェル・コマンド`ln -s filename newname' と同様です。
この関数は、対話的に呼び出された場合、ミニバッファでfilenameと newnameの入力を促します。またnewnameがすでに存在する場合には、 確認を求めます。
この関数は、値stringをもつような論理名nameを定義します。 この関数はVMSでのみ利用可能です。
この関数はfilenameのモード・ビットをmodeに設定します (これは整数でなければなりません)。 modeの下位12ビットのみが 使用されます。
この関数は、Emacsおよびそのサブプロセスによって新規に作成されるファイルの、 デフォルトのファイル・プロテクションを設定します。 Emacsで作成されるファイルは、 すべて初期状態ではこのプロテクションを持ちます。 UNIXでは、デフォルト・プロテクションは、"umask"値のビットごとの補完値です。
引数modeは整数でなければなりません。modeの下位9ビットのみが 使用されます。
実在するファイルを修正して保存する場合は、ファイルを作成したこととは 解釈されません。この場合はファイルのモードは変化せず、デフォルトの ファイル・プロテクションは使われません。
この関数は現在のデフォルトのプロテクション値を返します。
MS-DOSでは、"実行可能"を表わすようなファイル・モード・ビットはありません。
よってEmacsは、ファイル名が`.com'、`.bat'、`.exe'
で終わる場合に、実行可能であると解釈します。
これは、file-mode
およびfile-attributes
が返す値に反映されます。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ファイルは、一般的には、Emacs内部ではどこでもその名前によって参照されます。 Emacsではファイル名は、文字列で表現されます。ファイルに対して機能する ような関数はすべて、ファイル名を引数に取ることを期待します。
ファイル自身に作用するのに加え、Emacs Lispプログラムは、その名前自体に 作用する必要があるときがあります。つまり、もとのファイル名に関係するような ファイル名を作成するために、名前を分割し、その名前の部分を使うためにです。 本節では、ファイル名をどのように操作するかについて説明します。
この節で説明する関数は、実際のファイルにはアクセスしないので、 実在しないファイルないしはディレクトリを示すようなファイル名 に対しても機能させることができます。
VMSでは、すべてのこれらの関数は、VMSファイル名構文とUNIX構文の両方を 理解します。これは、すべての標準Lispライブラリが、UNIX構文でファイル名を 指定しており、そのコードの変更なしに、VMSで適正に動作させるためです。 MS-DOSでは、これらの関数はUNIX構文と同様に、MS-DOSファイル名構文を理解します。
22.8.1 ファイル名の構成要素 | ||
22.8.2 ディレクトリ名 | ||
22.8.3 絶対ファイル名と相対ファイル名 | ||
相対的な名前である場合があります。 | ||
---|---|---|
22.8.4 ファイル名を展開する関数 | ||
22.8.5 唯一存在するファイル名を生成する | ||
22.8.6 ファイル名補完 |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
オペレーティングシステムは、ディレクトリに含まれるファイルをグループ化 します。あるファイルを指定するには、ディレクトリとそのディレクトリ内での ファイル名を指定する必要があります。よってEmacsは、ファイル名を二つの主要な 部分をもつものとして解釈します。それはディレクトリ名(directory name) 部分と、非ディレクトリ(nondirectory)部分 (すなわち そのディレクトリ内部でのファイル名(file name within the directory)) です。どちらかの部分が空であるかもしれません。 これら二つの部分をつなげると、オリジナルのファイル名が再度作り出せます。
Unixでは、ディレクトリ部分とは、ファイル名の最初から最後のスラッシュ までの部分です。非ディレクトリ部分はその残りの部分です。 VMSの構文でのこの規則は複雑です。
いくつかの目的のために、非ディレクトリ部分は、さらに厳密な意味での 名前とバージョン番号(version number)に分割されます。 Unixでは、バックアップ・ファイル のみが名前の中にバージョン番号を持ちます。VMSでは、すべてのファイルが バージョン番号を持ちますが、ファイル名がEmacsで実際に使われる時間の内の ほとんどは、そのバージョン番号を省略します。 バージョン番号は、ほとんどの場合ディレクトリ・リストの中でみられます。
この関数は、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]" |
この関数はfilenameの非ディレクトリ部分を返します。
(file-name-nondirectory "lewis/foo") ⇒ "foo" (file-name-nondirectory "foo") ⇒ "foo" ;; 以下は、VMSの場合の例です。 (file-name-nondirectory "[X]FOO.TMP") ⇒ "FOO.TMP" |
この関数は、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" |
この関数は、filenameから(存在すれば)"拡張子"を除いたものを返します。 ファイル名中の拡張子とは、名前の最後の要素であり、最後の`.'から 始まる部分です。例を示します。
(file-name-sans-extension "foo.lose.c") ⇒ "foo.lose" (file-name-sans-extension "big.hack/foo") ⇒ "big.hack/foo" |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ディレクトリ名(directory name)は、ディレクトリの名前です。 ディレクトリはファイルの 一種であり、ファイル名を持ちディレクトリ名と関係がありますが、同一のも のではありません(これは、通常のUnixでの用語法では、全く別のものです)。 同じ実体のものに対するこの二つの異なった名前は、構文的な変換によって 関連づけることができます。Unixでは、この変換は単純なものです。 ディレクトリ名はスラッシュで終わます。 一方のディレクトリのファイル名はそのスラッシュがありません。 VMSでは、この関係はより複雑です。
ディレクトリ名と、ディレクトリのファイル名の相違点は、微細な点ですが、 重要です。Emacs変数ないしは関数の引数が、ディレクトリ名として表わされて いる場合には、ディレクトリのファイル名は許されません。
以下の二つの関数は、ディレクトリ名とファイル名の間で変換をします。 これらの関数は、`$HOME'のような環境変数の置き換え、 `~'、`..'の展開、などの特別なことはしません。
この関数は、オペレーティングシステムがディレクトリの名前として 解釈できるような形式で、filenameを表現する文字列を返します。 Unixでは、これはそのファイル名を表す文字列の最後にスラッシュを つけ加えることを意味します。 VMSでは、この関数は、形式`[X]Y.DIR.1'の文字列を、形式`[X.Y]' の文字列に変換します。
(file-name-as-directory "~rms/lewis") ⇒ "~rms/lewis/" |
この関数は、オペレーティングシステムがファイルの名前として解釈できる ような形式で、dirnameを表現する文字列を返します。 Unixでは、これはそのディレクトリを表す文字列から最後のスラッシュを 取り除くことを意味します。 VMSでは、この関数は、形式`[X.Y]'の文字列を、形式`[X]Y.DIR.1' の文字列に変換します。
(directory-file-name "~lewis/") ⇒ "~lewis" |
ディレクトリ名の省略形は、通常シンボリック・リンクを介してアクセスされるような ディレクトリに対して有用です。 ユーザはまず最初に、リンク名をディレクトリの"名前"として認識し、 それからディレクトリの"本当の"名前をみつけるのにやっかいなのを 発見するのです。 リンク名を本物の名前に対する省略形として定義すれば、Emacsは代わりに、 この省略形をユーザにみせます。
変数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")) |
ディレクトリ名を省略形に変換する場合は、次の関数を使用してください。
この関数は、引数にdirectory-abbrev-alist
の要素からの省略形を適用し、
ユーザのホーム・ディレクトリを`~'に置換します。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ファイル・システムの中にあるすべてのディレクトリは、ルート・ディレクトリ からはじまる木構造を形成しています。あるファイル名というものは、この木の ルートからはじまるディレクトリ名のすべてを指定できます。この場合、これは 絶対(absolute)ファイル名と呼ばれます。 あるいは、あるファイル名は、デフォルト・ディレクトリに対して相対的に、 その木の中でのファイルの位置を、指定できます。 これは相対(relative)ファイル名と呼ばれます。 Unixでは、絶対ファイル名はスラッシュないしはチルダ(`~')で始まる名前で、 相対ファイル名はそうではありません。VMSでのこの規則は複雑です。
この関数は、ファイル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 |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ファイル名の展開(expansion)とは、 相対ファイル名を絶対ファイル名に変換することを意味します。 これはデフォルト・ディレクトリに対して相対的に変換されるので、 展開対象となるファイル名と同様、デフォルト・ディレクトリを指定しなければ なりません。また展開は、`./'、`name/../'などの冗長なものを ファイル名から取り除いて簡単にします。
この関数は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
だけです。
この関数は、展開の逆のことをします。ファイル名がdirectoryに対して 相対的に解釈されたとき、filenameと等価な相対ファイル名を返そう とします(もしそのような相対ファイル名が絶対ファイル名より長ければ、 この関数は代わりに絶対名を返します)。
(file-relative-name "/foo/bar" "/foo/") ⇒ "bar") (file-relative-name "/foo/bar" "/hack/") ⇒ "/foo/bar") |
このバッファローカルな変数の値は、 カレント・バッファのデフォルト・ディレクトリです。 これは絶対ディレクトリ名であるべきです。これは`~'で始まっているかも しれません。この変数は、すべてのバッファでローカルな変数です。
expand-file-name
は、
2番目の引数がnil
のとき、このデフォルト・ディレクトリを使います。
Unixシステムでは、この値は、つねにスラッシュで終わる文字列です。
default-directory ⇒ "/user/lewis/manual/" |
この関数はfilename中で参照される環境変数を、環境変数の値で置換します。 標準のUnixのシェル構文では、`$'は環境変数の値を置き換えるための 接頭辞です。
環境変数の名前は、`$'に続く、英数字(_を含む)の列です。 `$'に続く文字が`{'である場合、それに対応する`}'までの すべてが変数名です。
ここで、ユーザのホーム・ディレクトリを表わす環境変数HOME
が、
(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では、この関数は、 上に示したような不必要な最初の要素の除去以外の操作は、なにもしません。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
プログラムでは、一時的なファイルを作成する必要がある場合があります。 ここでは、そのようなファイルの名前をつくるために通常使われる手法を 説明します。
(make-temp-name (concat "/tmp/" name-of-application)) |
ここではディレクトリは`/tmp/'を使用します。というのは、これはUnixでは、
一時ファイルを作成するのには標準の場所だからです。
make-temp-name
の仕事は、二人の異なるユーザ、ないしは二つの異なる
ジョブが、同じファイル名を使うのを回避することです。
この関数は唯一の名前として使うことができる文字列を生成します。 その名前はstringで始まり、それぞれのEmacsジョブで異なるような数値で 終わります。
(make-temp-name "/tmp/foo") ⇒ "/tmp/foo021304" |
同一のEmacs上で動作する別のライブラリの間で、ファイル名が衝突するのを
避けるために、make-temp-name
を使うEmacs lispプログラムは、すべて自身
のstringをもつべきです。名前の最後に加えられる数字は、別のEmacsの
ジョブで動作する同一のアプリケーションを区別します。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
この節ではファイル名を補完するための低レベルのサブルーチンについて 説明します。ほかの補完関数は、補完を参照のこと。
この関数は、ディレクトリ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") |
この関数はディレクトリ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 |
file-name-completion
は、通常このリストにある文字列で終わるような
ファイル名はすべて無視します。
可能な補完候補の最後の部分が、すべてこれらの接尾辞のどれかである場合、
または、すべての補完候補を示すためのバッファが表示される場合は、
無視しません。
典型的な値はこのようなものかもしれません。
completion-ignored-extensions ⇒ (".o" ".elc" "~" ".dvi") |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ディレクトリは一種のファイルで、さまざまな名前を持ったほかのファイルを 含んでいます。ディレクトリは、ファイル・システムを特徴づけるものの一つです。
Emacsは、ディレクトリ中のファイルの名前を、Lispのリストとしてリスト
アップすることができます。あるいは、ls
シェル・コマンドを使用して、
バッファにその名前を表示することができます。
後者の場合では、ls
コマンドに渡すオプションに応じて、
それぞれのファイルについての情報を選択的に表示することができます。
この関数は、ディレクトリ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が、読み出すことのできるディレクトリの名前でない場合には、 エラーを発生します。
この関数は、ディレクトリdirnameにある、fileという名前の ファイルのすべてのバージョンのリストを返します。
この関数は、ディレクトリfile中のファイル・リストを(カレント・バッファに)
挿入します。これは、switchesつきのls
でフォーマットした
ものです。この関数により、ポイントは挿入されたテキストの後に移動します。
引数fileは、ディレクトリ名か、ワイルドカードを含むような
ファイル仕様であるかもしれません。wildcardが非nil
の場合、
これは、fileをワイルドカードを含むファイル仕様として取り扱う
ことを意味します。
full-directory-pが非nil
の場合、これはfileがディレクトリで、
スイッチが`-d'を含まないということを意味します。そしてこの場合の
リストは、ディレクトリ中のすべての内容を表示すべきです
(ls
の`-d'オプションは、ディレクトリの内容ではなく、
ディレクトリ自身の情報を表示することを意味します)。
この関数は、ディレクトリのリストを作るために、
変数insert-directory-program
で示される名前のプログラムを起動します。
またwildcardが非nil
の場合、ワイルドカードを展開するために、
shell-file-name
で指定されるシェルもまた同様に起動します。
この変数の値は、関数insert-directory
が、あるディレクトリ中の
ファイルのリストをつくるために起動するプログラムです。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs Lispでのたいていのファイル操作関数は、それがディレクトリであるような
ファイルに対して使われた場合は、エラーとなります。
たとえば、delete-file
を使って、ディレクトリを削除することはできません。
ここで説明する特別な関数は、このディレクトリを作成したり削除するために
あります。
この関数はdirnameという名前のディレクトリを作成します。
この関数は、dirnameという名前のディレクトリを削除します。
関数delete-file
は、ディレクトリであるようなファイルには機能しません。
この場合には、delete-directory
を使わなければいけません。
そのディレクトリがなんらかのファイルを含んでいる場合には、
delete-directory
はエラーを発生します。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
あるファイル名に対し、特別な扱いをさせることができます。 これは、これらのファイル名を魔力のあるもの(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
,
diff-latest-backup-file
,
directory-file-name
,
directory-files
,
dired-compress-file
, dired-uncache
,
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-handlers
と
inhibit-file-name-operation
を使って、これをどうやるかを示しています。
これらの変数は上で示したように注意して正確に使ってください。
複数のハンドラをもつ場合に適切な振る舞いをさせる場合と、
二つのファイル名をもち、そのそれぞれがハンドラをもつような操作の場合に、
この例のような詳細な部分が重要になります。
この変数は、ある操作に対して現在使用を禁止されているハンドラのリストを 持ちます。
現在、ハンドラの使用禁止の対象となっている操作。
この関数は、ファイル名fileに対するハンドラ関数を返します。もしハンドラ
がなければnil
を返します。引数operationは、ファイルに対して機能
する操作でなければいけません。operationは、その操作が呼ばれたときに、
その最初の引数としてハンドラに渡される値です。この操作を表わす引数は、
inhibit-file-name-operation
との比較を行なうために必要です。
この関数は、ファイルfilenameがすでに魔法ファイルであれば、 これを通常の非魔法ファイルにコピーします。
filenameが、Emacsの外のプログラムからは直接は読み書きできない ような"魔法"ファイル名を指している場合、この関数は、通常のファイルに 内容をコピーし、そのファイル名を返します。
filenameが通常のファイル名で魔法ファイル名でない場合、この関数は
なにもせずnil
を返します。
この関数は、魔力を持たないディレクトリの名前を返します。 ファイルfilenameが魔力を持たない場合、 この関数はfilenameのディレクトリ部分を返します。 そうでなければハンドラに対して何をすべきかを尋ねます。
これは、サブプロセスを起動する場合に便利です。すべてのサブプロセスは カレント・ディレクトリとして魔力を持たないディレクトリを持たなければなりません。 この関数を使うのは、この要求にあったよい方法です。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
変数format-alist
は、ファイル・フォーマット(file formats)
のリストを定義します。
これは、Emacsバッファ中のデータ(テキストやテキスト属性、場合によると
ほかの情報も)がファイルとなるときに、テキスト的にどのような表現になるかを
記述したものです。
Emacsは、ファイルを読んだり書いたりするときに、適切ならばフォーマット
変換をします。
このリストの要素は、定義されたファイル・フォーマットごとに、一つのフォーマット 定義を持ちます。
フォーマット定義は、このような形式のリストです。
(name doc-string regexp from-fn to-fn modify mode-fn) |
フォーマット定義の各要素の意味は次のようになります。
このフォーマットの名前です。
このフォーマットを説明した文字列です。
このフォーマットで表現されたファイルを識別するために使う正規表現です。
(ファイル・データを、通常のEmacsでのデータの表現に変換するために) データをこのフォーマットで復号化するために呼びだされる関数です。
from-fnは、二つの引数beginとendをともなって呼び出されます。 これらはバッファの変換すべき部分を指定します。 この関数は、そのテキストを適切に編集することにより、変換を行うべきです。 これによって、テキストの長さが変わるので、from-fnは修正後のバッファの 最後の位置を返すべきです。
from-fnは、ファイルの頭がregexpに一致しないようにしてやらなけれ ばなりません。そうでなければ、またフォーマット変換が行なわれてしまいます。
(通常のEmacsでのデータの表現をこのフォーマットに変換するために) データをこのフォーマットで符号化するために呼び出される関数です。
to-fnは、二つの引数beginとendをともなって呼び出されます。 これらはバッファの変換すべき部分を指定します。 この関数がフォーマット変換をする方法は、二つあります。
(position . string)
であるようなリストです。
ここで、positionは、書き込まれるテキストとしての中での相対的な位置を
指定する整数です。また、stringは、その位置に書き加えられる注釈
です。このリストは、to-fnがそれを返すときには、位置の順序で
ソートされていなければなりません。
write-region
が実際にテキストをバッファからファイルに書き込む時、
この関数は、指定された注釈を対応する位置に入れ込みます。
これらをすべて、そのバッファを修正せずに行ないます。
フラグです。符号化関数によりバッファを修正する場合にはt
を、
注釈のリストを返す場合はnil
をいれてください。
visitしてファイルをこのフォーマットから変換した後に 呼び出すモード関数です。
関数insert-file-contents
は、その指定したファイルを読み込んだときに、
自動的にファイル・フォーマットを識別します。
この関数は、そのファイルの始めの部分のテキストをフォーマット定義の
正規表現と比較します。このときに一致部分があった場合には、そのフォーマットの
復号化関数を呼び出します。そして再びすべてのフォーマットをチェックします。
この関数は、ファイル・フォーマットが適用できなくなるまでこれを繰り返します。
find-file-noselect
あるいはこれを呼び出すコマンド
を使ってファイルをvisitするときは、同じように変換を実行します
(というのはこの関数はinsert-file-contents
を呼び出すからです)。
またこの関数は、それが復号化したフォーマットに対応するモード関数を
呼び出します。この関数は、バッファローカルな変数buffer-file-format
に、フォーマット名のリストを記録します。
この変数は、visitされているファイルのフォーマットを表わしています。 つまりこれは、カレント・バッファにファイルをvisitしたときに、復号化を行なった ファイル・フォーマット名のリストです。 この関数は、すべてのバッファでつねにローカルです。
write-region
を使ってデータをファイルに書き込むとき、
この関数はまず最初に、buffer-file-format
のフォーマット
に対する符号化関数を、そのリスト中の順で呼び出します。
このコマンドは、カレント・バッファの内容をフォーマットformatで ファイルfileに書き込みます。そして、このバッファが後に保存される 場合に使うために、そのフォーマットがデフォルトであるとします。 引数formatは、フォーマット名のリストです。
このコマンドは、fileをvisitしますが、そのときにフォーマット formatにしたがってそのファイルを変換します。 またこのコマンドは、そのバッファが後に保存される場合のために、 formatをそのバッファに対するデフォルトのフォーマットにします。
引数formatはフォーマット名のリストです。formatがnil
の場合には、変換はされません。このコマンドが対話的に呼ばれた場合には、
formatに対しては単にRETを入力すれば、
値nil
が割り当てられます。
このコマンドは、ファイルfileの内容を現在のバッファに
挿入しますが、そのときにフォーマットformatにしたがって変換を行ないます。
begとendが非nil
の場合には、これはそのファイルの
読み込まれる部分を指定することになります。これはinsert-file-contents
と同様です(see section ファイルからの読込み)。
返値はinsert-file-contents
と同様です。すなわち、その絶対ファイル名
と(変換後の)挿入されたデータ長のリストを返します。
引数formatはフォーマット名のリストです。formatがnil
の場合には、変換はされません。このコマンドが対話的に呼ばれた場合には、
formatに対しては単にRETを入力すれば、
値nil
が割り当てられます。
この変数は、自動セーブのときに使うフォーマットを指定します。
この値は、buffer-file-format
と同様、フォーマット名のリストですが、
自動セーブ・ファイルの書き込み時には、buffer-file-format
の
代わりに使われるリストです。
この変数は、すべてのバッファでつねにローカルです。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
MS-DOS上のEmacsは、テキストとバイナリ・ファイルを区別して扱います。MS-DOS上
での通常のテキストは、行間で二つの文字シーケンス、
キャリッジ・リターンとラインフィード
(CRLF)を使用するため、この区別は必要です。Emacsは、行間に一つの改行文字
(一つのラインフィード)があることだけを期待しています。Emacsが、MS-DOS上で
テキスト・ファイルを読む、ないしは書くとき、行のセパレータを変換する
必要があります。
これはEmacsが、どのファイルがテキストで、どのファイルがバイナリかを知る必要
があるということを意味しています。
Emacsは、このバイナリ・ファイルかテキスト・ファイルかという決定を
ファイルをvisitしたときに行ない、その決定結果をそのファイルを保存するときに
使うために、変数buffer-file-type
に記録します。
サブプロセスについて関係する特徴については、See section MS-DOSでのサブプロセス。
この変数は、自動的にそれぞれのバッファにローカルで、バッファがvisitする
ファイルのファイル・タイプを記録します。値は、テキストの場合はnil
であり、バイナリの場合はt
です。
この関数は、ファイルfilenameがテキスト・ファイルであるかバイナリ
ファイルであるかを決定します。テキスト・ファイルの場合はnil
を返し、
バイナリ・ファイルの場合はt
を返します。
この変数は、テキスト・ファイルとバイナリ・ファイルを区別するために使うalist
を持ちます。
リストの要素はそれぞれ(regexp . type)という形式を持ちます。
regexpは、ファイル名と照合します。
typeは、nil
の場合はテキストを、
t
の場合はバイナリを意味します。
あるいはtypeは、そのどちらかであるかを判断するための関数が格納されます。
typeが関数の場合は、一つの引数(ファイル名)を
取って呼び出されて、t
かnil
を返すべきです。
この変数は、名前からは特に判断がつかないようなファイルに対して
デフォルトのタイプを指定します。この値は、テキストの場合にはnil
、
バイナリの場合にはt
であるべきです。
find-file
と同様の機能を持ちますが、そのファイルを名前と無関係に、
テキスト・ファイルとして取り扱います。
find-file
と同様の機能を持ちますが、そのファイルを名前と無関係に、
バイナリ・ファイルとして取り扱います。
[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This document was generated by Yasutaka SHINDOH on September, 29 2006 using texi2html 1.76.