ファイル名の展開(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では、‘$’による置換は行わないため、 この関数は冗長部分を取り除く以外にはなにも行わない。