Next: , Previous: , Up: File Names   [Contents][Index]


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

ファイル名の展開(expanding)とは相対ファイル名を絶対ファイル名に変換することを意味します。これはデフォルトディレクトリーから相対的に行われるため、展開されるファイル名と同様にデフォルトディレクトリーも指定しなければなりません。これは~/のような省略形 (abbreviate-file-nameを参照)、 の展開、および./name/../のような冗長さの排除も行います。

Function: expand-file-name filename &optional directory

この関数はfilenameを絶対ファイル名に変換する。directoryが与えられたなら、それはfilenameが相対的な場合に開始点となるデフォルトディレクトリーであること。それ以外ならカレントバッファーの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"

結合されたファイル名の最初のスラッシュの前が‘~’なら、環境変数HOME (通常はユーザーのホームディレクトリー)の値に展開される。最初のスラッシュの前が‘~user’で、かつuserが有効なログイン名なら、userのホームディレクトリーに展開される。

.’や‘..’を含むファイル名は正規化形式に簡略化される:

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

出力に‘..’部分が残り得る場合もある:

(expand-file-name "../home" "/")
     ⇒ "/../home"

これは、ルートディレクトリー/の上位の“スーパールート(superroot)”という概念をもつファイルシステムのためのものである。その他のファイルシステムでは、/..//とまったく同じに解釈される。

expand-file-nameは環境変数を展開しないことに注意。それを行うのはsubstitute-in-file-nameのみ。

(expand-file-name "$HOME/foo")
     ⇒ "/xcssun/users/rms/lewis/$HOME/foo"

expand-file-nameはあらゆる階層においてシンボリックリンクをフォローしないことにも注意。これは‘..’の扱いがfile-truenameexpand-file-nameで異なることに起因する。‘/tmp/bar’がディレクトリー‘/tmp/foo/bar’にたいするシンボリックリンクであると仮定すると:

(file-truename "/tmp/bar/../myfile")
     ⇒ "/tmp/foo/myfile"
(expand-file-name "/tmp/bar/../myfile")
     ⇒ "/tmp/myfile"

直接間接を問わず事前にexpand-file-nameを呼び出さずに‘..’に先行するシンボリックリンクをフォローする必要があるかもしれない場合には、それを呼び出さずに確実にfile-truenameを呼び出すこと。Truenamesを参照されたい。

Variable: default-directory

このバッファーローカル変数の値はカレントバッファーにたいするデフォルトディレクトリー。これは絶対ディレクトリー名であること。これは‘~’で始まるかもしれない。この変数はすべてのバッファーにおいてバッファーローカル。

2つ目の引数がnilなら、expand-file-nameはデフォルトディレクトリーを使用する。

値は常にスラッシュで終わる文字列。

default-directory
     ⇒ "/user/lewis/manual/"
Function: substitute-in-file-name filename

この関数は、filename内で参照される環境変数を、環境変数の値に置き換える。標準的なUnixシェル構文にしたがい、 ‘$’は環境変数値置き換えのプレフィックスである。入力に‘$$’が含まれる場合、それ‘$’に置き換えられる。これにより、ユーザーが‘$’を“クォート”する手段が与えられる。

環境変数名は‘$’の後に続く一連の英数字(アンダースコアを含む)である。‘$’の後続文字が‘{’なら対応する‘}’までのすべてが変数名である。

substitute-in-file-nameにより生成された出力でsubstitute-in-file-nameを呼び出すと不正な結果となる傾向がある。たとえば単一の‘$’をクォートするために‘$$’を使用しても正しく機能せずに環境変数値の中の‘$’は再帰的な置換を導くだろう。したがってこの関数を呼び出して出力をこの関数に渡すプログラムは、その後の不正な結果を防ぐためにすべての‘$’文字を二重化する必要がある。

以下ではユーザーのホームディレクトリー名を保持する環境変数HOMEは値‘/xcssun/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"
     ;; /usr/local/は破棄された