ファイル名を展開するとは、相対ファイル名を絶対ファイル名に変換することを指します。これはデフォルトディレクトリを基準に行われるため、展開対象のファイル名に加えて、デフォルトディレクトリも指定する必要があります。また、~/のような略記の展開(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"
filename の最初のスラッシュより前の部分が ‘~’ である場合、それはホームディレクトリに展開されます。ホームディレクトリは通常、環境変数
HOME の値によって指定されます(The GNU Emacs
Manual の General
Variables を参照してください)。最初のスラッシュより前の部分が ‘~user’ であり、かつ user
が有効なログイン名である場合、それは user のホームディレクトリに展開されます。リテラルの
‘~’ で始まる可能性のある相対パスの filename に対してこの展開を行いたくない場合は、(expand-file-name filename directory) の代わりに (concat (file-name-as-directory directory) filename)
を使用できます。
‘.’ または ‘..’ を含むファイル名は、正規形に簡略化されます:
(expand-file-name "bar/../foo")
⇒ "/xcssun/users/rms/lewis/foo"
場合によっては、先頭の ‘..’ コンポーネントが出力に残ることがあります:
(expand-file-name "../home" "/")
⇒ "/../home"
これは、ルートディレクトリの上にスーパールートという概念を持つファイルシステム / を想定したものです。その他のファイルシステムでは、/../ は / と全く同様に解釈されます。
. または空文字列を展開すると、デフォルトのディレクトリが返されます:
(expand-file-name "." "/usr/spool/")
⇒ "/usr/spool"
(expand-file-name "" "/usr/spool/")
⇒ "/usr/spool"
なお、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 を参照してください。
このバッファローカル変数の値は、現在のバッファのデフォルトディレクトリです。絶対ディレクトリ名である必要があり、‘~’で始まることができます。この変数は、すべてのバッファにおいてバッファローカルです。
expand-file-name は、第2引数が nil の場合にデフォルトのディレクトリを使用します。
値は常にスラッシュで終わる文字列です。
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/ has been discarded.
ファイル名を展開したくない場合があります。そのような場合は、ファイル名をクォートすることで展開を抑制し、ファイル名をリテラルとして扱うことができます。クォートは、ファイル名の先頭に ‘/:’ を付加することで行います。
このマクロは、ファイル name に引用符プレフィックス ‘/:’ を追加します。ローカルファイル name の場合は、name の先頭に ‘/:’ を付加します。name がリモートファイル名である場合、name のローカル部分(特定のファイル名を「マジック」にする を参照)が引用符で囲まれます。name がすでに引用符で囲まれたファイル名である場合、name はそのまま返されます。
(substitute-in-file-name (file-name-quote "bar/~/foo"))
⇒ "/:bar/~/foo"
(substitute-in-file-name (file-name-quote "/ssh:host:bar/~/foo"))
⇒ "/ssh:host:/:bar/~/foo"
このマクロを使用して、マジックファイル名によるファイル名ハンドラを抑制することはできません(特定のファイル名を「マジック」にするを参照)。
このマクロは、ファイル name から引用符の接頭辞 ‘/:’ があればそれを削除します。name がリモートファイル名の場合、name のローカル部分は引用符なしで扱われます。
このマクロは、name が接頭辞 ‘/:’ 付きでクォートされている場合、non-nil を返します。name
がリモートファイル名である場合は、name のローカル部分がチェックされます。