次: Unique File Names, 前: Relative File Names, 上: File Names
ファイル名の展開(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
は環境変数を展開しないことに注意。substitute-in-file-name
だけがそれを行う。
この関数は展開の逆操作を行う。 つまり、directoryを基準に解釈すると filenameと等価になる相対名を返す。
絶対ファイル名が装置名で始まるシステムもある。 そのようなシステムでは、directoryとfilenameが 2つの異なる装置名で始まると、 filenameに等価なdirectoryを基準にした相対名はない。 そのような場合、
file-relative-name
は 絶対名の形で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
はユーザーのホームディレクトリ名 `/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/ has been discarded.
VMSでは、`$'による置換は行わないため、 この関数は冗長部分を取り除く以外にはなにも行わない。