在下一个参数的初始值中使用先前的交互参数

Use previous interactive argument in initial value for the next parameter

我需要访问之前输入的交互参数,以便将其用作下一个参数的初始值。为了阐明我的意思,考虑一个重命名缓冲区的示例函数:

(defun my/rename-buffer (old-name new-name)
  (interactive (list (read-buffer "Buffer to rename: " (current-buffer) t)
                     (read-string "Rename buffer to: ")))
  ;; Implementation here.
)

如何访问为 old-name 输入的值,以便我可以将其用作 new-name 提示符的初始值?

让我更详细地解释一下。当我们执行 M-x my/example 时,会提示用户(假设 *scratch* 是当前缓冲区):

Buffer to rename (default *scratch*):
Rename buffer to:

如果用户接受第一个提示的默认值(*scratch*),我希望第二个提示使用*scratch作为显示给用户的初始值:

Rename buffer to: *scratch*

如果用户为第一个提示输入了不同缓冲区的名称,比如 another-buffer,第二个提示应该将 another-buffer 作为初始值:

Rename buffer to: another-buffer

所以第二个提示应该始终使用第一个参数的值作为第二个提示的初始值。

为清楚起见,一些注释:

interactive,当给定一个 lisp 形式时,简单地计算该形式以获得一个列表。你可以任何东西以这种形式,前提是最终return值是函数参数的适当值列表。

(defun my/rename-buffer (old-name new-name)
  (interactive
   (let* ((old (read-buffer "Buffer to rename: " (current-buffer) t))
          (new (read-string "Rename buffer to: " old)))
     (list old new)))
  ;; ...
  )