本节描述用于向用户提出是/否问题的函数。
函数 y-or-n-p 只需单个字符即可回答;
适用于误操作不会造成严重后果的问题。
yes-or-no-p 适用于更重要的问题,因为它需要三到四个字符才能回答。
如果这两个函数中的任何一个在通过鼠标或其他窗口系统操作调用的命令中,
或者在通过菜单调用的命令中被调用,那么在支持对话框的情况下,
它们会使用对话框或弹出菜单提问。否则使用键盘输入。
你可以在调用周围将 last-nonmenu-event 绑定到合适的值,
强制使用鼠标或键盘输入——绑定为 t 强制键盘交互,
绑定为列表则强制使用对话框。
yes-or-no-p 和 y-or-n-p 均使用小缓冲区。
该函数向用户提出问题,期望在小缓冲区中输入。
如果用户输入 y,返回 t;
如果输入 n,返回 nil。
该函数还接受 SPC 表示是,DEL 表示否。
它接受 C-] 和 C-g 退出,
因为问题使用小缓冲区,因此用户可能会尝试用 C-] 退出。
答案是单个字符,无需按 RET 结束。大小写等效。
“提出问题”是指在小缓冲区中打印 prompt, 后跟字符串 ‘(y or n) ’。 如果输入不是预期答案之一(y、n、SPC、 DEL 或可退出的按键),函数会提示 ‘Please answer y or n.’ 并重复请求。
如果 prompt 是非空字符串,且以非空格字符结尾, 则会向其追加一个 ‘SPC’ 字符。
该函数实际使用小缓冲区,但不允许编辑答案。 提问时光标会移至小缓冲区。
答案及其含义(即使是 ‘y’ 和 ‘n’)并非固定,
而是由键盘映射 query-replace-map 指定(see Search and Replace)。
特别地,如果用户输入特殊响应 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(see 帮助函数)
绑定到非 nil 值,那么按下 help-char
会使其求值 help-form 并显示结果。
help-char 会自动添加到 prompt 中。
与 y-or-n-p 类似,区别在于如果用户在 seconds 秒内未回答,
该函数停止等待并返回 default。
它通过设置定时器工作;参见 Timers for Delayed Execution。
参数 seconds 应为数字。
该函数向用户提出问题,期望在小缓冲区中输入。
如果用户输入 ‘yes’,返回 t;
如果输入 ‘no’,返回 nil。
用户必须按 RET 确认回答。大小写等效。
yes-or-no-p 首先在小缓冲区显示 prompt,
后跟 yes-or-no-prompt 的值 (默认 ‘(yes or no) ’)。
用户必须输入预期回答之一;否则函数提示 ‘Please answer yes or no.’,
等待约两秒后重复请求。
如果 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 ----------