如何将未知的args列表映射到elisp中的start-process?

时间:2013-09-28 18:18:06

标签: elisp

我终于试图学习elisp,但还没有完全围绕如何动态地将未知的参数列表映射到变量。

这是一个工作函数,最多可以传递三个参数来启动进程。但我想将无限数量的args传递给函数。

(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"))

如何实现这一目标并减少我的代码冗余?任何有关代码的帮助,甚至可以指导我阅读相关文档。

1 个答案:

答案 0 :(得分:3)

您可以使用apply

  

(申请FUNCTION& rest ARGUMENTS)

     

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

这样,您可以使用以下内容调用start-process

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

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

祝你的elisp项目好运!