次: Multiple Queries, 前: Completion, 上: Minibuffers
本節ではユーザーにyes/noを問い合わせるための関数について述べます。
関数y-or-n-p
には、1文字で答えます。
誤った答えでも重大な問題に至らないような問い合わせに便利です。
yes-or-no-p
には3文字か4文字で答える必要があるため、
より重要な問い合わせに適しています。
これらの関数がマウスを使って起動されたコマンドから呼ばれると、
より正確には、last-nonmenu-event
(see Command Loop Info)が
nil
かリストであると、
関数は問い合わせのための対話ボックスやポップアップメニューを使います。
さもなければ、キーボード入力を使います。
呼び出しにおいてlast-nonmenu-event
に適切な値を束縛することで
マウスかキーボード入力の使用を強制できます。
厳密にいえば、yes-or-no-p
はミニバッファを使いますが、
y-or-n-p
は使いません。
ですが、両者をここで説明しておきます。
この関数はユーザーに問い合わせ、エコー領域で入力を待ちます。 ユーザーがyを打てば
t
を返し、 nを打てばnil
を返します。 さらに、<SPC>を「y」、<DEL>を「n」ともみなします。 C-]をC-gのように『中断』ともみなします。 というのは、問い合わせはミニバッファを使っているようにみえるので、 これから抜けるためにユーザーがC-]を使いそうだからである。 応答は1文字であり、<RET>で終える必要はない。 大文字と小文字は同じ意味である。『問い合わせ』では、エコー領域にpromptを表示し、 文字列`(y or n) 'が続きます。 入力が正しい応答(y、n、<SPC>、 <DEL>、中断など)でないと、 関数は`Please answer y or n.'を表示して 問い合わせるを繰り返す。
応答は編集できないので、この関数は実際にはミニバッファを使わない。 ミニバッファが使うのと同じ画面領域を使う エコー領域(see The Echo Area)を実際には使う。 問い合わせ中は、カーソルはエコー領域に移動する。
応答とその意味は、 たとえ`y'や`n'であっても組み込まれているわけではない。 キーマップ
query-replace-map
がそれらを指定する。 see Search and Replace。以下の例では、ユーザーはまずqを打つが、これは正しくない。 つぎのプロンプトに対して、ユーザーはyを打つ。
(y-or-n-p "Do you need a lift? ") ;; 上の式を評価後には、エコー領域には ;; つぎのプロンプトが表示される ---------- Echo area ---------- Do you need a lift? (y or n) ---------- Echo area ---------- ;; ユーザーがqを打つと、つぎのようになる ---------- Echo area ---------- Please answer y or n. Do you need a lift? (y or n) ---------- Echo area ---------- ;; ユーザーが正しい応答を打つと ;; 問い合わせのうしろに表示される ---------- Echo area ---------- Do you need a lift? (y or n) y ---------- Echo area ----------ここでは、エコー領域のメッセージを複数行示したが、 実際には、1度に1つのメッセージだけが表示される。
y-or-n-p
と同様だが、ユーザーがseconds秒以内に答えないと、 入力を待たずにdefault-valueを返す。 これにはタイマを使う。 Timersを参照。 引数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 ----------