本節では、ユーザーにはい・いいえで答える質問を行うための関数について説明します。関数 y-or-n-p は1文字で回答でき、意図しない誤答をしても重大な影響が出ないような質問に有用です。yes-or-no-p は回答に3〜4文字を要するため、より重要な質問に適しています。
これらの関数のいずれかが、マウスやその他のウィンドウシステムのジェスチャーを用いて呼び出されたコマンド、あるいはメニュー経由で呼び出されたコマンド内で実行される場合、ダイアログボックスがサポートされていれば、ダイアログボックスまたはポップアップメニューを使用して質問を行います。そうでない場合は、キーボード入力を使用します。呼び出し箇所の周辺で
last-nonmenu-event
に適切な値をバインドすることで、マウス入力またはキーボード入力のいずれかを強制的に使用させることができます。具体的には、t
にバインドすればキーボード操作を、リストにバインドすればダイアログボックスを強制的に使用させることができます。
yes-or-no-p と y-or-n-p
はどちらもミニバッファを使用します。
この関数はユーザーに質問を行い、ミニバッファへの入力を待機します。ユーザーが y と入力した場合は
t を、n と入力した場合は nil を返します。また、SPC を「はい」、DEL を「いいえ」として受け付けます。質問にミニバッファを使用しているため、ユーザーが C-] を使って終了しようとする可能性があり、終了用の C-] および
C-g も受け付けます。回答は単一の文字であり、終了させるための RET は不要です。大文字と小文字は区別されません。
「質問する」とは、ミニバッファに prompt を出力し、続いて文字列 ‘(y or n) ’ を出力することを意味します。入力が想定される回答(y、n、SPC、DEL、または終了させるもの)のいずれでもない場合、関数は ‘Please answer y or n.’ と応答し、リクエストを繰り返します。
prompt が空でない文字列であり、かつ末尾がスペース以外の文字である場合、そこに ‘SPC’ という文字が付加されます。
この関数は実際にミニバッファを使用しますが、回答の編集はできません。質問が行われている間、カーソルはミニバッファに移動します。
回答とその意味(「y」や「n」でさえも)はハードコードされておらず、キーマップ query-replace-map によって指定されています(検索と置換 を参照)。特に、ユーザーが特殊応答 recenter、scroll-up、scroll-down、scroll-other-window、または scroll-other-window-down(それぞれ query-replace-map 内の C-l、C-v、M-v、C-M-v、C-M-S-v
にバインドされています)を入力した場合、この関数は指定されたウィンドウの再センタリングまたはスクロール操作を実行し、再度質問を表示します。
y-or-n-p を呼び出す際に help-form(ヘルプ関数 を参照)を nil
以外の値にバインドすると、help-char を押すことで help-form が評価され、その結果が表示されます。help-char は prompt に自動的に追加されます。
y-or-n-pと同様ですが、ユーザーがseconds秒以内に応答しなかった場合、この関数は待機を停止してdefaultを返します。タイマーを設定することで動作します。詳細は遅延実行用のタイマーを参照してください。引数secondsには数値を指定する必要があります。
この関数はユーザーに質問を行い、ミニバッファへの入力を待機します。ユーザーが ‘yes’ と入力した場合は t
を、‘no’ と入力した場合は nil を返します。応答を確定するには、ユーザーは RET
と入力する必要があります。大文字と小文字は区別されません。
yes-or-no-p は、まずミニバッファに prompt を表示し、続いて yes-or-no-prompt
の値(デフォルトは ‘(yes or no) ’)を表示します。ユーザーは想定される応答のいずれかを入力する必要があります。そうでない場合、関数は
‘Please answer yes or no.’
と応答し、約2秒間待機した後、リクエストを繰り返します。
prompt が空でない文字列であり、かつ末尾がスペース以外の文字である場合、そこに ‘SPC’ という文字が付加されます。
yes-or-no-pはy-or-n-pよりもユーザーの手間がかかり、より重要な判断に適しています。
以下に例を示します。
(yes-or-no-p "Do you really want to remove everything? ") ;; After evaluation of the preceding expression, ;; the following prompt appears, ;; with an empty minibuffer:
---------- 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 ----------