Next: Reading a Password, Previous: Yes-or-No Queries, Up: Minibuffers [Contents][Index]
同じような連続する質問と答えがある場合、たとえば各バッファーにたいして順に“Do you want to save this
buffer?”と確認を求めるような場合には、個別に質問するよりmap-y-or-n-p
を使用して質問のコレクションを尋ねるべきです。これはユーザーにたいして、質問全体にたいして1回で答えられるような便利な機能を提供します。
この関数はユーザーに一連の質問をし、それぞれの質問にたいしてエコーエリア内の1文字の答えを読み取る。
値listは質問をするオブジェクトを指定する。これはリスト、オブジェクト、または生成関数(generator
function)のいずれかである。関数の場合は引数なしで次に質問するオブジェクト、または質問の中止を意味するnil
のいずれかをリターンする。
引数prompterは各質問について問い合わせ方法を指定する。prompterが文字列なら質問テキストは以下のようになる:
(format prompter object)
ここでobjectは、(listから得られる)質問する次のオブジェクトである。
文字列でないければ、prompterは1つの引数(質問する次のオブジェクト)をとる関数で、質問テキストをリターンする。値が文字列ならユーザーに問う質問であること。関数はt
(ユーザーに尋ねずこのオブジェクトを処理する)、またはnil
(ユーザーに尋ねずこのオブジェクトを無視する)をリターンすることもできる。
引数actorはユーザーが与えた答えにたいして、どのように処理するかを指定する。これは引数が1つの関数で、ユーザーがyesと答えたオブジェクトを引数として呼び出される。引数は常にlistから取得したオブジェクトである。
引数helpが与えられたら、それは以下の形式のリストである:
(singular plural action)
singularはそのオブジェクトが概念的に何に作用するかを説明する単数形の名詞を含む文字列、pluralはそれに対応する複数形の名詞、actionはactorが何を行うかを説明する他動詞である。
helpを指定しない場合のデフォルトは("object" "objects" "act on")
。
質問のたびに、ユーザーはそのオブジェクトを処理するならy、YまたはSPC、そのオブジェクトをスキップするならn、N、またはDEL、以降のすべてのオブジェクトを処理するなら!、exit(以降のすべてのオブジェクトをスキップ)するならESCかq、カレントオブジェクトを処理した後にexitするなら.(ピリオド)、ヘルプを入手する場合はC-hをエンターする。これらはquery-replace
が受け入れるのと同じ答えである。キーマップquery-replace-map
はmap-y-or-n-p
にたいするそれらの意味を定義して、query-replace
にたいしても同様に定義する。Search and Replaceを参照のこと。
action-alistを使用して、利用できる追加の答えとそれらが何を意味するかを指定できる。これは要素が(char
function
help)
という形式のalistで、それぞれの要素が追加の答えを1つ定義する。要素の内容はcharが文字(答え)、functionが引数が1つ(listから取得するオブジェクト)の関数、helpが文字列である。
ユーザーの応答がcharなら、map-y-or-n-p
はfunctionを呼び出す。これが非nil
をリターンしたらそのオブジェクトが処理されたと判断して、map-y-or-n-p
はlist内の次のオブジェクトに進む。nil
をリターンしたら同じオブジェクトにたいして質問を繰り返す。
確認を求める間、map-y-or-n-p
は通常はcursor-in-echo-area
をバインドする。しかしno-cursor-in-echo-areaが非nil
ならバインドしない。
マウスを使用して呼び出されたコマンドからmap-y-or-n-p
が呼び出された場合(より正確にはlast-nonmenu-event
は非nil
かリストの場合。Command Loop Infoを参照)には、確認を求めるためにダイアログボックスかポップアップメニューが使用される。この場合にはキーボード入力やエコーエリアは使用されない。呼び出しの前後でlast-nonmenu-event
を適切な値にバインドすることによって、マウスあるいはキーボードの入力を強制できる。
map-y-or-n-p
のリターン値は処理したオブジェクトの個数である。