W końcu próbuję nauczyć się elisp, ale nie owinąłem głowy wokół tego, jak dynamicznie mapować nieznaną listę argumentów na zmienne.
Oto działająca funkcja, która przekazuje do trzech argumentów procesowi startowemu, ale chciałbym przekazać nieskończoną liczbę argumentów funkcji.
(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"))))
Oto przykład funkcji wywołującej, którą chciałbym pracować z buforem create-drush.
(defun drush-sql-sync ()
(interactive)
(create-drush-buffer
"sql-sync"
"-y"
"-d"
"-v"
"@cu.wstage1-education"
"@cu.local-education"))
Jak mogę to osiągnąć i uczynić mój kod mniej zbędnym? Doceniam wszelką pomoc przy kodowaniu, a nawet kierowanie mnie do odpowiedniej dokumentacji.
Odpowiedzi:
3 dla odpowiedzi № 1Możesz użyć apply
:
(zastosuj FUNKCJĘ i odpocznij ARGUMENTY)
Wywołaj FUNCTION z naszymi pozostałymi argumentami, używając naszej ostatniej arg jako listy args. Następnie zwróć wartość zwracaną przez FUNCTION. Zatem (zastosuj „+ 1 2” (3 4)) zwroty 10.
W ten sposób możesz zadzwonić start-process
używając czegoś takiego jak:
(apply "start-process "drush" (current-buffer)
drupal-drush-program
command
a)
Na marginesie nie należy tworzyć zmiennych tymczasowych za pomocą setq
, ponieważ tworzy lub modyfikuje zmienne globalne (jeśli nie istnieją lokalne zmienne o nazwie). Zamiast tego użyj let
.
Powodzenia w twoich elisp projektach!