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

时间:2017-04-03 21:07:37

标签: emacs elisp

我需要访问先前输入的交互式参数,以便我可以将它用作下一个参数的初始值。为了澄清我的意思,请考虑一个重命名缓冲区的示例函数:

(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

因此第二个提示应始终使用第一个参数的值作为第二个提示的初始值。

为清晰起见,请注意:

  • 我对my/rename-buffer的具体示例不感兴趣,因为标准rename-buffer工作正常。这只是一个例子。

  • 我正在寻找一种不涉及使用字符串作为 arg-descriptor 的解决方案。我需要用现有的 arg-descriptor 组成解决方案,这些是表达式列表。我不相信它们可以重新实现为字符串,但即使它们可以,我也不会对这种解决方案感兴趣。

  • 我不希望将最后一个值显示为只读提示字符串的一部分,而是希望将其用作提示字符串后显示的可修改初始值。

    < / LI>
  • 用户按访问上一个参数不是解决方案,因为我不想要求用户交互来获取最后一个值。我也可能(将来或不同的功能)希望显示最后一个值的略微修改版本,而不是逐字显示。如果提示的类型不同,这样的解决方案也不会起作用,因为它们的历史记录不同。

1 个答案:

答案 0 :(得分:1)

interactive,当给出lisp表单时,只需评估该表单以获取列表。如果最终返回值是函数参数的适当值列表,则可以在该表单中执行任何

(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)))
  ;; ...
  )