Next: Unique File Names, Previous: Directory Names, Up: File Names [Contents][Index]
ファイル名の展開(expanding)とは、相対ファイル名を絶対ファイル名に変換することを意味します。これはデフォルトディレクトリーから相対的に行われるため、展開されるファイル名と同様、デフォルトディレクトリーも指定しなければなりません。これは~/のような省略形 (abbreviate-file-nameを参照)、 の展開、および./や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"
結合されたファイル名の最初のスラッシュの前が‘~’の場合は、環境変数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-truename
とexpand-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を参照のこと。
このバッファーローカル変数の値は、カレントバッファーにたいするデフォルトディレクトリーである。これは絶対ディレクトリー名であること。これは‘~’で始まるかもしれない。この変数は、すべてのバッファーにおいてバッファーローカルである。
2つ目の引数がnil
の場合、expand-file-name
はデフォルトディレクトリーを使用する。
値は常にスラッシュで終わる文字列である。
default-directory ⇒ "/user/lewis/manual/"
この関数は、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/は破棄された