我终于试图学习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"))
如何实现这一目标并减少我的代码冗余?任何有关代码的帮助,甚至可以指导我阅读相关文档。
答案 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项目好运!