このセクションではユーザーにyes-or-noの確認を求める関数を説明します。関数y-or-n-p
は1文字での応答に使用できます。この関数は不注意による誤った答えが深刻な結果を招かない場合に有用です。yes-or-no-p
は3文字から4文字の答えを要求するので、より重大な問いに適しています。
3つの関数はいずれもマウスを使用して呼び出されたコマンドの場合、より正確にはlast-nonmenu-event
(コマンドループからの情報を参照)がnil
かリストの場合は、問いに答えるためにダイアログボックスまたはポップアップメニューを使用します。それ以外の場合はキーボード入力を使用します。呼び出しの周囲でlast-nonmenu-event
に適切な値をバインドすることにより、マウスあるいはキーボードの使用を強制できます。
yes-or-no-p
とy-or-n-p
はどちらもミニバッファーを使用します。
この関数はユーザーに答えを尋ねてミニバッファーに入力を求める。ユーザーがyをタイプしたらt
、nをタイプしたらnil
をリターンする。この関数はyesの意味でSPC、noの意味でDELも受け入れる。quitとしてC-gとC-]も受け入れる。これは問いがミニバッファーを使用して、かつミニバッファーを抜けるためにユーザーがC-]の使用を試みるかもしれないということが理由。応答は1文字であり、問いを終了させるためのRETは必要ない。大文字と小文字は等価である。
“答えを尋ねる”とはミニバッファーにprompt、その後に文字列‘(y or n) ’をプリントすることを意味する。期待される答え(y、n、SPC、DEL、もしくは質問を終了するその他のキー)以外が入力されると、この関数は‘Please answer y or n.’と応答して繰り返し答えの入力を要求する。
この関数は実際にはミニバッファーを使用するが答えの編集を許容しない。答えを求めているる間、カーソルはモイニバッファーに移動される。
答えとその意味は、たとえ‘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) ’を表示することによって開始される。ユーザーは期待される応答の1つをタイプしなければならない。それ以外の答えなら、この関数は‘Please
answer yes or no.’と応答して約2秒待った後に要求を繰り返す。
yes-or-no-p
はy-or-n-p
より多くの作業をユーザーに要求するので、より重大な決定に適している。
以下は例:
(yes-or-no-p "Do you really want to remove everything?") ;; 前の式を評価した後、 ;; 空のミニバッファーに ;; 以下のプロンプトが表示される:
---------- 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 ----------