refactor!: move helpful from :core to :lang emacs-lisp

BREAKING CHANGE: This moves helpful.el out of core into :lang
emacs-lisp. Since most (all) people have this module enabled, this
shouldn't make a difference for most people, but if you're one of the
few that don't have :lang emacs-lisp enabled, Doom will revert to using
Emacs' built-in help.el and describe-* commands.

Others can also disable helpful with (package! helpful :disable t) if
they prefer Emacs' built-in help system, which wasn't possible before,
because it was a core package.

This was done as part of an ongoing effort to slim down Doom's core in
preparation for v3.
This commit is contained in:
Henrik Lissner 2024-08-30 01:56:03 -04:00
parent bf9e619533
commit 6671adc687
No known key found for this signature in database
GPG key ID: B60957CA074D39A3
13 changed files with 127 additions and 116 deletions

View file

@ -545,61 +545,6 @@ files, so this replace calls to `pp' with the much faster `prin1'."
(message ""))))) ; warn silently
(funcall fn arg)))))
(use-package! helpful
;; a better *help* buffer
:commands helpful--read-symbol
:hook (helpful-mode . visual-line-mode)
:init
;; Make `apropos' et co search more extensively. They're more useful this way.
(setq apropos-do-all t)
(global-set-key [remap describe-function] #'helpful-callable)
(global-set-key [remap describe-command] #'helpful-command)
(global-set-key [remap describe-variable] #'helpful-variable)
(global-set-key [remap describe-key] #'helpful-key)
(global-set-key [remap describe-symbol] #'helpful-symbol)
(defun doom-use-helpful-a (fn &rest args)
"Force FN to use helpful instead of the old describe-* commands."
(letf! ((#'describe-function #'helpful-function)
(#'describe-variable #'helpful-variable))
(apply fn args)))
(after! apropos
;; patch apropos buttons to call helpful instead of help
(dolist (fun-bt '(apropos-function apropos-macro apropos-command))
(button-type-put
fun-bt 'action
(lambda (button)
(helpful-callable (button-get button 'apropos-symbol)))))
(dolist (var-bt '(apropos-variable apropos-user-option))
(button-type-put
var-bt 'action
(lambda (button)
(helpful-variable (button-get button 'apropos-symbol))))))
;; DEPRECATED: Remove when support for 29 is dropped.
(when (= emacs-major-version 29)
(defadvice! doom--find-function-search-for-symbol-save-excursion-a (fn &rest args)
"Suppress cursor movement by `find-function-search-for-symbol'.
Addresses an unwanted side-effect in `find-function-search-for-symbol' on Emacs
29 where the cursor is moved to a variable's definition if it's defined in the
current buffer."
:around #'find-function-search-for-symbol
(let (buf pos)
(letf! (defun find-library-name (library)
(let ((filename (funcall find-library-name library)))
(with-current-buffer (find-file-noselect filename)
(setq buf (current-buffer)
pos (point)))
filename))
(prog1 (apply fn args)
(when (buffer-live-p buf)
(with-current-buffer buf (goto-char pos))))))))
:config
(setq helpful-set-variable-function #'setq!))
(use-package! smartparens
;; Auto-close delimiters and blocks as you type. It's more powerful than that,

View file

@ -97,10 +97,10 @@ selection of all minor-modes, active or not."
(let ((symbol
(cond ((stringp mode) (intern mode))
((symbolp mode) mode)
((error "Expected a symbol/string, got a %s" (type-of mode))))))
(if (fboundp symbol)
(helpful-function symbol)
(helpful-variable symbol))))
((error "Expected a symbol/string, got a %s" (type-of mode)))))
(fn (if (fboundp symbol) #'describe-function #'describe-variable)))
(funcall (or (command-remapping fn) fn)
symbol)))
;;
@ -414,26 +414,44 @@ current file is in, or d) the module associated with the current major mode (see
(doom-project-browse (file-name-directory path)))
((user-error "Aborted module lookup")))))
(defun doom--help-variable-p (sym)
"TODO"
(or (get sym 'variable-documentation)
(and (boundp sym)
(not (keywordp sym))
(not (memq sym '(t nil))))))
;;;###autoload
(defun doom/help-custom-variable (var)
"Look up documentation for a custom variable.
Unlike `helpful-variable', which casts a wider net that includes internal
variables, this only lists variables that exist to be customized (defined with
`defcustom')."
Unlike `describe-variable' or `helpful-variable', which casts a wider net that
includes internal variables, this only lists variables that exist to be
customized (defined with `defcustom')."
(interactive
(list (helpful--read-symbol
"Custom variable: "
(helpful--variable-at-point)
(lambda (sym)
(and (helpful--variable-p sym)
(custom-variable-p sym)
;; Exclude minor mode state variables, which aren't meant to be
;; modified directly, but through their associated function.
(not (or (and (string-suffix-p "-mode" (symbol-name sym))
(fboundp sym))
(eq (get sym 'custom-set) 'custom-set-minor-mode))))))))
(helpful-variable var))
(list
(intern (completing-read
"Custom variable: " obarray
(lambda (sym)
(and (doom--help-variable-p sym)
(custom-variable-p sym)
;; Exclude minor mode state variables, which aren't meant to
;; be modified directly, but through their associated
;; function.
(not (or (and (string-suffix-p "-mode" (symbol-name sym))
(fboundp sym))
(eq (get sym 'custom-set) 'custom-set-minor-mode)))))
t nil nil (let ((var (variable-at-point)))
;; `variable-at-point' uses 0 rather than nil to
;; signify no symbol at point (presumably because 'nil
;; is a symbol).
(unless (symbolp var)
(setq var nil))
(when (doom--help-variable-p var)
var))))))
(funcall (or (command-remapping #'describe-variable)
#'describe-variable)
var))
;;

View file

@ -30,7 +30,6 @@
;; doom-editor.el
(package! better-jumper :pin "47622213783ece37d5337dc28d33b530540fc319")
(package! dtrt-indent :pin "a8aa356684804c52f26602d4e315f1306c6f3e59")
(package! helpful :pin "4ba24cac9fb14d5fdc32582cd947572040e82b2c")
(package! smartparens :pin "c7519a1b69f196050a13e2230b7532893b077086")
(package! ws-butler :pin "e3a38d93e01014cd47bf5af4924459bd145fd7c4")