;; this functions are to make it easy to work with `pants' (defvar fcuny/build-command "cd ~/src/source && ./pants --no-colors" "Command to use to execute the target") (defvar fcuny/build-file "BUILD" "Name of the file containing our build targets") (defun fcuny/--find-directory-containing-build-file (file) "Find the directory containing the build file." (let ((root nil) try) (while (not (or root (null file) (string-match locate-dominating-stop-dir-regexp file))) (setq try (if (stringp fcuny/build-file) (file-exists-p (expand-file-name fcuny/build-file file)))) (cond (try (setq root file)) ((equal file (setq file (file-name-directory (directory-file-name file)))) (setq file nil)))) (and root (expand-file-name (file-name-as-directory root))))) (defun fcuny/--build-action (target) (compile (format "%s binary %s" fcuny/build-command target))) (defun fcuny/--build-target-list (file) "Generate a list of existing targets" (let ((build-command (format "%s list %s:" fcuny/build-command file)) targets target) (with-temp-buffer (insert (shell-command-to-string build-command)) (goto-char (point-min)) (while (re-search-forward "^\\(.+\\)$" nil t) (setq target (match-string 1)) (unless (or (save-excursion (goto-char (match-beginning 0)) (forward-line -1) (looking-at "^# Not a target:")) (string-match "^\\." target)) (push target targets)))) (helm (helm :sources `((name . "Targets") (candidates . ,targets) (action . fcuny/--build-action)))))) (defun fcuny/find-build-file () "Find the build file and if it exists, open it." (interactive) (let ((build-file (fcuny/--find-directory-containing-build-file (file-name-directory (buffer-file-name))))) (if build-file (find-file (concat build-file fcuny/build-file)) (error "Could not find %s" fcuny/build-file)))) (defun fcuny/build-run-target () "List the targets for a BUILD file." (interactive) (let ((build-file (fcuny/--find-directory-containing-build-file (file-name-directory (buffer-file-name))))) (if build-file (fcuny/--build-target-list build-file) (error "Could not find %s" fcuny/build-file)))) (provide 'core-pants)