次: , 前: High-Level Completion, 上: Completion


19.5.5 ファイル名の読み取り

ここでは、ファイル名を読み取るように設計された高レベルの 別の補完関数について述べます。 デフォルトディレクトリの自動挿入などの特別な機能を提供します。

— 機能: read-file-name prompt &optional directory default existing initial

この関数は、promptをプロンプトとし、 補完を行ってミニバッファでファイル名を読み取る。 defaultnil以外であると、 ユーザーが単に<RET>を打つと、この関数はdefaultを返す。 defaultが正しいかどうかは検査せず、 それがなんであれ、ユーザーがミニバッファを空で抜けるとそれを返す。

existingnil以外であると、 ユーザーは既存ファイルの名前を指定する必要がある。 <RET>は、可能ならば正しい名前に補完を行うが、 それが正しくない場合には抜けない。 existingの値がnilでもtでもないと、 <RET>は補完後の確認を必要とする。 existingnilであると、 存在しないファイルの名前も許す。

引数directoryは、相対ファイル名の補完に用いるディレクトリを指定する。 insert-default-directorynil以外であると、 初期入力としてdirectoryをミニバッファに挿入する。 カレントバッファのdefault-directoryの値がデフォルトになる。

initialを指定すると、 (directoryがあればそれを挿入後に)バッファに 挿入される初期ファイル名になる。 この場合、ポイントはinitialの先頭に置かれる。 initialのデフォルトはnilであり、 いかなるファイル名も挿入しない。 initialの動作を見るには、コマンドC-x C-vを試してほしい。 注意: ほとんどの場合、initialではなくdefaultを使うことを勧める。

例を示す。

          (read-file-name "The file is ")
          
          
          
          ;; 上の式を評価後には、ミニバッファはつぎのようになる
          
          ---------- Buffer: Minibuffer ----------
          The file is /gp/gnu/elisp/-!-
          ---------- Buffer: Minibuffer ----------
     

manual <TAB>を打つと、つぎのようになる。

          ---------- Buffer: Minibuffer ----------
          The file is /gp/gnu/elisp/manual.texi-!-
          ---------- Buffer: Minibuffer ----------
     

ユーザーが<RET>と打つと、 read-file-nameは ファイル名を文字列"/gp/gnu/elisp/manual.texi"として返す。

— ユーザオプション: insert-default-directory

この変数はread-file-nameが使う。 その値は、read-file-nameが、 デフォルトディレクトリの名前と(あれば)初期ファイル名を ミニバッファに入れて動作を開始するかどうかを制御する。 この変数の値がnilであると、 read-file-nameは (引数initialで初期入力を指定しない限り) ミニバッファに初期入力を入れない。 その場合でも、相対ファイル名の補完には デフォルトディレクトリを使うが表示はしない。

例を示す。

          
          ;; デフォルトディレクトリを入れて始める
          (let ((insert-default-directory t))
            (read-file-name "The file is "))
          
          ---------- Buffer: Minibuffer ----------
          The file is ~lewis/manual/-!-
          ---------- Buffer: Minibuffer ----------
          
          
          
          ;; ミニバッファは空であり、プロンプトのみ
          (let ((insert-default-directory nil))
            (read-file-name "The file is "))
          
          ---------- Buffer: Minibuffer ----------
          The file is -!-
          ---------- Buffer: Minibuffer ----------