GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Multiple-Queries.html ・ emacs-doc.conao3.com

21.8 多肢選択式問題の出題

このセクションでは、ユーザーにさらに複雑な質問や、類似した複数の質問を行うための機能について説明します。

「このバッファを保存しますか?」といった類似の質問を、各バッファに対して順次行う場合は、個々の質問を一つずつ投げるのではなく、map-y-or-n-p を使用して一連の質問をまとめて行うべきです。これにより、ユーザーは一連の質問に一度で回答できるなど、便利な機能を利用できます。

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

この関数はユーザーに一連の質問を行い、その都度ミニバッファから1文字の回答を読み取ります。ただし、y-or-n-p-use-read-key が nil 以外である場合(キーシーケンス入力 を参照)、エコー領域からキーシーケンスを読み取ります。

list の値で、質問対象のオブジェクトを指定します。オブジェクトのリストか、ジェネレータ関数のいずれかである必要があります。関数の場合は引数なしで呼び出され、次に質問するオブジェクトか、質問を停止することを意味する nil のいずれかを返す必要があります。

引数 prompter は、各質問の仕方を指定します。prompter が文字列の場合、質問文は次のように計算されます:

(format prompter object)

ここで object は、次に問い合わせる対象(list から得られたもの)です。format の詳細については、文字列の書式指定を参照してください。

prompter が文字列でない場合は、1つの引数(問い合わせ対象のオブジェクト)を受け取り、そのオブジェクトに対する質問文を返す関数である必要があります。prompter が返す値が文字列である場合、それがユーザーに問いかける質問となります。また、この関数は t(ユーザーに問い合わせずにこのオブジェクトを処理する)または nil(このオブジェクトを黙って無視する)を返すこともできます。

引数 actor は、ユーザーが「はい」と答えたオブジェクトに対してどのように処理を行うかを指定します。これは単一引数の関数である必要があり、ユーザーが「はい」と答えた list 以降の各オブジェクトに対して呼び出されます。

引数 help が指定された場合、以下の形式のリストである必要があります:

(singular plural action)

ここで、singularは操作対象となる単一の対象を表す単数名詞を含む文字列、pluralはそれに対応する複数名詞、actionはactorが対象に対して何を行うかを表す他動詞である。

helpを指定しない場合は、デフォルトでリスト("object" "objects" "act on")が使用されます。

質問がされるたびに、ユーザーは次のように回答できます。

y、Y、またはSPC

対象に作用する

n、N、またはDEL

オブジェクトをスキップ

!

以下のすべての対象に対して作用する

ESC または q

終了(以降のオブジェクトをすべてスキップ)

. (ピリオド)

オブジェクトに対して操作を行い、その後終了する

C-h

助けを求める

これらは query-replace が受け付ける回答と同じものです。キーマップ query-replace-map は、map-y-or-n-p および query-replace に対するこれらの意味を定義しています。検索と置換 を参照してください。

action-alist を使用して、追加の候補となる回答とその意味を指定できます。指定する場合、action-alist は要素が (char function help) の形式であるアリスタである必要があります。アリスタの各要素は、1つの追加回答を定義します。各要素において、char は文字(回答)、function は1つの引数(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 の戻り値は、操作対象となったオブジェクトの数です。

2つを超える回答が考えられる質問をユーザーに投げかける場合は、read-answerを使用してください。

関数: read-answer question answers

この関数は、question にテキストを含むプロンプトをユーザーに提示します。このテキストは ‘SPC’ という文字で終わる必要があります。また、question の末尾に追記する形で、考えられる応答を answers としてプロンプトに含めます。考えられる応答は answers にアリストとして提供され、その要素は以下の形式となります:

(long-answer short-answer help-message)

ここで、long-answerはユーザー応答の全文(文字列)、short-answerは同一応答の短縮形式(単一文字またはファンクションキー)、help-messageは回答の意味を説明するテキストです。変数read-answer-shortがnil以外の場合、プロンプトには考えられる回答の短縮形式が表示され、ユーザーはプロンプトに表示された単一の文字/キーを入力することになります。それ以外の場合、プロンプトには回答の詳細形式が表示され、ユーザーは回答のいずれかの全文を入力し、最後にRETを押して終了することになります。use-dialog-boxが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"))))
関数: read-char-from-minibuffer prompt &optional chars history

この関数はミニバッファを使用して1文字を読み込み、返します。オプションで、許容される文字のリストである chars に含まれない入力は無視します。引数 history は使用する履歴リストのシンボルを指定します。これが省略されているか、あるいは nil である場合、この関数は履歴を使用しません。

read-char-from-minibuffer を呼び出す際に help-form(ヘルプ関数 を参照)を nil 以外の値にバインドすると、help-char を押すことで help-form が評価され、その結果が表示されます。