Next: , Previous: Relative File Names, Up: File Names


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

ファイル名の展開(expansion)とは、 相対ファイル名を絶対ファイル名に変換することです。 これはデフォルトディレクトリを基準に行うので、 展開すべきファイル名に加えて、デフォルトディレクトリの名前も 指定する必要があります。 また、展開では、./name/../のような冗長部分を 取り除いてファイル名を単純にします。

— Function: expand-file-name filename &optional directory

この関数は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だけがそれを行う。

— Function: file-relative-name filename directory

この関数は展開の逆操作を行う。 つまり、directoryを基準に解釈すると filenameと等価になる相対名を返す。

絶対ファイル名が装置名で始まるシステムもある。 そのようなシステムでは、directoryfilenameが 2つの異なる装置名で始まると、 filenameに等価なdirectoryを基準にした相対名はない。 そのような場合、file-relative-nameは 絶対名の形でfilenameを返す。

          (file-relative-name "/foo/bar" "/foo/")
               ⇒ "bar"
          (file-relative-name "/foo/bar" "/hack/")
               ⇒ "/foo/bar"
— Variable: default-directory

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

expand-file-nameは、その第2引数がnilであると デフォルトディレクトリを使う。

UNIXでは、この値はつねにスラッシュで終る文字列である。

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

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