Hello fellow Nyxt hackers!
I’ve just hacked up a universal documentation function relying on Nyxt introspection abilities. Nothing mind-blowing, though – it’s just a copy of describe-any
without a lock on Nyxt symbols.
The code can use some improvements, but I thought it could be immediately useful even in this state. Here you go:
(define-command-global describe-all ()
"Prompt for a symbol in any Nyxt-accessible package and describe it in the best way Nyxt can."
(let* ((all-symbols (apply #'append (loop for package in (list-all-packages)
collect (loop for sym being the external-symbols in package
collect sym))))
;; All copied from /nyxt/source/help.lisp with `describe-any' as a reference.
(classes (remove-if (lambda (sym)
(not (and (find-class sym nil)
(mopu:subclassp (find-class sym) (find-class 'standard-object)))))
all-symbols))
(slots (alex:mappend (lambda (class-sym)
(mapcar (lambda (slot) (make-instance 'nyxt::slot
:name slot
:class-sym class-sym))
(nyxt::class-public-slots class-sym)))
classes))
(functions (remove-if (complement #'fboundp) all-symbols))
(variables (remove-if (complement #'boundp) all-symbols)))
(prompt
:prompt "Describe:"
:sources (list (make-instance 'nyxt::variable-source :constructor variables)
(make-instance 'nyxt::function-source :constructor functions)
(make-instance 'nyxt::user-command-source
:actions (list (make-unmapped-command describe-command)))
(make-instance 'nyxt::class-source :constructor classes)
(make-instance 'nyxt::slot-source :constructor slots)))))
EDIT: symbols
→ external-symbols
so that only exported symbols are shown. Otherwise it’s extremely cluttered.