ファイル名の展開(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"
filenameの最初のスラッシュの前が‘~’ならユーザーのホームディレクトリー(通常は環境変数HOME
の値で指定される)に展開される(General
Variables in The GNU Emacs
Manualを参照)。最初のスラッシュの前が‘~user’でuserが有効なログイン名ならuserのホームディレクトリーに展開される。リテラル‘~’で始まるかもしれない相対的なfilenameにたいして展開を望まない場合には(expand-file-name
filename directory)
のかわりに(concat (file-name-as-directory directory)
filename)
を使用できる。
File names containing ‘.’ or ‘..’ are simplified to their canonical form:
(expand-file-name "bar/../foo") ⇒ "/xcssun/users/rms/lewis/foo"
出力に‘..’部分が残り得る場合もある:
(expand-file-name "../home" "/") ⇒ "/../home"
これはルートディレクトリー/の上位のスーパールート(superroot)という概念をもつファイルシステムのためのものである。その他のファイルシステムでは/../は/とまったく同じに解釈される。
.や空文字列を展開するとデフォルトディレクトリーがリターンされる:
(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
を呼び出すこと。本当の名前を参照されたい。
このバッファーローカル変数の値はカレントバッファーにたいするデフォルトディレクトリー。これは絶対ディレクトリー名であること。これは‘~’で始まるかもしれない。この変数はすべてのバッファーにおいてバッファーローカル。
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/は破棄された
ファイル名の展開が望ましくない場合もあります。そのような場合には展開を抑制するためにファイル名をクォートしてファイル名をそのままリテラルとして処理することができます。ファイル名の前に‘/:’を前置することによりクォートが行われます。
このマクロはファイルnameにクォーテーションプレフィクス‘/:’を付加する。ローカルファイルnameにはnameの前にプレフィクス‘/:’を付加する。nameがリモートファイル名ならnameのローカル部分がクォートされる(特定のファイル名の“Magic”の作成を参照)。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"
マジックファイル名によるファイル名ハンドラーを抑制するためにこのマクロは使用できない(特定のファイル名の“Magic”の作成を参照)。
このマクロはファイルnameにクォーテーションプレフィクス‘/:’があれば削除する。nameがリモートファイル名ならnameのローカル部分を非クォート化する。
このマクロはnameがプレフィクス‘/:’でクォートされていれば非nil
をリターンする。nameがリモートファイル名ならnameのローカル部分をチェックする。