我需要使用read-command
提示用户输入命令,然后根据用户是否在迷你缓冲区中输入空字符串来执行操作。
大多数情况下,read-command
会返回有效命令。但是当用户输入一个空白字符串时(只需按下迷你缓冲区中的输入),就会返回一个奇怪的对象,既不是nil
,也不是字符串,也不是命令(根据stringp
和{ {1}})。
commandp
我怎么能:
ELISP> (setq strange-object (read-command "Enter some command" nil) )
ELISP> (equal nil strange-object)
nil
ELISP> (if strange-object "YES" "NO")
"YES"
ELISP> (mapcar (lambda (fun) (funcall fun strange-object)) (list 'stringp 'commandp 'char-or-string-p 'functionp 'integerp 'listp) )
(nil nil nil nil nil nil)
ELISP> (prin1-to-string strange-object)
""
ELISP> (equal "" strange-object)
nil
行为不端? read-command
:read-command是`minibuf.c'中的内置函数。
(读命令PROMPT&可选DEFAULT-VALUE)
读取命令的名称并作为符号返回。提示提示。 默认情况下,如果是列表,则返回DEFAULT-VALUE或其第一个元素。
[返回]
我期待read-command
,因为这是我传递给nil
的内容,但显然DEFAULT-VALUE
并不关心。
我已经尝试加载read-command
的来源,看看发生了什么,但我也无法让它发挥作用。我已经从here下载了minibuf.c
,并让emacs在那里查找源代码,但是无法找到它。那里emacs-23.3b.tar.gz
似乎也不存在。非常令人沮丧的东西,我会感激任何指针。
答案 0 :(得分:3)
Elisp手册是你的朋友。 C-h i
,选择Elisp。然后i
并输入read-command
。作为描述的一部分,您会看到:
The argument DEFAULT specifies what to return if the user enters
null input. It can be a symbol, a string or a list of strings.
If it is a string, `read-command' interns it before returning it.
If it is a list, `read-command' interns the first element of this
list. If DEFAULT is `nil', that means no default has been
specified; then if the user enters null input, the return value is
`(intern "")', that is, a symbol whose name is an empty string.
阅读完整说明。但这一点应该有助于你理解。返回的值是 符号 ,其名称为空。