(read-command ...)在空白输入时返回奇怪的对象

时间:2013-10-01 01:59:03

标签: emacs elisp string-interning

我需要使用read-command提示用户输入命令,然后根据用户是否在迷你缓冲区中输入空字符串来执行操作。

大多数情况下,read-command会返回有效命令。但是当用户输入一个空白字符串时(只需按下迷你缓冲区中的输入),就会返回一个奇怪的对象,既不是nil,也不是字符串,也不是命令(根据stringp和{ {1}})。

commandp

我怎么能:

  1. 访问此对象的读取语法?
  2. 确定对象的类型,而不匹配定义的每个类型谓词here
  3. 测试此对象是否相等?
  4. 为什么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
  5. 的规范
      

    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似乎也不存在。非常令人沮丧的东西,我会感激任何指针。

1 个答案:

答案 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.

阅读完整说明。但这一点应该有助于你理解。返回的值是 符号 ,其名称为空。