如何使用可选参数创建交互式elisp函数

时间:2012-03-24 19:00:33

标签: elisp

如何编写一个elisp函数,它应绑定到按键,默认情况下不会提示,但在Ctrl-u之前会提示用户输入参数。类似的东西(这是错误的语法,但我希望你能得到这个想法)?

 (defun my-message (&optional (print-message "foo"))
   (interactive "P")
   (message print-message))
 (global-set-key "\C-c\C-m" 'my-message)

3 个答案:

答案 0 :(得分:20)

以下使用interactive的一项功能,允许您使用代码而不是字符串。此代码仅在交互式调用函数时执行(与之前的答案相比,这是一个不同的答案)。代码应该评估到一个列表,其中元素被映射到参数。

(defun my-test (&optional arg)
  (interactive (list (if current-prefix-arg
                         (read-from-minibuffer "MyPrompt: ")
                       nil)))
  (if arg
      (message arg)
    (message "NO ARG")))

通过使用此方法,可以从(my-test)(my-test "X")等代码调用此函数,而不会提示用户输入。在大多数情况下,您希望设计函数,以便它们仅在交互式调用时提示输入。

答案 1 :(得分:4)

遵循与您的示例相同的实现方式,您可以执行以下操作:

(defun my-message (&optional arg)
  (interactive "P")
  (let ((msg "foo"))
    (when arg
      (setq msg (read-from-minibuffer "Message: ")))
    (message msg)))

答案 2 :(得分:4)

如果您只想将此功能用作交互式功能,则只需以下代码:

(defun my-message (&optional ask)
  (interactive "P")
  (message (if ask
               (read-from-minibuffer "Message: ")
             "foo")))