From b054190820d0ed71add4d924568dce726c233f2b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Mar 2019 19:49:27 -0500 Subject: [PATCH] New doom/describe-packages command Replaces describe-packages and adds Doom module awareness to package documentation. --- core/autoload/help.el | 71 ++++++++++++++++++++++++ core/core-packages.el | 12 +++- modules/config/default/+evil-bindings.el | 1 + 3 files changed, 83 insertions(+), 1 deletion(-) diff --git a/core/autoload/help.el b/core/autoload/help.el index 5aee16ed1..e15463960 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -198,6 +198,77 @@ selection of all minor-modes, active or not." ((symbolp mode) mode) ((error "Expected a symbol/string, got a %s" (type-of mode)))))) +;;;###autoload +(global-set-key [remap describe-package] #'doom/describe-package) +;;;###autoload +(defun doom/describe-package (package) + "Like `describe-packages', but is Doom-aware. + +Includes information about where packages are defined and configured. + + If universal arg is set, only display packages that are installed/built-in +(excludes packages on MELPA/ELPA)." + (interactive + (list + (let* ((guess (or (function-called-at-point) + (symbol-at-point)))) + (require 'finder-inf nil t) + (require 'core-packages) + (doom-initialize-packages) + (let ((packages (append (mapcar #'car package-alist) + (unless current-prefix-arg + (mapcar #'car package-archive-contents)) + (mapcar #'car package--builtins)))) + (setq packages (sort packages #'string-lessp)) + (unless (memq guess packages) + (setq guess nil)) + (intern + (car + (split-string + (completing-read + (if guess + (format "Describe Doom package (default %s): " + guess) + "Describe Doom package: ") + (mapcar #'symbol-name packages) + nil t nil nil + (if guess (symbol-name guess))) " "))))))) + (describe-package package) + (with-current-buffer (help-buffer) + (let ((inhibit-read-only t)) + (goto-char (point-min)) + (when (and (doom-package-installed-p package) + (re-search-forward "^ *Status: " nil t)) + (end-of-line) + (let ((indent (make-string (length (match-string 0)) ? ))) + (insert "\n" indent "Installed by the following Doom modules:\n") + (dolist (m (get package 'doom-module)) + (insert indent) + (insert-text-button + (string-trim (format " %s %s" (car m) (or (cdr m) ""))) + 'face 'link + 'follow-link t + 'action + `(lambda (_) + (let* ((category ,(car m)) + (module ',(cdr m)) + (dir (pcase category + (:core doom-core-dir) + (:private doom-private-dir) + (_ (doom-module-path category module))))) + (unless (file-directory-p dir) + (user-error "Module doesn't exist")) + (when (window-dedicated-p) + (other-window 1)) + (find-file dir)))) + (insert "\n")) + + (package--print-help-section "Source") + (pcase (doom-package-backend package) + (`elpa (insert "[M]ELPA")) + (`quelpa (insert (format "QUELPA %s" (prin1-to-string (doom-package-prop package :recipe))))) + (`emacs (insert "Built-in")))))))) + ;;;###autoload (defun doom/what-face (arg &optional pos) "Shows all faces and overlay faces at point. diff --git a/core/core-packages.el b/core/core-packages.el index 94908abc4..cedfd6b70 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -217,7 +217,17 @@ elsewhere." (macroexp-progn (append (if disable `((add-to-list 'doom-disabled-packages ',name nil #'eq))) (if pin `((setf (alist-get ',name package-pinned-packages) ,pin))) - `((setf (alist-get ',name doom-packages) ',plist) + `((let ((doom--current-module + (or doom--current-module + (let ((file (FILE!))) + (cond ((file-in-directory-p file doom-private-dir) + (cons :private (intern (file-name-base file)))) + ((file-in-directory-p file doom-core-dir) + (cons :core nil)))))) + (modules (get ',name 'doom-module))) + (cl-pushnew doom--current-module modules) + (put ',name 'doom-module modules)) + (setf (alist-get ',name doom-packages) ',plist) (not (memq ',name doom-disabled-packages))))))) (defmacro packages! (&rest packages) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index fd89702e1..a00bf4f56 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -684,6 +684,7 @@ :desc "Find library" "l" #'find-library :desc "View *Messages*" "m" #'view-echo-area-messages :desc "Toggle profiler" "p" #'doom/toggle-profiler + :desc "Describe package" "P" #'describe-package :desc "Reload theme" "r" #'doom/reload-theme :desc "Describe DOOM setting" "s" #'doom/describe-setters :desc "Describe variable" "v" #'describe-variable