在下一个参数的初始值中使用先前的交互参数
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
所以第二个提示应该始终使用第一个参数的值作为第二个提示的初始值。
为清楚起见,一些注释:
我对 my/rename-buffer
的具体示例不感兴趣,因为标准 rename-buffer
工作正常。这真的只是一个例子。
我正在寻找一种不涉及使用字符串作为 arg-descriptor 的解决方案。我需要用现有的 arg-descriptors 组成解决方案,它们是表达式列表。我不相信它们可以重新实现为字符串,但即使可以,我对这样的解决方案也不感兴趣。
我不希望将最后一个值显示为只读提示字符串的一部分,而是希望将其用作提示字符串后显示的可修改初始值。
用户按 ↑ 访问前一个参数不是解决方案,因为我不想要求用户交互来获取最后一个值。我也可能(在未来或为了不同的功能)希望显示最后一个值的略微修改版本,而不是逐字显示它。如果提示的类型不同,这样的解决方案也不起作用,因为它们不会有相同的历史记录。
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)))
;; ...
)
我需要访问之前输入的交互参数,以便将其用作下一个参数的初始值。为了阐明我的意思,考虑一个重命名缓冲区的示例函数:
(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-descriptors 组成解决方案,它们是表达式列表。我不相信它们可以重新实现为字符串,但即使可以,我对这样的解决方案也不感兴趣。
我不希望将最后一个值显示为只读提示字符串的一部分,而是希望将其用作提示字符串后显示的可修改初始值。
用户按 ↑ 访问前一个参数不是解决方案,因为我不想要求用户交互来获取最后一个值。我也可能(在未来或为了不同的功能)希望显示最后一个值的略微修改版本,而不是逐字显示它。如果提示的类型不同,这样的解决方案也不起作用,因为它们不会有相同的历史记录。
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)))
;; ...
)