2

我终于尝试学习 elisp,但还没有考虑如何将未知的参数列表动态映射到变量。

这是一个可以将最多三个参数传递给 start-process 的工作函数。但我想将无限数量的参数传递给函数。

(defun create-drush-buffer (command &rest a)
  (if (locate-dominating-file default-directory "includes/bootstrap.inc")
      (progn
        (setq opt1 (car a))
        (setq opt2 (cadr a))
        (setq opt3 (caddr a))
        (setq allopt (concat opt1 " " opt2 " " opt3))
        (setq b-name (concat "*drush " command " " allopt "*"))
        (if (buffer-live-p b-name)
            (switch-to-buffer b-name)
          (setq d-buffer (get-buffer-create  b-name))
          (with-current-buffer d-buffer
            (goto-char (point-min))
            (view-mode 1)
            (hl-line-mode 1)
            (if opt3
                (start-process "drush" (current-buffer) drupal-drush-program
                               command
                               opt1
                               opt2
                               opt3)
              (if opt2
                  (start-process "drush" (current-buffer)
                                 drupal-drush-program
                                 command
                                 opt1
                                 opt2)
                (if opt1
                    (start-process "drush" (current-buffer)
                                   drupal-drush-program
                                   command
                                   opt1)
                  (start-process "drush" (current-buffer)
                                 drupal-drush-program
                                 command))))
            (shrink-window-if-larger-than-buffer))
          (switch-to-buffer d-buffer)))
    (message (concat default-directory " is not a drupal project"))))

这是我想使用 create-drush-buffer 的调用函数的示例。

(defun drush-sql-sync ()
  (interactive)
  (create-drush-buffer
   "sql-sync"
   "-y"
   "-d"
   "-v"
   "@cu.wstage1-education"
  "@cu.local-education"))

我怎样才能做到这一点并减少我的代码冗余?任何有关代码的帮助,甚至将我引导到相关文档都表示赞赏。

4

1 回答 1

4

您可以使用apply

(应用功能和休息参数)

使用我们剩余的 args 调用 FUNCTION,使用我们最后一个 args 作为 args 列表。然后返回 FUNCTION 返回的值。因此, (apply '+ 1 2 '(3 4)) 返回 10。

这样,您可以start-process使用以下方式调用:

(apply 'start-process "drush" (current-buffer)
                             drupal-drush-program
                             command
                             a)

作为旁注,您不应该使用 创建临时变量setq,因为这会创建或修改全局变量(如果不存在同名的本地变量)。相反,使用let.

祝你的 elisp 项目好运!

于 2013-09-28T18:43:24.347 回答