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


19.7 Yes-or-Noによる問い合わせ

このセクションではユーザーにyes-or-noの確認を求める関数を説明します。関数y-or-n-pは1文字での応答に使用できます。この関数は不注意による誤った答えが深刻な結果を招かない場合に有用です。yes-or-no-pは3文字から4文字の答えを要求するので、より重大な問いに適しています。

3つの関数はいずれもマウスを使用して呼び出されたコマンドの場合、より正確にはlast-nonmenu-event (Command Loop Infoを参照)がnilかリストの場合は、問いに答えるためにダイアログボックスまたはポップアップメニューを使用します。それ以外の場合はキーボード入力を使用します。呼び出しの周囲でlast-nonmenu-eventに適切な値をバインドすることにより、マウスあるいはキーボードの使用を強制できます。

厳密に言うとyes-or-no-pはミニバッファーを使用して、y-or-n-pは使用しませんが、これらのコマンドは一緒に説明したほうがよいでしょう。

Function: y-or-n-p prompt

この関数はユーザーに答えを尋ねてミニバッファーに入力を求める。ユーザーがyをタイプしたらtnをタイプしたらnilをリターンする。この関数はyesの意味でSPC、noの意味でDELも受け入れる。quitとしてC-gと同様にC-]も受け入れる。これは問いがミニバッファーのような外見をもち、ミニバッファーを抜けるためにユーザーがC-]の使用を試みるかもしれないという理由による。応答は1文字であり、問いを終了させるためのRETは必要ない。大文字と小文字は等価である。

“答えを尋ねる”とはエコーエリアにprompt、その後に文字列‘(y or n) をプリントすることを意味する。期待される答え(ynSPCDEL、もしくは質問を終了するその他のキー)以外が入力されると、この関数は‘Please answer y or n.’と応答して繰り返し答えの入力を要求する。

この関数は答えの編集を許さないので、実際にはミニバッファーを使用しない。実際に使用するのはミニバッファーと同じスクリーンスペースを使用するエコーエリア(The Echo Areaを参照)である。問いが答えられるまでカーソルはエコーエリアに移動される。

答えとその意味は、たとえ‘y’と‘n’であっても固定されたものではなく、キーマップquery-replace-mapによって指定される(Search and Replaceを参照)。特にユーザーがrecenterscroll-upscroll-downscroll-other-windowscroll-other-window-down(それぞれquery-replace-map内でC-lC-vM-vC-M-vC-M-S-vにバインドされている)のような特殊な応答をエンターした場合、この関数はは指定されたウィンドウの再センタリングやスクロール操作を処理してから再度答えを求める。

エコーエリアのメッセージを連続する行で示しているが、スクリーン上に実際に表示されるのは一度に1行だけである。

Function: y-or-n-p-with-timeout prompt seconds default

y-or-n-pと同様だがユーザーがseconds秒以内に答えないと、この関数は待つのをやめてdefaultをリターンする。これはタイマーをセットアップすることによって機能する。引数secondsは数字である。

Function: yes-or-no-p prompt

この関数は質問してミニバッファーに答えの入力を求める。これはユーザーが‘yes’をエンターするとt、‘no’をエンターするとnilをリターンする。ユーザーは応答を終えるためにRETをタイプしなければならない。大文字と小文字は等価。

yes-or-no-pはエコーエリアにpromptとその後に‘(yes or no) を表示することによって開始される。ユーザーは期待される応答の1つをタイプしなければならない。それ以外の答えなら、この関数は‘Please answer yes or no.’と応答して約2秒待った後に要求を繰り返す。

yes-or-no-py-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 ----------