Next: , Previous: , Up: Minibuffers   [Contents][Index]


20.8 複数の問いを尋ねる

このセクションではより複雑な質問や複数の似かよった質問をユーザーに尋ねる機能を説明します。

同じような連続する質問と答えがある場合、たとえば各バッファーにたいして順に“Do you want to save this buffer?”と確認を求めるような場合には、個別に質問するよりmap-y-or-n-pを使用して質問のコレクションを尋ねるべきです。これはユーザーにたいして、質問全体にたいして1回で答えられるような便利な機能を提供します。

Function: map-y-or-n-p prompter actor list &optional help action-alist no-cursor-in-echo-area

この関数はユーザーに一連の質問をし、それぞれの質問にたいしてエコーエリア内の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はそれに対応する複数形の名詞、actionactorが何を行うかを説明する他動詞である。

helpを指定しない場合のデフォルトは("object" "objects" "act on")

質問のたびに、ユーザーはそのオブジェクトを処理するならyYまたはSPC、そのオブジェクトをスキップするならnN、またはDEL、以降のすべてのオブジェクトを処理するなら!、exit(以降のすべてのオブジェクトをスキップ)するならESCq、カレントオブジェクトを処理した後にexitするなら.(ピリオド)、ヘルプを入手する場合はC-hをエンターする。これらはquery-replaceが受け入れるのと同じ答えである。キーマップquery-replace-mapmap-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-pfunctionを呼び出す。これが非nilをリターンしたらそのオブジェクトが処理されたと判断して、map-y-or-n-plist内の次のオブジェクトに進む。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のリターン値は処理したオブジェクトの個数である。

3つ以上の答えをもつかもしれない質問をユーザーに尋ねる必要がある場合にはread-answerを使用してください。

Function: read-answer question answers

この関数はquestionのテキスト( ‘SPC’文字で終端されていること)とともにユーザーに入力を求める。この関数はquestionanswersを追加することにより、プロンプト内に可能な応答を含めることができる。この可能な応答は以下の形式の要素をもつalistとしてanswers内に提供される。

(long-answer short-answer help-message)

long-answerはユーザーの応答の完全なテキスト(文字列)、short-answerは同じ応答の短い形式(単一文字)、help-messageはその応答の意味を説明するテキスト。変数read-answer-shortが非nilなら可能な応答の短いバージョンをプロンプトに表示して、ユーザーがプロンプトに表示された1文字をタイプすることを期待する。それ以外なら可能な応答の長いバージョンをプロンプトに表示して、ユーザーにはプロンプトに表示された完全なテキストのいずれかを入力してから、入力完了でRETを押下することが期待される。RETが非nilかつこの関数がマウスイベントから呼び出された場合には問いと答えはGUIのダイアログボックス内に表示される。

この関数はプロンプトに表示された応答の長短やユーザーがタイプした応答とは無関係に、ユーザーがセンタクしたlong-answerのテキストをリターンする。

以下はこの関数の使用例:

(let ((read-answer-short t))
  (read-answer "Foo "
     '(("yes"  ?y "perform the action")
       ("no"   ?n "skip to the next")
       ("all"  ?! "perform for the rest without more questions")
       ("help" ?h "show help")
       ("quit" ?q "exit"))))