【问题标题】:How to create interactive elisp function with optional arguments如何使用可选参数创建交互式 elisp 函数
【发布时间】:2018-07-27 22:40:58
【问题描述】:

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

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

【问题讨论】:

    标签: elisp


    【解决方案1】:

    以下使用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") 之类的代码中调用此函数,而无需提示用户输入。在大多数情况下,您希望将函数设计为仅在交互调用时提示输入。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 你不需要 &optional 那里,事实上我不确定它是否合适
        猜你喜欢
        • 1970-01-01
        • 2011-07-19
        • 1970-01-01
        • 2011-08-01
        • 2012-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多