2017-04-03 19 views
1

我需要访问之前输入的交互参数,以便我可以将它用作下一个参数的初始值。为了澄清我的意思,考虑其重命名缓存的例子功能:在初始值中使用前一个交互参数作为下一个参数

(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 

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

一些笔记清晰:

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

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

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

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

回答

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))) 
    ;; ... 
) 
+0

谢谢!现在看文档,在这一点上很清楚,但我的大脑根本无法超越使用“(列表...)”形式的“列表字面量”。 –