Highlights: - 'doom purge' now purges builds, elpa packages, and repos by default. Regrafting repos is now opt-in with the -g/--regraft switches. Negation flags have been added for elpa/repos: -e/--no-elpa and -r/--no-repos. - Removed 'doom rebuild' (it is now just 'doom build' or 'doom b'). - Removed 'doom build's -f flag, this is now the default. Added the -r flag instead, which only builds packages that need rebuilding. - 'doom update' now updates packages synchronously, but produces more informative output about the updating process. - Straight can now prompt in batch mode, which resolves a lot of issues with 'doom update' (and 'doom upgrade') freezing indefinitely or throwing repo branch errors. - 'bin/doom's switches are now positional. Switches aimed at `bin/doom` must precede any subcommands. e.g. Do: 'doom -yd upgrade' Don't do: 'doom upgrade -yd' - Moved 'doom doctor' from bin/doom-doctor to core/cli/doctor, and integrated core/doctor.el into it, as to avoid naming conflicts between it and Emacs doctor. - The defcli! macro now has a special syntax for declaring flags, their arguments and descriptions. Addresses #1981, #1925, #1816, #1721, #1322
101 lines
4.1 KiB
EmacsLisp
101 lines
4.1 KiB
EmacsLisp
;;; core/cli/help.el -*- lexical-binding: t; -*-
|
|
|
|
(defun doom--cli-print-signature (cli)
|
|
(print! (bold "Usage: doom %s%s%s")
|
|
(if (doom-cli-internal-p cli)
|
|
""
|
|
(concat (doom-cli-name cli) " "))
|
|
(if-let* ((optlist (doom-cli-optlist cli))
|
|
(flags (cl-loop for opt in optlist
|
|
append (doom-cli-option-flags opt)))
|
|
(fn (doom-partial #'string-prefix-p "--")))
|
|
(concat (when-let (short-flags (cl-remove-if fn flags))
|
|
;; TODO Show arguments of short flags
|
|
(format "[-%s]"
|
|
(string-join (mapcar (doom-rpartial #'substring 1 nil) short-flags)
|
|
"")))
|
|
;; TODO Show long flags
|
|
;; (when-let (long-flags (cl-remove-if-not fn flags))
|
|
;; (concat " " (string-join long-flags " ")))
|
|
" ")
|
|
"")
|
|
(if-let (arglist (doom-cli-arglist cli))
|
|
(string-join (append (cl-loop for arg in arglist
|
|
until (memq arg cl--lambda-list-keywords)
|
|
collect (upcase (symbol-name arg)))
|
|
(cl-loop for arg in (cdr (memq '&optional arglist))
|
|
until (memq arg cl--lambda-list-keywords)
|
|
collect (format "[%s]" (upcase (symbol-name arg)))))
|
|
" ")
|
|
"")))
|
|
|
|
(defun doom--cli-print-desc (cli &optional short)
|
|
(print! "%s"
|
|
(if short
|
|
(car (split-string (doom-cli-desc cli) "\n"))
|
|
(doom-cli-desc cli))))
|
|
|
|
(defun doom--cli-print-short-desc (cli)
|
|
(doom--cli-print-desc cli 'short))
|
|
|
|
(defun doom--cli-print-options (cli)
|
|
(when-let (optlist (doom-cli-optlist cli))
|
|
(print! (bold "Options:"))
|
|
(print-group!
|
|
(cl-loop for opt in optlist
|
|
for flags = (doom-cli-option-flags opt)
|
|
for desc = (doom-cli-option-desc opt)
|
|
for args = (doom-cli-option-args opt)
|
|
for flagstr = (string-join (doom-cli-option-flags opt) ", ")
|
|
do
|
|
;; TODO Adjust columns dynamically
|
|
(print! "%-18s"
|
|
(concat flagstr
|
|
(when-let (arg (car args))
|
|
(concat " " (upcase (symbol-name arg))))))
|
|
(print-group!
|
|
(print! (autofill "%s") desc))))))
|
|
|
|
|
|
(defun doom--cli-print (cli)
|
|
(doom--cli-print-signature cli)
|
|
(terpri)
|
|
(doom--cli-print-desc cli)
|
|
(terpri)
|
|
(doom--cli-print-options cli))
|
|
|
|
|
|
;;
|
|
;;; Commands
|
|
|
|
(defcli! (help h) (&optional command)
|
|
"Describe a command or list them all."
|
|
:bare t
|
|
(if command
|
|
(doom--cli-print (doom-cli-get (intern command)))
|
|
(doom--cli-print (doom-cli-get :main))
|
|
(terpri)
|
|
(print! (bold "Commands:"))
|
|
(print-group!
|
|
(dolist (group (seq-group-by (lambda (cli)
|
|
(plist-get (doom-cli-plist cli) :group))
|
|
(cl-loop for name being the hash-keys of doom--cli-commands
|
|
for cli = (gethash name doom--cli-commands)
|
|
if (and (doom-cli-p cli)
|
|
(not (doom-cli-internal-p cli))
|
|
(not (plist-get (doom-cli-plist cli) :hidden)))
|
|
collect cli)))
|
|
(if (null (car group))
|
|
(dolist (cli (cdr group))
|
|
(print! "%-16s %s"
|
|
(doom-cli-name cli)
|
|
(car (split-string (doom-cli-desc cli) "\n"))))
|
|
(print! "%-26s %s"
|
|
(bold (concat (car group) ":"))
|
|
(gethash (car group) doom--cli-groups))
|
|
(print-group!
|
|
(dolist (cli (cdr group))
|
|
(print! "%-16s %s"
|
|
(doom-cli-name cli)
|
|
(car (split-string (doom-cli-desc cli) "\n"))))))
|
|
(terpri)))))
|