Finalmente, estou tentando aprender elisp, mas ainda não entendi como mapear dinamicamente uma lista desconhecida de argumentos.
Aqui está uma função funcional que passa até três argumentos para iniciar o processo. Mas eu gostaria de passar um número infinito de argumentos para a função.
(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"))))
Aqui está um exemplo de uma função de chamada que eu gostaria de trabalhar com create-drush-buffer.
(defun drush-sql-sync ()
(interactive)
(create-drush-buffer
"sql-sync"
"-y"
"-d"
"-v"
"@cu.wstage1-education"
"@cu.local-education"))
Como conseguir isso e tornar meu código menos redundante? Qualquer ajuda com o código ou mesmo me direcionando para a documentação relevante é apreciada.
Respostas:
3 para resposta № 1Você pode usar apply
:
(aplique FUNÇÃO e descanse ARGUMENTOS)
Chame FUNCTION com nossos argumentos restantes, usando nosso último argumento como lista de args. Em seguida, retorne o valor que FUNCTION retorna. Assim, (aplique "+ 1 2" (3 4)) retorna 10.
Dessa forma, você poderia ligar start-process
usando algo como:
(apply "start-process "drush" (current-buffer)
drupal-drush-program
command
a)
Como observação, você não deve criar variáveis temporárias usando setq
, pois isso cria ou modifica variáveis globais (se não existirem locais com o nome). Em vez disso, use let
.
Boa sorte com seus projetos elisp!