[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

19. ミニバッファ

ミニバッファ(minibuffer)は、単純な数値前置引数ではなく、 より複雑な引数を読み取るためにEmacsのコマンドが使う特別なバッファです。 これらの引数には、ファイル名、バッファ名、 (M-xでの)コマンド名があります。 ミニバッファは、エコー領域と同様に、フレームの最下行に表示されますが、 引数を読み取るときにのみ表示されます。

19.1 ミニバッファの紹介  Basic information about minibuffers.
19.2 ミニバッファでのテキスト文字列の読み取り  How to read a straight text string.
19.3 ミニバッファでのLispオブジェクトの読み取り  How to read a Lisp object or expression.
19.4 ミニバッファの履歴  Recording previous minibuffer inputs so the user can reuse them.
19.5 補完  How to invoke and customize completion.
19.6 Yes/Noの問い合わせ  Asking a question with a simple answer.
19.7 複数のY/Nの問い合わせ  Asking a series of similar questions.
19.8 パスワードの読み取り  Reading a password from the terminal.
19.9 ミニバッファに関するその他  Various customization hooks and variables.


19.1 ミニバッファの紹介

ほとんどの意味において、ミニバッファはEmacsの普通のバッファです。 編集コマンドなどのバッファでのほとんどの操作は、 ミニバッファでも普通に動作します。 しかし、バッファを操作するコマンドの多くは、 ミニバッファには適用できません。 ミニバッファの名前はつねに`*Minibuf-number'という形式であって、 変更できません。 ミニバッファはミニバッファ専用の特別なウィンドウだけに表示されます。 これらのウィンドウはつねにフレームの最下行に現れます。 (ミニバッファを持たないフレームや、 ミニバッファ用ウィンドウのみの特殊なフレームもある。 28.8 ミニバッファとフレームを参照。)

ミニバッファ用のウィンドウは通常は1行だけです。 ウィンドウサイズを変更するコマンドで一時的に大きさを変えられますが、 ミニバッファから抜けると通常サイズに戻ります。 ミニバッファ用ウィンドウのサイズを恒久的に変更するには、 ミニバッファを使っていないときに、フレームの別のウィンドウにおいて ウィンドウサイズを変更するコマンドを使います。 ミニバッファだけを持つフレームの場合、 フレームのサイズを変更すればミニバッファのサイズを変更できます。

すでにミニバッファが活性であるときにコマンドがミニバッファを使用することを 再帰ミニバッファと呼びます。 最初のミニバッファの名前は` *Minibuf-0*'です。 再帰ミニバッファは、名前の最後の数を増やして命名します。 (名前は空白で始まるため、通常のバッファの一覧には表示されない。) 再帰ミニバッファの中で、もっとも内側の(つまりもっとも再帰が深い)ものが 活性なミニバッファです。 これを単にミニバッファと呼びます。 変数enable-recursive-minibuffersを設定すれば、 再帰ミニバッファを許可したり禁止できます。 あるいは、コマンドシンボルにこの名前の属性を入れます (see section 19.9 ミニバッファに関するその他)。

他のバッファと同様に、ミニバッファは 複数のローカルキーマップ(see section 21. キーマップ)を使うことがあります。 これらには、さまざまな終了コマンドや補完コマンド(see section 19.5 補完) が含まれます。


19.2 ミニバッファでのテキスト文字列の読み取り

多くの場合、テキストを文字列として読み取るためにミニバッファを使います。 Lispオブジェクトのテキスト表現を読み取るためにも使えます。 ミニバッファでの入力のもっとも基本的な関数は read-from-minibufferであり、どちらの目的にも使えます。

多くの場合、Lisp関数の途中でミニバッファの入力関数を呼ぶべきではありません。 そのかわりに、interactiveの指定で、 コマンドの引数を読み取る操作の一部として すべてのミニバッファ入力を行います。 See section 20.2 コマンドの定義

Function: read-from-minibuffer prompt-string &optional initial-contents keymap read hist default inherit-input-method
この関数は、ミニバッファから入力を得るもっとも汎用の方法である。 デフォルトでは、任意のテキストを受け取り文字列として返す。 しかし、readnil以外であれば、 readを用いてテキストを Lispオブジェクトへ変換する(see section 18.3 入力関数)。

この関数がまず行うことは、ミニバッファを活性にし、 プロンプトprompt-stringとともに表示することである。 prompt-stringは文字列であること。 これで、ユーザーはミニバッファでテキストを編集できるようになる。

ユーザーがミニバッファを抜けるコマンドを打つと、 read-from-minibufferは ミニバッファ内のテキストから戻り値を構築する。 通常、当該テキストを含む文字列を返す。 しかし、readnil以外であると、 read-from-minibufferはテキストを読み取った結果である Lispオブジェクトを評価せずに返す。 (読み取りについてはsee section 18.3 入力関数。)

引数defaultは、履歴コマンドで使うデフォルト値を指定する。 これは文字列かnilであること。 readnil以外である場合、 ユーザーの入力が空であるときには、 readへの入力としてもdefaultを用いる。 しかし、(readnilである)通常の場合、 ユーザーの入力が空のとき、read-from-minibufferdefaultを返さずに空文字列""を返す。 この意味において、この関数は本章の他のミニバッファ用入力関数と異なる。

keymapnil以外であると、 ミニバッファのローカルキーマップとして用いる。 keymapを省略したりnilであると、 minibuffer-local-mapの値をキーマップとして用いる。 キーマップを指定することは、 補完などのさまざまな応用向けにミニバッファをカスタマイズする もっとも重要な方法である。

引数histは、ミニバッファでの入力を保存し履歴コマンドを使用可能に するために用いる履歴リスト変数を指定する。 デフォルトはminibuffer-historyである。 see section 19.4 ミニバッファの履歴

変数minibuffer-allow-text-propertiesnil以外であると、 返される文字列には、ミニバッファで指定されたテキスト属性が含まれる。 さもなければ、値を返すときにすべてのテキスト属性を取り除く。

引数inherit-input-methodnil以外であると、 ミニバッファに入るまえにどのバッファにいたかに関わらず、 そのバッファから現在の入力方式(see section 32.11 入力方式)と enable-multibyte-characters(see section 32.1 テキスト表現)の設定を 継承する。

initial-contentsが文字列であれば、 read-from-minibufferは、 ユーザーがテキスト編集を始めるまえに、 この文字列をミニバッファに挿入しその末尾にポイントを置く。 この文字列を初期内容とするミニバッファが現れる。

あるいは、initial-contentsは、 (string . position)という形式のコンスセルでもよい。 これは、文字列stringをミニバッファに挿入し、 ポイントは末尾にではなく 先頭からposition番目の文字に置くことを意味する。

使用上の注意: 引数initial-contentsdefaultは、 多かれ少なかれ同じことを行う代替方法を提供する。 read-from-minibufferの1つの呼び出しにおいて、 両者の機能を同時に使うことに意味はない。 一般には、defaultを使うことを勧める。 というのは、ユーザーがデフォルト値を望む場合にはデフォルト値を挿入でき、 それ以外の場合にはデフォルト値を削除しなくてもよいからである。

Function: read-string prompt &optional initial history default inherit-input-method
この関数はミニバッファから文字列を読み取り、それを返す。 引数promptinitialは、 read-from-minibufferと同様に使われる。 使用するキーマップはminibuffer-local-mapである。

省略可能な引数historyは、nil以外であると、 履歴リストと(省略可能な)リスト内での初期位置を指定する。 省略可能な引数defaultは、 ユーザー入力が空の場合に返されるデフォルト値であり、文字列であること。 省略可能な引数inherit-input-methodは、 カレントバッファの入力方式を継承するかどうかを指定する。

この関数は関数read-from-minibufferの インターフェイスを単純化したものである。

 
(read-string prompt initial history default inherit)
==
(let ((value
       (read-from-minibuffer prompt initial nil nil
                             history default inherit)))
  (if (equal value "")
      default
    value))

Variable: minibuffer-allow-text-properties
この変数がnilであると、 read-from-minibufferはミニバッファで指定されたすべての テキスト属性を返すまえに取り除く。 すべてのミニバッファがread-from-minibufferを使うので、 この変数はすべてのミニバッファ入力に適用される。

この変数の値に関わらず、 補完関数は無条件にテキスト属性を廃棄することに注意。

Variable: minibuffer-local-map
ミニバッファから読み取るときのデフォルトのローカルキーマップ。 デフォルトでは、以下のバインディングである。

C-j
exit-minibuffer

RET
exit-minibuffer

C-g
abort-recursive-edit

M-n
next-history-element

M-p
previous-history-element

M-r
next-matching-history-element

M-s
previous-matching-history-element

Function: read-no-blanks-input prompt &optional initial inherit-input-method
この関数はミニバッファから文字列を読み取るが、 入力には白文字を許さず、白文字は入力を終らせる。 引数promptinitialinherit-input-methodは、 read-from-minibufferと同様に使われる。

これは関数read-from-minibufferの インターフェイスを単純化したものであり、 引数keymapとしてminibuffer-local-ns-mapの値を渡す。 キーマップminibuffer-local-ns-mapでは C-qを再バインドしないため、 クォートすれば空白を文字列に含めることができる

 
(read-no-blanks-input prompt initial)
==
(read-from-minibuffer prompt initial minibuffer-local-ns-map)

Variable: minibuffer-local-ns-map
この組み込み変数は、関数read-no-blanks-inputが ミニバッファ用のローカルキーマップとして使うキーマップである。 デフォルトでは、minibuffer-local-mapのバインディングに加えて 以下のバインディングである。

SPC
exit-minibuffer

TAB
exit-minibuffer

?
self-insert-and-exit


19.3 ミニバッファでのLispオブジェクトの読み取り

本節では、ミニバッファでLispオブジェクトを読み取る関数について述べます。

Function: read-minibuffer prompt &optional initial
この関数はミニバッファを用いてLispオブジェクトを読み取り、 それを評価せずに返す。 引数promptinitialは、 read-from-minibufferと同様に使われる。

これは関数read-from-minibufferの インターフェイスを単純化したものである。

 
(read-minibuffer prompt initial)
==
(read-from-minibuffer prompt initial nil t)

初期入力として文字列"(testing)"を与えた例を示す。

 
(read-minibuffer
 "Enter an expression: " (format "%s" '(testing)))

;; 以下のようにミニバッファが表示される

---------- Buffer: Minibuffer ----------
Enter an expression: (testing)-!-
---------- Buffer: Minibuffer ----------

デフォルトとして初期入力を使うには、ユーザーはただちにRETを打てばよい。 あるいは、入力を編集する。

Function: eval-minibuffer prompt &optional initial
この関数はミニバッファを用いてLisp式を読み取り、 それを評価してその結果を返す。 引数promptinitialは、 read-from-minibufferと同様に使われる。

この関数はread-from-minibufferの インターフェイスを単純化したものである。

 
(eval-minibuffer prompt initial)
==
(eval (read-minibuffer prompt initial))

Function: edit-and-eval-command prompt form
この関数はミニバッファを用いてLisp式を読み取り、それを評価する。 このコマンドとeval-minibufferとの違いは、 初期フォームformを省略できないことであり、 このフォームをテキスト文字列としではなく表示表現に 変換するLispオブジェクトとして扱うことである。 prin1を用いて表示するので、 これが文字列であると初期テキストにはダブルクォート文字(`"')が現れる。 see section 18.5 出力関数

edit-and-eval-commandはまず、promptをプロンプトとして ミニバッファを活性にする。 続いて、ミニバッファにformの表示表現を挿入し、ユーザーに編集させる。 ユーザーがミニバッファから抜けると、 編集後のテキストをreadで読み取り評価する。 評価結果がedit-and-eval-commandの値になる。

以下の例では、すでに正しいフォームである 初期テキストの式をユーザーに提示する。

 
(edit-and-eval-command "Please edit: " '(forward-word 1))

;; 上の式を評価後には、ミニバッファは以下のようになる 

---------- Buffer: Minibuffer ----------
Please edit: (forward-word 1)-!-
---------- Buffer: Minibuffer ----------

ただちにRETを打つと、 ミニバッファから抜けて式を評価するので、 ポイントを1単語分先へ進めることになる。 この例では、edit-and-eval-commandnilを返す。


19.4 ミニバッファの履歴

ミニバッファ履歴リスト(minibuffer history list)は ミニバッファでの以前の入力を記録し、 ユーザーがそれらを手軽に再利用できるようにします。 履歴リストは実際にはシンボルでありリストではありません。 最新のものが先頭にある(以前の入力の)文字列のリストを値とする変数です。

異なる種類の入力に用いる多くの別々の履歴リストがあります。 ミニバッファを利用するたびに適した履歴リストを指定するのは、 Lispプログラマの責任です。

基本的なミニバッファ入力関数 read-from-minibuffercompleting-readの両者は、 読者が指定する履歴リストを省略可能な引数histとして受け付けます。 指定可能な値はつぎのとおりです。

variable
変数variable(シンボル)を履歴リストとして用いる。

(variable . startpos)
変数variable(シンボル)を履歴リストとして用い、 初期履歴位置をstartpos (履歴リストの最新要素を0とする整数)と仮定する。

startposを指定した場合、整合性を保つために、 履歴リストの当該要素をミニバッファの初期内容にも指定すること。

histを指定しなければ、 デフォルトの履歴リストminibuffer-historyを用いる。 その他の標準的な履歴リストについては以下を参照。 読者が独自の履歴リスト変数を作成してもよい。 初めて使用するまえに単にnilで初期化しておく。

read-from-minibuffercompleting-readの両者は 履歴リストに新たな要素を自動的に追加し、 リスト上の要素を再利用するためのコマンドをユーザーに提供する。 履歴リストを使うために読者のプログラムで行うべきことは、 履歴リストを初期化し必要なときにその名前を入力関数に渡すだけである。 ミニバッファ入力関数が履歴リストを使用していないときには、 履歴リストを変更しても安全である。

標準的なミニバッファ履歴リスト変数を以下にあげておく。

Variable: minibuffer-history
ミニバッファの履歴入力用のデフォルトの履歴リスト。

Variable: query-replace-history
query-replace(および同様のコマンド)の引数用の履歴リスト。

Variable: file-name-history
ファイル名引数用の履歴リスト。

Variable: buffer-name-history
バッファ名引数用の履歴リスト。

Variable: regexp-history
正規表現引数用の履歴リスト。

Variable: extended-command-history
拡張コマンド名である引数用の履歴リスト。

Variable: shell-command-history
シェルコマンドである引数用の履歴リスト。

Variable: read-expression-history
Lisp式として評価する引数用の履歴リスト。


19.5 補完

補完(completion)とは、 名前の省略から始まる名前の残り部分を補充する機能です。 ユーザー入力を正しい名前のリストと比較し、 すでにユーザーが入力したものに名前が どの程度一致するかを決定することで補完します。 たとえば、C-x bswitch-to-buffer)と打って、 切り替えたいバッファ名の始めの数文字を打って TABminibuffer-complete)を打つと、 Emacsは可能な限りその名前を補充します。

Emacsの標準のコマンドは、 シンボル、ファイル、バッファ、プロセスの名前を補完できます。 本節の関数を用いれば、その他の種類の名前の補完も実装できます。

関数try-completionは補完のための基本関数です。 与えられた文字列の集まりから 初期文字列にもっとも適合する最長のものを返します。

関数completing-readは補完のための上位レベルの インターフェイスを提供します。 completing-readの呼び出しには、 正しい名前のリストを決定する方法を指定します。 この関数は、補完に有用なコマンドを数個のキーにバインドした ローカルキーマップを使うミニバッファを活性にします。 その他の関数は、特定の種類の名前を補完して読み取るために 単純化したインターフェイスを提供します。

19.5.1 基本補完関数  Low-level functions for completing strings.
(These are too low level to use the minibuffer.)
19.5.2 補完とミニバッファ  Invoking the minibuffer with completion.
19.5.3 補完を行うミニバッファコマンド  Minibuffer commands that do completion.
19.5.4 高レベルの補完関数  Convenient special cases of completion
(reading buffer name, file name, etc.)
19.5.5 ファイル名の読み取り  Using completion to read file names.
19.5.6 プログラム補完  Finding the completions for a given file name.


19.5.1 基本補完関数

2つの関数try-completionall-completionsは、 それ自身ではミニバッファを使いません。 これらについて本章で述べるのは、 ミニバッファを使う上位レベルの補完機能と同列にしておくためです。

Function: try-completion string collection &optional predicate
この関数は、collectionにあるstringを補完する 共通の最長な部分文字列を返す。 collectionの値は、連想リスト、オブジェクト配列、あるいは、 実質的な文字列の集まりを返す関数(下記参照)であること。

補完では、collectionで指定した各補完候補と stringを比較する。 補完候補の先頭部分がstringに等しければ、 その補完候補は一致するという。 一致する補完候補がなければ、try-completionnilを返す。 たった1つの補完候補に一致し、かつ、完全に一致すれば、 try-completiontを返す。 さもなければ、一致する補完候補すべてに共通する最長の文字列を値とする。

collectionが連想リスト(see section 5.8 連想リスト)であると、 連想リストの要素のCAR群が補完候補の集まりになる。

collectionがオブジェクト配列(see section 7.3 シンボルの作成とインターン)であると、 オブジェクト配列内のすべてのシンボルの名前が補完候補の集まりになる。 グローバル変数obarrayは、インターンしたすべてのLispシンボルの 名前を収めたオブジェクト配列を保持する。

新たなオブジェクト配列を作成する唯一の正しい方法は、 まず空で作成してからinternで1つ1つシンボルを追加することである ことに注意。 なお、1つのシンボルを複数のオブジェクト配列にはインターンできない。

引数predicatenil以外である場合、 それは1引数の関数であること。 その関数は一致する補完候補の検査に使われ、 predicatenil以外を返す場合にのみ一致した候補とみなす。 predicateに渡す引数は、 (CARが文字列である)連想リストのコンスセルであるか、 オブジェクト配列からの(シンボル名ではない)シンボルである。

collectionには、関数であるシンボルを使うこともできる。 その関数には補完処理を完遂する責任がある。 try-completionはその関数が返したものを返す。 その関数は3引数、つまり、 stringpredicatenilで呼ばれる。 (第3引数がある理由は、 all-completionsでも同じ関数を使い、 いずれの場合にも適切に動作できるようにするため。) see section 19.5.6 プログラム補完

以下の最初の例では、 文字列`foo'は連想リストの3つのCARに一致する。 すべての一致は`fooba'で始まるため、これが結果になる。 2番目の例では、たった1つの一致があり、しかも、完全に一致するので、 値はtである。

 
(try-completion 
 "foo"
 '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4)))
     => "fooba"

(try-completion "foo" '(("barfoo" 2) ("foo" 3)))
     => t

つぎの例では、`forw'で始まるシンボルが多数あり、 それらはすべて単語`forward'で始まる。 ほとんどのシンボルでは、これに`-'が続くが、 すべてがそうではないので、`forward'までしか補完できない。

 
(try-completion "forw" obarray)
     => "forward"

最後の例は、述語testの検査に通るのは3つの一致のうち2つだけである (文字列`foobaz'は短すぎる)。 両者は文字列`foobar'で始まる。

 
(defun test (s) 
  (> (length (car s)) 6))
     => test
(try-completion 
 "foo"
 '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4)) 
 'test)
     => "foobar"

Function: all-completions string collection &optional predicate nospace
この関数はstringの補完すべてのリストを返す。 この関数の引数は、try-completionのものと同じである。

collectionが関数であると、 stringpredicatetの3引数で呼ばれる。 all-completionsはこの関数が返す値を返す。 see section 19.5.6 プログラム補完

nospacenil以外であると、 stringが空白で始まらない限り、空白で始まる補完は無視する。

try-completionの例に示した関数testを用いた例を示す。

 
(defun test (s) 
  (> (length (car s)) 6))
     => test

(all-completions  
 "foo"
 '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4))
 'test)
     => ("foobar1" "foobar2")

Variable: completion-ignore-case
この変数の値がnil以外であると、 Emacsは補完において大文字小文字を区別しない。


19.5.2 補完とミニバッファ

本節ではミニバッファからの補完による読み取り用の 基本インターフェイスについて述べます。

Function: completing-read prompt collection &optional predicate require-match initial hist default inherit-input-method
この関数は、与えられた補完でユーザーを補佐して ミニバッファで文字列を読み取る。 文字列であるプロンプトpromptでミニバッファを活性にする。

実際の補完は、collectionpredicateを 関数try-completionに渡して行う。 これは、補完を用いるローカルキーマップでバインドされたコマンドで行われる。

require-matchnilであると、 ミニバッファでの入力に関わらず ミニバッファから抜けるコマンドは動作する。 require-matchtであると、 ミニバッファでの入力がcollectionの1つの要素に補完できない限り、 ミニバッファから抜ける通常のコマンドは動作しない。 require-matchnilでもtでもないと、 ミニバッファでの入力がcollectionの1つの要素に一致しない限り、 ミニバッファから抜けるコマンドは動作しない。

しかし、require-matchの値に関わらず、 空の入力はつねに許される。 その場合、completing-readdefaultを返す。 defaultの値は(nilでなければ)履歴コマンドを介しても ユーザーが使える。

ミニバッファが空の状態でRETを打つと、 ユーザーは空入力で抜けることができる。 そうすると、completing-read""を返す。 これにより、読み取った値に対してコマンドが使うどんなデフォルトでも指定できる。 require-matchの値、および、collectionに空文字列が 含まれるかどうかに関わらず、ユーザーはこのようにしてRETで戻れる。

関数completing-readread-minibufferを呼び出すことで動作する。 require-matchnilであると、 キーマップとしてminibuffer-local-completion-mapを使い、 nil以外であるとminibuffer-local-must-match-mapを使う。 see section 19.5.3 補完を行うミニバッファコマンド

引数histは、入力を保存しミニバッファ履歴コマンドで 使う履歴リスト変数を指定する。 デフォルトはminibuffer-historyである。 see section 19.4 ミニバッファの履歴

initialnil以外であると、 completing-readはこれを入力の一部としてミニバッファに挿入する。 これにより、ユーザーは補完コマンドとともに入力を編集できる。 ほとんどの場合、initialではなくdefaultを使うことを勧める。

引数inherit-input-methodnil以外であると、 ミニバッファに入るまえのカレントバッファがなんであれ、 カレントバッファから現在の入力方式(see section 32.11 入力方式)と enable-multibyte-characters(see section 32.1 テキスト表現) の設定を継承する。

組み込み変数completion-ignore-casenil以外であると、 大文字小文字を区別せずに候補に対して入力を比較する。 see section 19.5.1 基本補完関数

completing-readを用いた例を以下に示す。

 
(completing-read
 "Complete a foo: "
 '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4))
 nil t "fo")

;; 上の式を評価するとミニバッファはつぎのようになる 

---------- Buffer: Minibuffer ----------
Complete a foo: fo-!-
---------- Buffer: Minibuffer ----------

ユーザーがDEL DEL b RETを打つと、 completing-readbarfooを返す。

関数completing-readは、 補完を実際に行うコマンドに情報を渡すために3つの変数を束縛する。 3つの変数とは、minibuffer-completion-tableminibuffer-completion-predicateminibuffer-completion-confirmである。 これらについて詳しくは、19.5.3 補完を行うミニバッファコマンドを参照。


19.5.3 補完を行うミニバッファコマンド

本節では、補完を行うためにミニバッファで用いられるキーマップ、 コマンド、ユーザーオプションについて述べます。

Variable: minibuffer-local-completion-map
completing-readは、 補完候補の1つと完全に一致しなくてもよい場合に ローカルキーマップとしてこの値を使う。 デフォルトでは、このキーマップのバインディングはつぎのとおり。

?
minibuffer-completion-help

SPC
minibuffer-complete-word

TAB
minibuffer-complete

他の文字はminibuffer-local-map (see section 19.2 ミニバッファでのテキスト文字列の読み取り)と同様にバインドされる。

Variable: minibuffer-local-must-match-map
completing-readは、 補完候補の1つと完全に一致する必要がある場合に ローカルキーマップとしてこの値を使う。 そのため、ミニバッファから無条件に抜けるコマンドexit-minibufferに バインドしたキーはない。 デフォルトでは、このキーマップのバインディングはつぎのとおり。

?
minibuffer-completion-help

SPC
minibuffer-complete-word

TAB
minibuffer-complete

C-j
minibuffer-complete-and-exit

RET
minibuffer-complete-and-exit

他の文字はminibuffer-local-mapと同様にバインドされる。

Variable: minibuffer-completion-table
この変数の値は、ミニバッファでの補完に用いられる 連想リストやオブジェクト配列である。 これは、completing-readtry-completionに渡すものを 保持したグローバル変数である。 minibuffer-complete-wordなどの ミニバッファ補完コマンドで使用される。

Variable: minibuffer-completion-predicate
この変数の値は、completing-readtry-completionへ渡す述語である。 この変数は、他のミニバッファ補完関数でも使われる。

コマンド: minibuffer-complete-word
この関数は、ミニバッファの内容を多くても1単語分補完する。 ミニバッファの内容に対応する補完がたった1つであっても、 単語構成文字ではない文字以降は補充しない。 see section 34. 構文テーブル

コマンド: minibuffer-complete
この関数は、ミニバッファの内容を可能な限り補完する。

コマンド: minibuffer-complete-and-exit
この関数は、確認が必要でないとき、つまり、 minibuffer-completion-confirmnilであるときには、 ミニバッファの内容を補完後に抜ける。 確認が必要であるときには、 このコマンドをただちに繰り返すことで確認をとる。 このコマンドは、連続して2回呼ばれると、 確認しないようにプログラムしてある。

Variable: minibuffer-completion-confirm
この変数の値がnil以外の場合、 Emacsはミニバッファから抜けるまえに補完を確認してくる。 関数minibuffer-complete-and-exitは、 抜けるまえにこの変数の値を検査する。

コマンド: minibuffer-completion-help
この関数は、ミニバッファの現在の内容に対する補完のリストを作る。 引数collectionとして変数minibuffer-completion-tableの値を、 引数predicateとしてminibuffer-completion-predicateの値を 用いてall-completionsを呼び出すことで動作する。 補完のリストは、`*Completions*'という名前のバッファに テキストとして表示される。

Function: display-completion-list completions
この関数は、通常はバッファであるストリームstandard-outputcompletionsを表示する。 (ストリームについては詳しくはsee section 18. Lispオブジェクトの読み取りと表示。) 引数completionsは、普通は、all-completionsが 返した補完のリストであるが、そうでなくてもよい。 各要素は、シンボルか文字列であり、その場合、そのまま表示される。 各要素が2つの文字列から成るリストである場合、 文字列を連結したものを表示する。

この関数は、minibuffer-completion-helpから呼ばれる。 以下のように、with-output-to-temp-bufferとともに 用いるのがもっとも一般的である。

 
(with-output-to-temp-buffer "*Completions*"
  (display-completion-list
    (all-completions (buffer-string) my-alist)))

User Option: completion-auto-help
この変数がnil以外であると、 つぎの補充文字が一意に決まらない場合には、 自動的に補完のリストを表示する。


19.5.4 高レベルの補完関数

本節では、特定の種類の名前を補完付きで読み取るための 高レベルの便利な関数について述べます。

多くの場合、これらの関数をLisp関数の途中では呼び出さないでください。 可能な場合には、interactiveの指定で、 コマンドの引数を読み取る操作の一部としてすべてのミニバッファ入力を 行ってください。 See section 20.2 コマンドの定義

Function: read-buffer prompt &optional default existing
この関数はバッファ名を読み取り、文字列として返す。 引数defaultはデフォルトの名前を表し、 ユーザーがミニバッファから空で抜け出したときに返される値である。 nil以外であるときには、文字列かバッファであること。 これはプロンプトとして現れるが、 ミニバッファには初期入力として挿入されない。

existingnil以外であると、 指定した名前は既存のバッファ名であること。 テキストが正しくないとミニバッファから抜ける通常のコマンドは動作せず、 RETは正しい名前を探すため補完を行う。 (しかし、defaultが正しいかどうかは検査しない。 ユーザーがミニバッファを空で抜ければ、 なんであろうとdefaultが返される。)

以下の例では、ユーザーは`minibuffer.t'と入力してからRETを打つ。 引数existingtであり、 入力した名前で始まる唯一のバッファ名は`minibuffer.texi'であるので、 この名前が値になる。

 
(read-buffer "Buffer name? " "foo" t)
;; 上の式を評価すると、ミニバッファは空で
;; つぎのようなプロンプトが表示される

---------- Buffer: Minibuffer ----------
Buffer name? (default foo) -!-
---------- Buffer: Minibuffer ----------

;; ユーザーはminibuffer.t RETと打つ
     => "minibuffer.texi"

Variable: read-buffer-function
この変数は、バッファ名の読み取り方を指定する。 たとえば、この変数にiswitchb-read-bufferを設定すると、 バッファ名を読み取るためにread-bufferを呼び出す すべてのEmacsコマンドは、 バッファ名を読むためにパッケージiswitchbを使うようになる。

Function: read-command prompt &optional default
この関数はコマンド名を読み取り、Lispシンボルとして返す。 引数promptは、read-from-minibufferと同様に使われる。 なんであってもcommandptを返せばコマンドであり、 commandptを返すシンボルはコマンド名であることに注意。 see section 20.3 対話的呼び出し

引数defaultは、ユーザー入力が空だった場合に返したい値を指定する。 これは、シンボルか文字列であること。 文字列であると、read-commandは、これを返すまえにインターンする。 defaultnilであると、デフォルトを指定しないことを意味し、 ユーザー入力が空であると戻り値はnilである。

 
(read-command "Command name? ")

;; 上の式を評価後には、ミニバッファは空で 
;; つぎのようなプロンプトが表示される

---------- Buffer: Minibuffer ---------- 
Command name?  
---------- Buffer: Minibuffer ----------

ユーザーがforward-c RETと打つと、 この関数はforward-charを返す。

関数read-commandcompleting-readのインターフェイスを 単純化したものである。 既存のLispシンボルの集まりから補完するために変数obarrayを使い、 コマンド名のみを対象とするために述語commandpを使う。

 
(read-command prompt)
==
(intern (completing-read prompt obarray 
                         'commandp t nil))

Function: read-variable prompt &optional default
この関数はユーザー変数の名前を読み取り、シンボルとして返す。

引数defaultは、ユーザー入力が空だった場合に返したい値を指定する。 これは、シンボルか文字列であること。 文字列であると、read-variableは、これを返すまえにインターンする。 defaultnilであると、デフォルトを指定しないことを意味し、 ユーザー入力が空であると戻り値はnilである。

 
(read-variable "Variable name? ")

;; 上の式を評価後には、ミニバッファは空で 
;; つぎのようなプロンプトが表示される

---------- Buffer: Minibuffer ----------
Variable name? -!-
---------- Buffer: Minibuffer ----------

ユーザーがfill-p RETと打つと、 read-variablefill-prefixを返す。

この関数はread-commandに似ているが、 commandpのかわりに述語user-variable-pを使う。

 
(read-variable prompt)
==
(intern
 (completing-read prompt obarray
                  'user-variable-p t nil))

32.10.4 ユーザー指定のコーディングシステムの関数read-coding-systemread-non-nil-coding-systemも参照してください。


19.5.5 ファイル名の読み取り

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

Function: 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"として返す。

User Option: 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 ----------


19.5.6 プログラム補完

意図した補完候補を持った連想リストやオブジェクト配列を 作成することが困難な場合もあります。 そのような場合、与えられた文字列に対する補完を計算する 独自の関数を与えることができます。 これをプログラム補完(programmed completion)と呼びます。

この機能を使うには、completing-readの引数collectionに 関数定義を持つシンボルを渡します。 関数completing-readは、 try-completionall-completionsに 読者の補完関数を渡すようにして、読者の関数にすべてを任せます。

補完関数はつぎの3つの引数を受け取ります。

3つの操作型に対応してフラグの値は3つあります。

補完関数collectionには関数シンボルに加えて、 ラムダ式(関数であるリスト)も許すほうが 一貫性があって見通しがよいはずですが、それは不可能です。 リストには補完候補表としての意味がすでにあり、連想リストがそれです。 関数としての可能性もある通常の連想リストの扱いに失敗するようでは、 信頼性がなくなります。 そのため、読者が補完に使用したい関数は、 シンボルに入れておく必要があるのです。

Emacsは、ファイル名の補完にはプログラム補完を用います。 See section 24.8.6 ファイル名の補完


19.6 Yes/Noの問い合わせ

本節ではユーザーにyes/noを問い合わせるための関数について述べます。 関数y-or-n-pには、1文字で答えます。 誤った答えでも重大な問題に至らないような問い合わせに便利です。 yes-or-no-pには3文字か4文字で答える必要があるため、 より重要な問い合わせに適しています。

これらの関数がマウスを使って起動されたコマンドから呼ばれると、 より正確には、last-nonmenu-event(see section 20.4 コマンドループからの情報)が nilかリストであると、 関数は問い合わせのための対話ボックスやポップアップメニューを使います。 さもなければ、キーボード入力を使います。 呼び出しにおいてlast-nonmenu-eventに適切な値を束縛することで マウスかキーボード入力の使用を強制できます。

厳密にいえば、yes-or-no-pはミニバッファを使いますが、 y-or-n-pは使いません。 ですが、両者をここで説明しておきます。

Function: y-or-n-p prompt
この関数はユーザーに問い合わせ、エコー領域で入力を待ちます。 ユーザーがyを打てばtを返し、 nを打てばnilを返します。 さらに、SPCを「y」、DELを「n」ともみなします。 C-]C-gのように『中断』ともみなします。 というのは、問い合わせはミニバッファを使っているようにみえるので、 これから抜けるためにユーザーがC-]を使いそうだからである。 応答は1文字であり、RETで終える必要はない。 大文字と小文字は同じ意味である。

『問い合わせ』では、エコー領域にpromptを表示し、 文字列`(y or n) 'が続きます。 入力が正しい応答(ynSPCDEL、中断など)でないと、 関数は`Please answer y or n.'を表示して 問い合わせるを繰り返す。

応答は編集できないので、この関数は実際にはミニバッファを使わない。 ミニバッファが使うのと同じ画面領域を使う エコー領域(see section 38.3 エコー領域)を実際には使う。 問い合わせ中は、カーソルはエコー領域に移動する。

応答とその意味は、 たとえ`y'や`n'であっても組み込まれているわけではない。 キーマップquery-replace-mapがそれらを指定する。 see section 33.5 探索と置換

以下の例では、ユーザーはまずqを打つが、これは正しくない。 つぎのプロンプトに対して、ユーザーはyを打つ。

 
(y-or-n-p "Do you need a lift? ")

;; 上の式を評価後には、エコー領域には
;; つぎのプロンプトが表示される

---------- Echo area ----------
Do you need a lift? (y or n) 
---------- Echo area ----------

;; ユーザーがqを打つと、つぎのようになる

---------- Echo area ----------
Please answer y or n.  Do you need a lift? (y or n) 
---------- Echo area ----------

;; ユーザーが正しい応答を打つと
;; 問い合わせのうしろに表示される

---------- Echo area ----------
Do you need a lift? (y or n) y
---------- Echo area ----------

ここでは、エコー領域のメッセージを複数行示したが、 実際には、1度に1つのメッセージだけが表示される。

Function: y-or-n-p-with-timeout prompt seconds default-value
y-or-n-pと同様だが、ユーザーがseconds秒以内に答えないと、 入力を待たずにdefault-valueを返す。 これにはタイマを使う。 37.7 遅延実行のためのタイマを参照。 引数secondsは整数でも浮動小数点でもよい。

Function: yes-or-no-p prompt
この関数はユーザーに問い合わせ、ミニバッファでの入力を仮定する。 ユーザーが`yes'を入力するとtを返し、 `no'を入力するとnilを返す。 応答を終えるためにユーザーはRETを打つ必要がある。 大文字と小文字は同じ意味である。

yes-or-no-pは、まず、promptに続けて `(yes or no) 'をエコー領域に表示する。 ユーザーは正しい応答の1つを入力する必要がある。 さもないと、この関数は`Please answer yes or no.'を2秒ほど 表示してから問い合わせを繰り返す。

yes-or-no-py-or-n-pよりもユーザーの手間を必要とし、 より重要な決定に適している。

例を示す。

 
(yes-or-no-p "Do you really want to remove everything? ")

;; 上の式を評価後には、つぎのプロンプトが 
;; 空のミニバッファとともに表示される 

---------- Buffer: minibuffer ----------
Do you really want to remove everything? (yes or no) 
---------- Buffer: minibuffer ----------

ユーザーは、まずy RETを打つが、 この関数は完全な単語`yes'を要求するので正しくない。 以下のプロンプトを少し時間をおいて表示する。

 
---------- Buffer: minibuffer ----------
Please answer yes or no.
Do you really want to remove everything? (yes or no)
---------- Buffer: minibuffer ----------


19.7 複数のY/Nの問い合わせ

各バッファについて『バッファを保存するか』などの 一連の単純な問い合わせをする場合には、 個々に問い合わせるかわりに map-y-or-n-pを用いてまとめて問い合わせるべきです。

Function: map-y-or-n-p prompter actor list &optional help action-alist
この関数は、各問について1文字の応答をエコー領域から読み取ることで、 ユーザーに一連の問い合わせを行う。

listの値は、問い合わせ対象のオブジェクトを指定する。 オブジェクトのリストであるか、生成関数であること。 関数である場合、それは引数なしで呼ばれ、 つぎの問い合わせ対象のオブジェクトを返すか、 問い合わせの終了を意味するnilを返す。

引数prompterは、各問い合わせをどのように問うかを指定する。 prompterが文字列であると、問い合わせ文はつぎのように計算される。

 
(format prompter object)

ここで、objectは(listから得た) 問い合わせ対象のオブジェクトである。

文字列でなければ、prompterは 1引数(問い合わせ対象のオブジェクト)の関数であり、 問い合わせ文を返す。 値が文字列であれば、それがユーザーへの問い合わせ文になる。 関数は、(ユーザーに問い合わせずに) 当該オブジェクトを処理することを意味するtか、 (ユーザーに問い合わせずに)当該オブジェクトを無視することを意味する nilを返してもよい。

引数actorは、ユーザーの応答に対してどのように動作するかを指定する。 これは1引数の関数であり、ユーザーが「はい」と答えたオブジェクトで 呼ばれる。 引数は、つねにlistから得たオブジェクトである。

引数helpを指定する場合、つぎの形のリストであること。

 
(singular plural action)

ここで、 singularは操作対象のオブジェクトを 記述する単数形の名詞を含んだ文字列であり、 pluralは対応する複数形の名詞であり、 actionは動作を記述する他動詞であること。

helpを指定しないと、デフォルトは ("object" "objects" "act on")である。

各問い合わせでは、ユーザーは当該対象オブジェクトに対する操作に yYSPCで答える。 nNDELは、そのオブジェクトを無視する。 !はそのオブジェクトを含めて後続のものも処理する。 ESCqは(後続のオブジェクトをすべて無視して)抜ける。 .(ピリオド)は現在の対象オブジェクトを処理してから抜ける。 C-hはヘルプメッセージを表示する。 これらは、query-replaceが受け付ける応答と同じである。 キーマップquery-replace-mapが、 query-replaceと同様に map-y-or-n-pに対する(応答の)意味を定義する。 33.5 探索と置換を参照。

action-alistを使って、 可能な応答とそれらの意味を追加指定することもできる。 これは、(char function help)の形の要素から成る 連想リストであり、それぞれが1つの追加応答を定義する。 この要素の中で、 charは(応答である)1つの文字、 functionは1引数(listからのオブジェクト)の関数、 helpは文字列である。

ユーザーがcharで答えると、 map-y-or-n-pfunctionを呼び出す。 これがnil以外を返せば、当該オブジェクトを『処理』したとみなして、 map-y-or-n-plistのつぎのオブジェクトに移る。 nilであると、同じオブジェクトについてプロンプトを繰り返す。

map-y-or-n-pがマウスを使って起動されたコマンドから呼ばれると、 より正確には、last-nonmenu-event(see section 20.4 コマンドループからの情報)が、 nilかリストであると、 関数は問い合わせのための対話ボックスやポップアップメニューを使う。 その場合、キーボード入力やエコー領域は使わない。 呼び出しにおいてlast-nonmenu-eventに適切な値を束縛することで マウスかキーボード入力の使用を強制できる。

map-y-or-n-pの戻り値は、処理したオブジェクトの個数である。


19.8 パスワードの読み取り

別のプログラムへ渡すパスワードを読み取るには、 関数read-passwdを使います。

Function: read-passwd prompt &optional confirm default
この関数は、プロンプトpromptを表示してパスワードを読み取る。 ユーザーが入力するパスワードは表示せず、 そのかわりにパスワードの各文字ごとに`.'を表示する。

省略可能な引数confirmnil以外であると、 パスワードを2回読み取り、両者が同一である必要がある。 同一でないと、連続して2回同じパスワードを打つまで ユーザーは何度でも繰り返す必要がある。

省略可能な引数defaultは、ユーザーが空のパスワードを 入力したときに返すデフォルトのパスワードを指定する。 defaultnilであると、 read-passwdはそのような場面では空文字列を返す。


19.9 ミニバッファに関するその他

本節では、ミニバッファに関係する他の基本関数や変数について述べます。

コマンド: exit-minibuffer
このコマンドは活性なミニバッファから抜ける。 通常、ミニバッファのローカルキーマップでキーにバインドされる。

コマンド: self-insert-and-exit
このコマンドは(20.4 コマンドループからの情報last-command-charにある) 最新のキーボード入力文字を活性なミニバッファに挿入してから抜ける。

コマンド: previous-history-element n
このコマンドは、ミニバッファの内容を n番目まえの(古い)履歴要素の値で置き換える。

コマンド: next-history-element n
このコマンドは、ミニバッファの内容を n番目先のより新しい履歴要素の値で置き換える。

コマンド: previous-matching-history-element pattern
このコマンドは、ミニバッファの内容を pattern(正規表現)に一致するまえの(古い)履歴要素の値で置き換える。

コマンド: next-matching-history-element pattern
このコマンドは、ミニバッファの内容を pattern(正規表現)に一致するつぎの(新しい)履歴要素の値で置き換える。

Function: minibuffer-prompt
この関数は、現在活性なミニバッファのプロンプト文字列を返す。 活性なミニバッファがなければnilを返す。

Function: minibuffer-prompt-width
この関数は、現在活性なミニバッファのプロンプト文字列の表示幅を返す。 活性なミニバッファがなければ0を返す。

Variable: minibuffer-setup-hook
ミニバッファに入るたびに実行されるノーマルフック。 see section 22.6 フック

Variable: minibuffer-exit-hook
ミニバッファから抜けるたびに実行されるノーマルフック。 see section 22.6 フック

Variable: minibuffer-help-form
この変数の現在値は、 ミニバッファの内側でhelp-formのローカルな束縛に使われる。 (see section 23.5 ヘルプ機能)。

Function: active-minibuffer-window
この関数は、現在活性なミニバッファのウィンドウを返す。 あるいは、活性なミニバッファがなければnilを返す。

Function: minibuffer-window &optional frame
この関数は、フレームframeで使われるミニバッファ用ウィンドウを返す。 framenilであると、カレントフレームを意味する。 フレームで使うミニバッファ用ウィンドウは、 そのフレームの一部である必要はない。 ミニバッファを持たないフレームでは、 他のフレームのミニバッファ用ウィンドウを使う。

Function: window-minibuffer-p window
この関数は、windowがミニバッファ用ウィンドウであると nil以外を返す。

与えられたウィンドウがミニバッファ用であるかどうかを調べるために、 (minibuffer-window)の戻り値と比較するのは正しくありません。 というのは、フレームが複数個あると 複数のミニバッファ用ウィンドウがあるからです。

Function: minibuffer-window-active-p window
この関数は、ミニバッファ用ウィンドウwindowが活性であると nil以外を返す。

Variable: minibuffer-scroll-window
この変数の値がnil以外であると、 値はウィンドウオブジェクトであること。 ミニバッファで関数scroll-other-windowが呼ばれると、 scroll-other-windowはこのウィンドウをスクロールする。

最後に、再帰ミニバッファ(see section 20.11 再帰編集)を扱う 関数と変数について述べます。

Function: minibuffer-depth
この関数は、活性なミニバッファの現在の深さを非負整数で返す。 活性なミニバッファがなければ0を返す。

User Option: enable-recursive-minibuffers
この変数がnil以外であると、 ミニバッファ用ウィンドウが活性であっても、 (find-fileなどの)ミニバッファを使うコマンドを起動できる。 そのような起動では、新たなミニバッファに対する再帰編集レベルが作られる。 内側の(深い)ミニバッファを編集中には、 外側の(浅い)レベルのミニバッファは見えない。

この変数がnilであると、 ミニバッファ用ウィンドウが活性なときには、 別のウィンドウに切り替えたとしてもミニバッファコマンドは使えない。

コマンド名にnil以外の 属性enable-recursive-minibuffersがあると、 当該コマンドをミニバッファから起動したときでさえ、 当該コマンドはミニバッファを使って引数を読み取れます。 ミニバッファコマンドnext-matching-history-element (ミニバッファでは通常M-s)は、この機能を使っています。


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Akihiro Sagawa on January, 21 2003 using texi2html