Emacs lisp,“交互式”如何读取缓冲区?

Emacs lisp, How `interactive' reads buffer?

例如有一个函数:

(defun testb (buf)
  (interactive "bTest: ")
  buf)

问题是 emacs 如何在内部读取这种交互形式的缓冲区?

看起来它不使用 read-buffer(或者它调用 read-buffer 作为 C 函数(并且不查看符号函数)?)。

(flet ((read-buffer (&rest args) (current-buffer)))
  (call-interactively #'testb))

它使用了 Lisp 函数 read-buffer。您显示的 interactive 规范等同于此规范:

(interactive (list (read-buffer "Test: " nil t)))

参见 Elisp 手册,节点 Using Interactive

我猜你指的是当你尝试在内置函数上使用 flet 时遇到的错误或类似错误。是的,read-buffer 是一个 subr,即在 C 中实现。(symbol-function 'read-buffer) returns 内置函数 #<subr read-buffer>.

 Use ‘labels’, not ‘flet’, to rebind macro names