Fix build system (untested)

This commit is contained in:
Henrik Lissner 2017-04-07 01:19:55 -04:00
parent b6962f1c04
commit 841e91938b
2 changed files with 44 additions and 28 deletions

View file

@ -3,29 +3,45 @@
(defvar-local +eval-last-builder nil (defvar-local +eval-last-builder nil
"The last builder run in the current buffer.") "The last builder run in the current buffer.")
(defvar +eval-current-builder nil
"The spec for the currently running builder. Available from inside builder
functions.")
(defun +eval--read-builder () (defun +eval--read-builder ()
(let ((builders (cl-remove-if-not (when-let (builders
(lambda (plist) (cl-remove-if-not
(when-let (pred (plist-get (cdr plist) :when)) (lambda (plist)
(eval pred))) (if-let (pred (plist-get plist :when))
(cdr (assq major-mode +eval-builders))))) (and (or (symbolp pred)
(completing-read (functionp pred))
"Build: " (funcall pred))
(mapcar 'car builders) t))
nil t))) (cl-delete-duplicates
(reverse (cdr (assq major-mode +eval-builders)))
:key 'car)
:key 'cdr))
(if (= (length builders) 1)
(car builders)
(when-let (builder (completing-read "Build: "
(mapcar 'car builders)
nil t))
(assq (intern builder) builders)))))
;;;###autoload ;;;###autoload
(defun +eval/build (&optional builder) (defun +eval/build (builder)
(interactive (list (+eval--read-builder))) (interactive
(list (or +eval-last-builder
(+eval--read-builder)
(error "No builder for this buffer"))))
(unless builder (unless builder
(error "No builder for this buffer")) (error "Builder not found in registered builders"))
(let ((desc (assq builder (assq major-mode +eval-builders)))) (let* ((name (car builder))
(unless desc (plist (cdr builder))
(error "Builder not found in registered builders")) (fn (plist-get plist :fn)))
(message "Running %s" builder))) (message "Running %s" name)
(if (or (functionp fn)
;;;###autoload (and (symbolp fn) (fboundp fn)))
(defun +eval/rebuild (&optional builder) (let ((+eval-current-builder builder))
(interactive (list +eval-last-builder)) (funcall fn))
(+eval/build +eval-last-builder)) (error "'%s' builder is invalid" name))))

View file

@ -12,18 +12,18 @@
"A nested alist, mapping major modes to build function plists. Used by "A nested alist, mapping major modes to build function plists. Used by
`+eval/build' and filled with the `:build' setting.") `+eval/build' and filled with the `:build' setting.")
(def-setting! :build (name mode fn &rest plist) (def-setting! :build (name modes fn &rest plist)
"Define a build function (FN) for MODE (can be major or minor) called NAME. "Define a build function (FN) for MODES (can be major or minor) called NAME.
PLIST accepts the following properties: PLIST accepts the following properties:
:when FORM A predicate to determine if the builder is appropriate for this :when FORM A predicate to determine if the builder is appropriate for this
buffer." buffer."
`(progn `(dolist (mode ',(if (listp modes) modes (list modes)) +eval-builders)
(unless (assq ',mode +eval-builders) (unless (assq mode +eval-builders)
(push (list ',mode nil) +eval-builders)) (push (list mode) +eval-builders))
(push (list ',name :fn #',fn ,@plist) (push (cons ',name (append (list :fn #',fn) ',plist))
(cdr (assq ',mode +eval-builders))))) (cdr (assq mode +eval-builders)))))
;; ;;