Add links to config files in describe-packages

Also dims packages that aren't installed.
This commit is contained in:
Henrik Lissner 2019-03-05 01:53:52 -05:00
parent cf5a398e0d
commit cfa97470fc
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395
4 changed files with 107 additions and 65 deletions

View file

@ -130,6 +130,17 @@
(helpful-callable fn) (helpful-callable fn)
(describe-function fn)))) (describe-function fn))))
;;;###autoload
(defun doom/describe-active-minor-mode (mode)
"Get information on an active minor mode. Use `describe-minor-mode' for a
selection of all minor-modes, active or not."
(interactive
(list (completing-read "Minor mode: " (doom-active-minor-modes))))
(describe-minor-mode-from-symbol
(cond ((stringp mode) (intern mode))
((symbolp mode) mode)
((error "Expected a symbol/string, got a %s" (type-of mode))))))
;;;###autoload ;;;###autoload
(defun doom/describe-module (category module) (defun doom/describe-module (category module)
"Open the documentation of CATEGORY MODULE. "Open the documentation of CATEGORY MODULE.
@ -184,27 +195,38 @@ current file is in, or d) the module associated with the current major mode (see
(error "'%s %s' isn't a valid module" category module)) (error "'%s %s' isn't a valid module" category module))
(doom-project-browse (doom-module-path category module))) (doom-project-browse (doom-module-path category module)))
;;;###autoload (defun doom--describe-package-insert-button (label path &optional regexp)
(defun doom/describe-active-minor-mode (mode) (declare (indent defun))
"Get information on an active minor mode. Use `describe-minor-mode' for a (insert-text-button
selection of all minor-modes, active or not." (string-trim label)
(interactive 'face 'link
(list (completing-read "Minor mode: " (doom-active-minor-modes)))) 'follow-link t
(describe-minor-mode-from-symbol 'action
(cond ((stringp mode) (intern mode)) `(lambda (_)
((symbolp mode) mode) (unless (file-exists-p ,path)
((error "Expected a symbol/string, got a %s" (type-of mode)))))) (user-error "Module doesn't exist"))
(when (window-dedicated-p)
(other-window 1))
(let ((buffer (find-file ,path)))
(when ,(stringp regexp)
(with-current-buffer buffer
(goto-char (point-min))
(if (re-search-forward ,regexp nil t)
(recenter)
(message "Couldn't find the config block"))))))))
;;;###autoload ;;;###autoload
(global-set-key [remap describe-package] #'doom/describe-package) (global-set-key [remap describe-package] #'doom/describe-package)
(defvar doom--describe-package-list-cache nil)
;;;###autoload ;;;###autoload
(defun doom/describe-package (package) (defun doom/describe-package (package)
"Like `describe-packages', but is Doom-aware. "Like `describe-packages', but is Doom aware.
Includes information about where packages are defined and configured. Only shows installed packages. Includes information about where packages are
defined and configured.
If universal arg is set, only display packages that are installed/built-in If prefix arg is prsent, refresh the cache."
(excludes packages on MELPA/ELPA)."
(interactive (interactive
(list (list
(let* ((guess (or (function-called-at-point) (let* ((guess (or (function-called-at-point)
@ -212,59 +234,65 @@ Includes information about where packages are defined and configured.
(require 'finder-inf nil t) (require 'finder-inf nil t)
(require 'core-packages) (require 'core-packages)
(doom-initialize-packages) (doom-initialize-packages)
(let ((packages (append (mapcar #'car package-alist) (let ((packages
(unless current-prefix-arg (or (unless current-prefix-arg doom--describe-package-list-cache)
(mapcar #'car package-archive-contents)) (cl-loop for pkg
(mapcar #'car package--builtins)))) in (cl-delete-duplicates
(setq packages (sort packages #'string-lessp)) (sort (append (mapcar #'car package-alist)
(mapcar #'car package-archive-contents)
(mapcar #'car package--builtins))
#'string-greaterp))
if (assq pkg package-alist)
collect (symbol-name pkg)
else
collect (propertize (symbol-name pkg) 'face 'font-lock-comment-face)))))
(unless (memq guess packages) (unless (memq guess packages)
(setq guess nil)) (setq guess nil))
(setq doom--describe-package-list-cache packages)
(intern (intern
(car (completing-read
(split-string (if guess
(completing-read (format "Describe package (default %s): "
(if guess guess)
(format "Describe Doom package (default %s): " "Describe package: ")
guess) packages nil t nil nil
"Describe Doom package: ") (if guess (symbol-name guess))))))))
(mapcar #'symbol-name packages)
nil t nil nil
(if guess (symbol-name guess))) " ")))))))
(describe-package package) (describe-package package)
(with-current-buffer (help-buffer) (save-excursion
(let ((inhibit-read-only t)) (with-current-buffer (help-buffer)
(goto-char (point-min)) (let ((inhibit-read-only t))
(when (and (doom-package-installed-p package) (goto-char (point-min))
(re-search-forward "^ *Status: " nil t)) (when (and (doom-package-installed-p package)
(end-of-line) (re-search-forward "^ *Status: " nil t))
(let ((indent (make-string (length (match-string 0)) ? ))) (end-of-line)
(insert "\n" indent "Installed by the following Doom modules:\n") (let ((indent (make-string (length (match-string 0)) ? )))
(dolist (m (get package 'doom-module)) (insert "\n" indent "Installed by the following Doom modules:\n")
(insert indent) (dolist (m (get package 'doom-module))
(insert-text-button (insert indent)
(string-trim (format " %s %s" (car m) (or (cdr m) ""))) (doom--describe-package-insert-button
'face 'link (format " %s %s" (car m) (or (cdr m) ""))
'follow-link t (pcase (car m)
'action (:core doom-core-dir)
`(lambda (_) (:private doom-private-dir)
(let* ((category ,(car m)) (category (doom-module-path category (cdr m)))))
(module ',(cdr m)) (insert "\n"))
(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") (package--print-help-section "Source")
(pcase (doom-package-backend package) (pcase (doom-package-backend package)
(`elpa (insert "[M]ELPA")) (`elpa (insert "[M]ELPA"))
(`quelpa (insert (format "QUELPA %s" (prin1-to-string (doom-package-prop package :recipe))))) (`quelpa (insert (format "QUELPA %s" (prin1-to-string (doom-package-prop package :recipe)))))
(`emacs (insert "Built-in")))))))) (`emacs (insert "Built-in")))
(insert "\n")
(package--print-help-section "Configs")
(dolist (file (get package 'doom-files))
(doom--describe-package-insert-button
(abbreviate-file-name file)
file
(format "\\((\\(:?after!\\|def-package!\\)[ \t\n]*%s\\|^[ \t]*;; `%s'$\\)"
package package))
(insert "\n" indent))
(delete-char -1)))))))
;;;###autoload ;;;###autoload
(defun doom/what-face (arg &optional pos) (defun doom/what-face (arg &optional pos)

View file

@ -222,7 +222,9 @@ BODY is evaluated once TARGETS are loaded. TARGETS can either be:
#'progn #'progn
#'with-no-warnings) #'with-no-warnings)
(if (symbolp targets) (if (symbolp targets)
`(with-eval-after-load ',targets ,@body) `(progn
(doom-module-register-config ',targets ,(FILE!))
(with-eval-after-load ',targets ,@body))
(pcase (car-safe targets) (pcase (car-safe targets)
((or :or :any) ((or :or :any)
(macroexp-progn (macroexp-progn

View file

@ -171,6 +171,15 @@ non-nil, return paths of possible modules, activated or otherwise."
collect (plist-get plist :path))) collect (plist-get plist :path)))
(list doom-private-dir))) (list doom-private-dir)))
(defun doom-module-register-config (package file &optional append)
"TODO"
(let ((files (get package 'doom-files)))
(unless (member file files)
(if append
(setq files (append files (list file)))
(push file files))
(put package 'doom-files files))))
(defun doom-modules (&optional refresh-p) (defun doom-modules (&optional refresh-p)
"Minimally initialize `doom-modules' (a hash table) and return it." "Minimally initialize `doom-modules' (a hash table) and return it."
(or (unless refresh-p doom-modules) (or (unless refresh-p doom-modules)
@ -345,7 +354,9 @@ package is disabled."
;; package errors, so we preform this check at compile time: ;; package errors, so we preform this check at compile time:
(and (bound-and-true-p byte-compile-current-file) (and (bound-and-true-p byte-compile-current-file)
(not (locate-library (symbol-name name))))) (not (locate-library (symbol-name name)))))
`(use-package ,name ,@plist))) `(progn
(doom-module-register-config ',name ,(FILE!) t)
(use-package ,name ,@plist))))
(defmacro def-package-hook! (package when &rest body) (defmacro def-package-hook! (package when &rest body)
"Reconfigures a package's `def-package!' block. "Reconfigures a package's `def-package!' block.
@ -367,6 +378,7 @@ to have them return non-nil (or exploit that to overwrite Doom's config)."
(error "'%s' isn't a valid hook for def-package-hook!" when)) (error "'%s' isn't a valid hook for def-package-hook!" when))
`(progn `(progn
(setq use-package-inject-hooks t) (setq use-package-inject-hooks t)
(doom-module-register-config ',package ,(FILE!))
(add-hook! (add-hook!
',(intern (format "use-package--%s--%s-hook" ',(intern (format "use-package--%s--%s-hook"
package package

View file

@ -685,7 +685,7 @@
:desc "Find library" "l" #'find-library :desc "Find library" "l" #'find-library
:desc "View *Messages*" "m" #'view-echo-area-messages :desc "View *Messages*" "m" #'view-echo-area-messages
:desc "Toggle profiler" "p" #'doom/toggle-profiler :desc "Toggle profiler" "p" #'doom/toggle-profiler
:desc "Describe package" "P" #'describe-package :desc "Describe Doom package" "P" #'describe-package
:desc "Reload theme" "r" #'doom/reload-theme :desc "Reload theme" "r" #'doom/reload-theme
:desc "Describe DOOM setting" "s" #'doom/describe-setters :desc "Describe DOOM setting" "s" #'doom/describe-setters
:desc "Describe variable" "v" #'describe-variable :desc "Describe variable" "v" #'describe-variable