From 841e91938b4555e10614d01ce7e9909b4ca22156 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 7 Apr 2017 01:19:55 -0400 Subject: [PATCH] Fix build system (untested) --- modules/feature/eval/autoload/build.el | 58 ++++++++++++++++---------- modules/feature/eval/config.el | 14 +++---- 2 files changed, 44 insertions(+), 28 deletions(-) diff --git a/modules/feature/eval/autoload/build.el b/modules/feature/eval/autoload/build.el index a39aa8cee..ba63f0ef3 100644 --- a/modules/feature/eval/autoload/build.el +++ b/modules/feature/eval/autoload/build.el @@ -3,29 +3,45 @@ (defvar-local +eval-last-builder nil "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 () - (let ((builders (cl-remove-if-not - (lambda (plist) - (when-let (pred (plist-get (cdr plist) :when)) - (eval pred))) - (cdr (assq major-mode +eval-builders))))) - (completing-read - "Build: " - (mapcar 'car builders) - nil t))) + (when-let (builders + (cl-remove-if-not + (lambda (plist) + (if-let (pred (plist-get plist :when)) + (and (or (symbolp pred) + (functionp pred)) + (funcall pred)) + 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 -(defun +eval/build (&optional builder) - (interactive (list (+eval--read-builder))) +(defun +eval/build (builder) + (interactive + (list (or +eval-last-builder + (+eval--read-builder) + (error "No builder for this buffer")))) (unless builder - (error "No builder for this buffer")) - (let ((desc (assq builder (assq major-mode +eval-builders)))) - (unless desc - (error "Builder not found in registered builders")) - (message "Running %s" builder))) - -;;;###autoload -(defun +eval/rebuild (&optional builder) - (interactive (list +eval-last-builder)) - (+eval/build +eval-last-builder)) + (error "Builder not found in registered builders")) + (let* ((name (car builder)) + (plist (cdr builder)) + (fn (plist-get plist :fn))) + (message "Running %s" name) + (if (or (functionp fn) + (and (symbolp fn) (fboundp fn))) + (let ((+eval-current-builder builder)) + (funcall fn)) + (error "'%s' builder is invalid" name)))) diff --git a/modules/feature/eval/config.el b/modules/feature/eval/config.el index e6a667336..8402115ca 100644 --- a/modules/feature/eval/config.el +++ b/modules/feature/eval/config.el @@ -12,18 +12,18 @@ "A nested alist, mapping major modes to build function plists. Used by `+eval/build' and filled with the `:build' setting.") -(def-setting! :build (name mode fn &rest plist) - "Define a build function (FN) for MODE (can be major or minor) called NAME. +(def-setting! :build (name modes fn &rest plist) + "Define a build function (FN) for MODES (can be major or minor) called NAME. PLIST accepts the following properties: :when FORM A predicate to determine if the builder is appropriate for this buffer." - `(progn - (unless (assq ',mode +eval-builders) - (push (list ',mode nil) +eval-builders)) - (push (list ',name :fn #',fn ,@plist) - (cdr (assq ',mode +eval-builders))))) + `(dolist (mode ',(if (listp modes) modes (list modes)) +eval-builders) + (unless (assq mode +eval-builders) + (push (list mode) +eval-builders)) + (push (cons ',name (append (list :fn #',fn) ',plist)) + (cdr (assq mode +eval-builders))))) ;;