diff --git a/modules/feature/services/autoload.el b/modules/feature/services/autoload.el new file mode 100644 index 000000000..dd2e7a8f3 --- /dev/null +++ b/modules/feature/services/autoload.el @@ -0,0 +1,34 @@ +;;; feature/services/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(defun +services/create () + "Interactively create a new prodigy service." + (interactive) + ;; TODO + ) + +;;;###autoload +(defun +services/prodigy-delete (arg) + "Delete service at point. Asks for confirmation." + (interactive "P") + (prodigy-with-refresh + (-when-let (service (prodigy-service-at-pos)) + (let ((name (plist-get service :name))) + (cond ((or arg + (y-or-n-p (format "Delete '%s' service?" name))) + (setq prodigy-services (delete service prodigy-services)) + (ignore-errors + (prodigy-goto-next-line)) + (message "Successfully deleted service: %s" name)) + (t + (message "Aborted"))))))) + +;;;###autoload +(defun +services/cleanup () + "Delete all services associated with projects that don't exist." + (interactive) + (cl-loop for service in prodigy-services + if (and (plist-member service :project) + (file-directory-p (plist-get service :project))) + collect service into services + finally do (setq prodigy-service services))) diff --git a/modules/feature/services/config.el b/modules/feature/services/config.el new file mode 100644 index 000000000..6430a8864 --- /dev/null +++ b/modules/feature/services/config.el @@ -0,0 +1,50 @@ +;;; feature/services/config.el -*- lexical-binding: t; -*- + +(def-setting! :service (&rest plist) + "TODO" + `(after! prodigy + (prodigy-define-service ,@plist))) + + +;; +;; Plugins +;; + +(def-package! prodigy + :commands (prodigy prodigy-view-mode prodigy-add-filter) + :config + (set! :evil-state 'prodigy-mode 'emacs) + + ;; Make services, etc persistent between Emacs sessions + (setq prodigy-services (persistent-soft-fetch 'prodigy-services "prodigy") + prodigy-tags (persistent-soft-fetch 'prodigy-tags "prodigy") + prodigy-filters (persistent-soft-fetch 'prodigy-filters "prodigy")) + + (defun +services|save () + "Save all services, tags and filters to files." + (+services/cleanup) + (cl-loop for sym in '(prodigy-services prodigy-tags prodigy-filters) + do (persistent-soft-store sym (symbol-value sym) "prodigy"))) + (add-hook 'kill-emacs-hook #'+services|save) + + (defun +services*prodigy-services (orig-fn &rest args) + "Adds a new :project property to prodigy services, which hides the service +unless invoked from the relevant project." + (let ((project-root (downcase (doom-project-root))) + (services (apply orig-fn args))) + (if current-prefix-arg + services + (cl-remove-if-not (lambda (service) + (let ((project (plist-get service :project))) + (or (not project) + (file-in-directory-p project-root project)))) + services)))) + (advice-add #'prodigy-services :around #'+services*prodigy-services) + + ;; Keybindings + (map! :map prodigy-mode-map "d" #'+services/prodigy-delete) + (when (featurep! :feature evil) + (map! :map prodigy-mode-map + "j" #'prodigy-next + "k" #'prodigy-prev))) + diff --git a/modules/tools/prodigy/packages.el b/modules/feature/services/packages.el similarity index 60% rename from modules/tools/prodigy/packages.el rename to modules/feature/services/packages.el index bf9396134..dcca97f5d 100644 --- a/modules/tools/prodigy/packages.el +++ b/modules/feature/services/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- -;;; tools/prodigy/packages.el +;;; feature/services/packages.el (package! prodigy) diff --git a/modules/tools/prodigy/config.el b/modules/tools/prodigy/config.el deleted file mode 100644 index 318807883..000000000 --- a/modules/tools/prodigy/config.el +++ /dev/null @@ -1,9 +0,0 @@ -;;; tools/prodigy/config.el -*- lexical-binding: t; -*- - -;; -;; Plugins -;; - -(def-package! prodigy - :config - (set! :evil-state 'prodigy-mode 'emacs))