このセクションではより複雑な質問や複数の似かよった質問をユーザーに尋ねる機能を説明します。
同じような連続する質問と答えがある場合、たとえば各バッファーにたいして順に“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から得られる)質問する次のオブジェクトである。format
についての詳細は文字列のフォーマットを参照のこと。
prompterが文字列でなければ、1つの引数(質問する次のオブジェクト)をとる関数であり、そのオブジェクトにたいする質問テキストをリターンすること。値が文字列ならユーザーに問う質問であること。関数はt
(ユーザーに尋ねずこのオブジェクトを処理する)、またはnil
(ユーザーに尋ねずこのオブジェクトを無視する)をリターンすることもできる。
引数actorはユーザーがyesと答えにたいして、どのように作処理するかを指定する。これはlistから取得したそれぞれのオブジェクトであるを単一の引数として呼び出される関数であること。
引数helpが与えられたら、それは以下の形式のリストである:
(singular plural action)
singularは処理するオブジェクトを説明する単数形の名詞を含む文字列、pluralはそれに対応する複数形の名詞、actionはactorがオブジェクトに何を行うかを説明する他動詞である。
helpを指定しない場合のリストのデフォルトは("object" "objects" "act on")
。
尋ねられる質問ごとにユーザーは以下のように答えることができる:
そのオブジェクトを処理する
そのオブジェクトをスキップ
以降のオブジェクトをすべて処理する
exit(以降のオブジェクトすべてをスキップ)する
そのオブジェクトを処理してからexitする
ヘルプを表示する
これらはquery-replace
が受け入れる応答と同じである。キーマップquery-replace-map
がmap-y-or-n-p
やquery-replace
にたいして、これらの応答の意味を定義する。検索と置換を参照のこと。
action-alistを使用して、利用できる追加の答えとそれらが何を意味するかを指定できる。action-alistが与えられた場合には、要素が(char function help)
という形式のalistであること。alistの要素はそれぞれ追加の答えを1つ定義する。各要素のcharは文字(応答)、functionは単一の引数(
listのオブジェクト)、helpは文字列。ユーザーがcharで応答した際には、map-y-or-n-p
はfunctionを呼び出す。非nil
をリターンすると、オブジェクトを処理対象とみなして、map-y-or-n-p
はlistの次オブジェクトに処理を進める。nil
をリターンした場合には、同じオブジェクトにたいして繰り返し入力を求める。ユーザーがヘルプを要求した場合には、これらの追加質問を説明するためにhelpのテキストを使用する。
確認を求める間、map-y-or-n-p
は通常はcursor-in-echo-area
をバインドする。しかしno-cursor-in-echo-areaが非nil
ならバインドしない。
マウスやその他ウィンドウシステムのジェスチャー、あるいはメニュー経由で呼び出されたコマンドからmap-y-or-n-p
が呼び出された場合には、ダイアログボックスがサポートされていれば質問の答えを求めるためにダイアログボックスかポップアップメニューが使用される。この場合にはキーボード入力やエコーエリアは使用されない。呼び出しの前後でlast-nonmenu-event
を適切な値にバインドすることによって、マウスあるいはキーボード入力を強制できる。t
ならキーボードによる対話、リストにバインドすればダイアログボックスの使用が強制される。
map-y-or-n-p
のリターン値は処理したオブジェクトの個数である。
3つ以上の答えをもつかもしれない質問をユーザーに尋ねる必要がある場合にはread-answer
を使用してください。
この関数はquestionのテキスト( ‘SPC’文字で終端されていること)とともにユーザーに入力を求める。この関数はquestionにanswersを追加することにより、プロンプト内に可能な応答を含めることができる。この可能な応答は以下の形式の要素をもつ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"))))
この関数はミニバッファーを使用して単一文字を読み取りリターンする。オプションで許容する文字のリストchars以外のメンバーはすべて無視する。history引数は使用するヒストリーリストシンボルを指定する。これが省略かnil
なら、この関数はヒストリーを使用しない。
read-char-from-minibuffer
の呼び出し中にhelp-form
(ヘルプ関数を参照)を非nil
値にバインドすると、help-char
の押下によりhelp-form
を評価して結果を表示する。