如何编写一个elisp函数,它应绑定到按键,默认情况下不会提示,但在Ctrl-u之前会提示用户输入参数。类似的东西(这是错误的语法,但我希望你能得到这个想法)?
(defun my-message (&optional (print-message "foo"))
(interactive "P")
(message print-message))
(global-set-key "\C-c\C-m" 'my-message)
答案 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")))