aartaka / graven-image

Portability library for better interaction and debugging of a running Common Lisp image through text REPL.
BSD 3-Clause "New" or "Revised" License
19 stars 3 forks source link

Smarter `describe*` #22

Closed aartaka closed 1 year ago

aartaka commented 1 year ago

On SBCL, describing a bound symbol generates a HUGE wall of text with all the slots of the bound class, all the methods of the bound function etc. For nyxt:buffer, it's:

NYXT:BUFFER
  [symbol]

BUFFER names a generic function:
  Lambda-list: (OBJECT)
  Derived type: (FUNCTION (T) *)
  Documentation:
    Auto-generated accessor function for slot BUFFER.
  Method-combination: STANDARD
  Methods:
    (BUFFER (PASSWORD-SOURCE))
      Documentation:
        automatically generated reader method
    (BUFFER (PROMPT-BUFFER-COMMAND-SOURCE))
      Documentation:
        automatically generated reader method
    (BUFFER (HISTORY-ALL-SOURCE))
      Documentation:
        automatically generated reader method
    (BUFFER (HISTORY-ALL-OWNER-NODES-SOURCE))
      Documentation:
        automatically generated reader method
    (BUFFER (ALL-HISTORY-FORWARDS-SOURCE))
      Documentation:
        automatically generated reader method
    (BUFFER (HISTORY-FORWARDS-SOURCE))
      Documentation:
        automatically generated reader method
    (BUFFER (DIRECT-HISTORY-FORWARDS-SOURCE))
      Documentation:
        automatically generated reader method
    (BUFFER (HISTORY-BACKWARDS-SOURCE))
      Documentation:
        automatically generated reader method
    (BUFFER (SEARCH-BUFFER-SOURCE))
      Documentation:
        automatically generated reader method
    (BUFFER (SEARCH-MATCH))
      Documentation:
        The buffer where the match is found.
    (BUFFER (FRAME-SOURCE))
      Documentation:
        automatically generated reader method
    (BUFFER (HEADING-SOURCE))
      Documentation:
        automatically generated reader method
    (BUFFER (HEADING))
      Documentation:
        The buffer to which this heading belongs.
    (BUFFER (DEBUG-WRAPPER))
      Documentation:
        The buffer debugger is open in for this condition.
    (BUFFER (EXTENDED-COMMAND-SOURCE))
      Documentation:
        automatically generated reader method
    (BUFFER (COMMAND-SOURCE))
      Documentation:
        automatically generated reader method
    (BUFFER (REQUEST-DATA))
      Documentation:
        Buffer targeted by the request.
    (BUFFER (HISTORY-DISOWNED-SOURCE))
      Documentation:
        automatically generated reader method
    (BUFFER (MODE))
      Documentation:
        automatically generated reader method
    (BUFFER (KEYWORD-SOURCE))
      Documentation:
        automatically generated reader method

(SETF BUFFER) names a generic function:
  Lambda-list: (NEW-VALUE OBJECT)
  Argument precedence order: (NEW-VALUE OBJECT)
  Derived type: (FUNCTION (T T) *)
  Documentation:
    Auto-generated accessor function for slot BUFFER.
  Method-combination: STANDARD
  Methods:
    ((SETF BUFFER) (T PASSWORD-SOURCE))
      Documentation:
        automatically generated writer method
    ((SETF BUFFER) (T PROMPT-BUFFER-COMMAND-SOURCE))
      Documentation:
        automatically generated writer method
    ((SETF BUFFER) (T HISTORY-ALL-SOURCE))
      Documentation:
        automatically generated writer method
    ((SETF BUFFER) (T HISTORY-ALL-OWNER-NODES-SOURCE))
      Documentation:
        automatically generated writer method
    ((SETF BUFFER) (T ALL-HISTORY-FORWARDS-SOURCE))
      Documentation:
        automatically generated writer method
    ((SETF BUFFER) (T HISTORY-FORWARDS-SOURCE))
      Documentation:
        automatically generated writer method
    ((SETF BUFFER) (T DIRECT-HISTORY-FORWARDS-SOURCE))
      Documentation:
        automatically generated writer method
    ((SETF BUFFER) (T HISTORY-BACKWARDS-SOURCE))
      Documentation:
        automatically generated writer method
    ((SETF BUFFER) (T SEARCH-BUFFER-SOURCE))
      Documentation:
        automatically generated writer method
    ((SETF BUFFER) (T SEARCH-MATCH))
      Documentation:
        The buffer where the match is found.
    ((SETF BUFFER) (T FRAME-SOURCE))
      Documentation:
        automatically generated writer method
    ((SETF BUFFER) (T HEADING-SOURCE))
      Documentation:
        automatically generated writer method
    ((SETF BUFFER) (T HEADING))
      Documentation:
        The buffer to which this heading belongs.
    ((SETF BUFFER) (T DEBUG-WRAPPER))
      Documentation:
        The buffer debugger is open in for this condition.
    ((SETF BUFFER) (T EXTENDED-COMMAND-SOURCE))
      Documentation:
        automatically generated writer method
    ((SETF BUFFER) (T COMMAND-SOURCE))
      Documentation:
        automatically generated writer method
    ((SETF BUFFER) (T REQUEST-DATA))
      Documentation:
        Buffer targeted by the request.
    ((SETF BUFFER) (T HISTORY-DISOWNED-SOURCE))
      Documentation:
        automatically generated writer method
    ((SETF BUFFER) (T MODE))
      Documentation:
        automatically generated writer method
    ((SETF BUFFER) (T KEYWORD-SOURCE))
      Documentation:
        automatically generated writer method

BUFFER names the user-class #<NYXT:USER-CLASS NYXT:BUFFER>:
  Documentation:
    A buffer is the fundamental unit of displayed content.
    Buffers result from the computations of a web renderer, which generates a visual
    representation of HTML documents.

    Rendered URLs or the Nyxt's manual qualify as examples.  Buffers are fully
    separated from one another, so that each has its own behavior and settings.
  Class precedence-list: NYXT:BUFFER, NYXT:RENDERER-BUFFER, NYXT/RENDERER/GTK:GTK-BUFFER, STANDARD-OBJECT, SB-PCL::SLOT-OBJECT, T
  Direct superclasses: NYXT:RENDERER-BUFFER
  Direct subclasses: NYXT:NETWORK-BUFFER, NYXT:CONTEXT-BUFFER, NYXT:DOCUMENT-BUFFER, NYXT:INPUT-BUFFER, NYXT:MODABLE-BUFFER
  Direct slots:
    NYXT:DEFAULT-MODES
      Type: (NYXT/TYPES:LIST-OF SYMBOL)
      Initargs: :DEFAULT-MODES
      Initform: NYXT::%DEFAULT-MODES
      Documentation:
       The symbols of the modes to instantiate on buffer creation.
       The mode instances are stored in the `modes' BUFFER slot.

       The default modes returned by this method are appended to the default modes
       inherited from the superclasses.
    NYXT:ID
      Type: UNSIGNED-BYTE
      Initargs: :ID
      Initform: (NYXT/UTILITIES:NEW-ID)
      Readers: NYXT:ID
      Writers: (SETF NYXT:ID)
      Documentation:
       Unique identifier for a buffer.
    NYXT:PROFILE
      Type: NYXT:NYXT-PROFILE
      Initargs: :PROFILE
      Initform: (NYXT:GLOBAL-PROFILE)
      Readers: NYXT:PROFILE
      Writers: (SETF NYXT:PROFILE)
      Documentation:
       Buffer profiles are used to specialize the behavior of
       various parts, such as the path of all data files.
       See also the `profile' slot in the `browser' class.
    NYXT:URL
      Initargs: :URL
      Initform: (QURI.URI:URI "")
      Readers: NYXT:URL
      Writers: (SETF NYXT:URL)
    NYXT:URL-AT-POINT
      Initargs: :URL-AT-POINT
      Initform: (QURI.URI:URI "")
      Readers: NYXT:URL-AT-POINT
      Writers: (SETF NYXT:URL-AT-POINT)
    NYXT:TITLE
      Type: STRING
      Initargs: :TITLE
      Initform: ""
      Readers: NYXT:TITLE
      Writers: (SETF NYXT:TITLE)
    NYXT:STYLE
      Initargs: :STYLE
      Initform: (THEME:THEMED-CSS (NYXT:THEME NYXT:*BROWSER*)
                  `(:FONT-FACE :FONT-FAMILY #1="public sans" :FONT-STYLE #2="normal" :FONT-WEIGHT #3="400" :SRC
                    ,(FORMAT NIL #4="url('nyxt-resource:~a')" "PublicSans-Regular.woff") #5="format('woff')")
                  `(:FONT-FACE :FONT-FAMILY #1# :FONT-STYLE #6="italic" :FONT-WEIGHT #3# :SRC
                    ,(FORMAT NIL #4# "PublicSans-Italic.woff") #5#)
                  `(:FONT-FACE :FONT-FAMILY #1# :FONT-STYLE #2# :FONT-WEIGHT #7="100" :SRC ,(FORMAT NIL #4# "PublicSans-Thin.woff") #5#)
                  `(:FONT-FACE :FONT-FAMILY #1# :FONT-STYLE #6# :FONT-WEIGHT #7# :SRC ,(FORMAT NIL #4# "PublicSans-ThinItalic.woff")
                    #5#)
                  `(:FONT-FACE :FONT-FAMILY #1# :FONT-STYLE #2# :FONT-WEIGHT #8="200" :SRC
                    ,(FORMAT NIL #4# "PublicSans-ExtraLight.woff") #5#)
                  `(:FONT-FACE :FONT-FAMILY #1# :FONT-STYLE #6# :FONT-WEIGHT #8# :SRC
                    ,(FORMAT NIL #4# "PublicSans-ExtraLightItalic.woff") #5#)
                  `(:FONT-FACE :FONT-FAMILY #1# :FONT-STYLE #2# :FONT-WEIGHT #9="300" :SRC ,(FORMAT NIL #4# "PublicSans-Light.woff")
                    #5#)
                  `(:FONT-FACE :FONT-FAMILY #1# :FONT-STYLE #6# :FONT-WEIGHT #9# :SRC ,(FORMAT NIL #4# "PublicSans-LightItalic.woff")
                    #5#)
                  `(:FONT-FACE :FONT-FAMILY #1# :FONT-STYLE #2# :FONT-WEIGHT #10="500" :SRC ,(FORMAT NIL #4# "PublicSans-Medium.woff")
                    #5#)
                  `(:FONT-FACE :FONT-FAMILY #1# :FONT-STYLE #6# :FONT-WEIGHT #10# :SRC ,(FORMAT NIL #4# "PublicSans-MediumItalic.woff")
                    #5#)
                  `(:FONT-FACE :FONT-FAMILY #1# :FONT-STYLE #2# :FONT-WEIGHT #11="600" :SRC
                    ,(FORMAT NIL #4# "PublicSans-SemiBold.woff") #5#)
                  `(:FONT-FACE :FONT-FAMILY #1# :FONT-STYLE #6# :FONT-WEIGHT #11# :SRC
                    ,(FORMAT NIL #4# "PublicSans-SemiBoldItalic.woff") #5#)
                  `(:FONT-FACE :FONT-FAMILY #1# :FONT-STYLE #2# :FONT-WEIGHT #12="700" :SRC ,(FORMAT NIL #4# "PublicSans-Bold.woff")
                    #5#)
                  `(:FONT-FACE :FONT-FAMILY #1# :FONT-STYLE #6# :FONT-WEIGHT #12# :SRC ,(FORMAT NIL #4# "PublicSans-BoldItalic.woff")
                    #5#)
                  `(:FONT-FACE :FONT-FAMILY #1# :FONT-STYLE #2# :FONT-WEIGHT #13="800" :SRC
                    ,(FORMAT NIL #4# "PublicSans-ExtraBold.woff") #5#)
                  `(:FONT-FACE :FONT-FAMILY #1# :FONT-STYLE #6# :FONT-WEIGHT #13# :SRC
                    ,(FORMAT NIL #4# "PublicSans-ExtraBoldItalic.woff") #5#)
                  `(:FONT-FACE :FONT-FAMILY #1# :FONT-STYLE #2# :FONT-WEIGHT #14="900" :SRC ,(FORMAT NIL #4# "PublicSans-Black.woff")
                    #5#)
                  `(:FONT-FACE :FONT-FAMILY #1# :FONT-STYLE #6# :FONT-WEIGHT #14# :SRC ,(FORMAT NIL #4# "PublicSans-BlackItalic.woff")
                    #5#)
                  `(* :FONT-FAMILY ,THEME:FONT-FAMILY :BOX-SIZING NYXT::BORDER-BOX)
                  `(NYXT::BODY :BACKGROUND-COLOR ,THEME:BACKGROUND :COLOR ,THEME:ON-BACKGROUND :MARGIN-LEFT #15="20px" :MARGIN-TOP #15#)
                  `(NYXT::UL :MARGIN-TOP #16="0" :MARGIN-BOTTOM #16#)
                  `("details > *" :MARGIN-LEFT "18px")
                  `("details > ul" :MARGIN-LEFT #17="inherit")
                  `("details summary" :MARGIN-LEFT #17# :MARGIN-BOTTOM "8px" :CURSOR #18="pointer")
                  `("summary::-webkit-details-marker" :PADDING-BOTTOM "4px")
                  `(NYXT::.SECTION :MARGIN-TOP #19="2em")
                  `("h1" :FONT-SIZE "44px")
                  `("h2" :FONT-SIZE "36px")
                  `("h3" :FONT-SIZE "32px")
                  `("h4" :FONT-SIZE "28px")
                  `("h5" :FONT-SIZE "24px")
                  `("h6" :FONT-SIZE #15#)
                  `("p" :FONT-SIZE "16px")
                  `("h1,h2,h3,h4,h5,h6" :COLOR ,THEME:PRIMARY :FONT-FAMILY ,THEME:FONT-FAMILY)
                  `(NYXT::HR :BACKGROUND-COLOR ,THEME:SECONDARY :COLOR ,THEME:ON-SECONDARY :HEIGHT #20="3px" :BORDER-RADIUS "2px"
                    :BORDER-WIDTH #16#)
                  `(NYXT::BUTTON :BACKGROUND "transparent" :COLOR #17# :BORDER #21="none" :PADDING 0 :FONT #17# :OUTLINE #17#)
                  `(NYXT::.BUTTON :APPEARANCE "menulist-button" :BACKGROUND-COLOR ,THEME:PRIMARY :COLOR ,THEME:ON-PRIMARY :DISPLAY
                    #22="inline-block" :TEXT-DECORATION #21# :BORDER-RADIUS #23="0.1em" :BORDER-COLOR ,THEME:PRIMARY :BORDER-STYLE
                    #24="solid" :BORDER-WIDTH #25="0.2em" :PADDING #25# :MARGIN #25# :MIN-HEIGHT #26="2rem")
                  `(NYXT::SELECT.BUTTON :APPEARANCE NYXT::AUTO :BACKGROUND-COLOR ,THEME:PRIMARY NYXT::!IMPORTANT :COLOR
                    ,(THEME:CONTRASTING-TEXT-COLOR THEME:THEME #27="white") NYXT::!IMPORTANT :MIN-HEIGHT #26#)
                  `((:AND NYXT::.BUTTON :HOVER) :CURSOR #18# :OPACITY 0.8)
                  `((:AND NYXT::.BUTTON (:OR :VISITED :ACTIVE)) :COLOR ,THEME:BACKGROUND)
                  `(NYXT::.LINK :APPEARANCE NYXT::NONE :TEXT-DECORATION "underline" :DISPLAY "inline" :COLOR ,THEME:PRIMARY)
                  `(".link:hover" :OPACITY 0.8)
                  `(NYXT::.ACTION :COLOR ,THEME:ACTION
                    (NYXT::.BUTTON :BACKGROUND-COLOR ,THEME:ACTION :COLOR ,THEME:ON-ACTION :BORDER-COLOR ,THEME:ACTION+))
                  `(NYXT::.WARNING :COLOR ,THEME:WARNING
                    (NYXT::.BUTTON :BACKGROUND-COLOR ,THEME:WARNING :COLOR ,THEME:ON-WARNING :BORDER-COLOR ,THEME:WARNING+))
                  `(NYXT::.SUCCESS :COLOR ,THEME:SUCCESS
                    (NYXT::.BUTTON :BACKGROUND-COLOR ,THEME:SUCCESS :COLOR ,THEME:ON-SUCCESS :BORDER-COLOR ,THEME:SUCCESS+))
                  `(NYXT::.HIGHLIGHT :COLOR ,THEME:HIGHLIGHT
                    (NYXT::.BUTTON :BACKGROUND-COLOR ,THEME:HIGHLIGHT :COLOR ,THEME:ON-HIGHLIGHT :BORDER-COLOR ,THEME:HIGHLIGHT+))
                  `(NYXT::.HIGHLIGHT :COLOR ,THEME:HIGHLIGHT)
                  `(NYXT::.BUTTON.HIGHLIGHT :BACKGROUND-COLOR ,THEME:HIGHLIGHT :COLOR ,THEME:ON-HIGHLIGHT :BORDER-COLOR
                    ,THEME:HIGHLIGHT+)
                  `(NYXT::.PLAIN :COLOR ,THEME:ON-BACKGROUND :BACKGROUND-COLOR ,THEME:BACKGROUND)
                  `(NYXT::.INPUT :APPEARANCE "textfield" :DISPLAY #22# :COLOR "black" :BACKGROUND-COLOR #27# :BORDER #25# NYXT::SOLID
                    ,THEME:SECONDARY :BORDER-RADIUS #23# :OUTLINE #21# :PADDING #25# :MARGIN #25#)
                  `(NYXT::A :COLOR ,THEME:PRIMARY)
                  `("a:hover" :OPACITY 0.8)
                  `(NYXT::PRE :BORDER-RADIUS #20# :OVERFLOW "auto" :PADDING "5px")
                  `("table" :BORDER-RADIUS #20# :BORDER-SPACING #16# :WIDTH "100%")
                  `("pre, p code" :COLOR ,THEME:ON-CODEBLOCK :BACKGROUND-COLOR ,THEME:CODEBLOCK)
                  `("a code" :TEXT-DECORATION NYXT::UNDERLINE)
                  `("table, th, td" :BORDER-COLOR ,THEME:SECONDARY :BORDER-WIDTH "1px" :BORDER-STYLE #24# :BACKGROUND-COLOR
                    ,THEME:BACKGROUND :COLOR ,THEME:ON-BACKGROUND)
                  `("td, th" :PADDING "6px")
                  `(NYXT::TH :BACKGROUND-COLOR ,THEME:PRIMARY :COLOR ,THEME:ON-PRIMARY :TEXT-ALIGN "left")
                  `(NYXT::DT :FONT-WEIGHT "bold" :MARGIN-TOP #19#)
                  `("::selection" :COLOR ,THEME:ON-ACTION :BACKGROUND-COLOR ,THEME:ACTION))
      Readers: NYXT:STYLE
      Writers: (SETF NYXT:STYLE)
    NYXT:BUFFER-DELETE-HOOK
      Type: NYXT::HOOK-BUFFER
      Initargs: :BUFFER-DELETE-HOOK
      Initform: (MAKE-INSTANCE 'NYXT::HOOK-BUFFER)
      Readers: NYXT:BUFFER-DELETE-HOOK
      Writers: (SETF NYXT:BUFFER-DELETE-HOOK)
      Documentation:
       Hook run before `buffer-delete' takes effect.
       The handlers take the buffer as argument.
aartaka commented 1 year ago

Forget it, actually. We're in REPL, we can invoke a succinct describe*, find what we need to find, and describe this part as a separate call to describe*. Something like:

(describe* 'nyxt:buffer)
;; Symbol BUFFER (EXTERNAL to NYXT) [fbound] [class]
;; SELF              = NYXT:BUFFER
;; ID                = 68770683471
;; CLASS             = #<BUILT-IN-CLASS COMMON-LISP:SYMBOL>
;; TYPE              = SYMBOL
;; NAME              = "BUFFER"
;; PACKAGE           = #<PACKAGE "NYXT">
;; VISIBILITY        = :EXTERNAL
;; FUNCTION-BINDING  = #<STANDARD-GENERIC-FUNCTION NYXT:BUFFER (20)>
;; CLASS-BINDING     = #<NYXT:USER-CLASS NYXT:BUFFER>
;; PLIST             = NIL
(describe* (find-class 'nyxt:buffer))
;; User-class #<NYXT:USER-CLASS NYXT:BUFFER>
;; User-configurable value class.
;; Can be configured using `customize-instance' and `customize-hook'.
;; SELF                          = #<NYXT:USER-CLASS NYXT:BUFFER>
;; ID                            = 68777288547
;; CLASS                         = #<STANDARD-CLASS NYXT:USER-CLASS>
;; SLOT-DEFINITIONS              = (#<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION NYXT::CUSTOMIZE-HOOK>
;;                                  #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION SB-PCL::%TYPE>
;;                                  #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION SB-PCL::SOURCE>
;;                                  #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION SB-PCL::PLIST>
;;                                  #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION SB-PCL::NAME>
;;                                  #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION SB-PCL::CLASS-EQ-SPECIALIZER>
;;                                  #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION SB-PCL::DIRECT-SUPERCLASSES>
;;                                  #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION SB-PCL::DIRECT-SUBCLASSES>
;;                                  #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION SB-PCL::DIRECT-METHODS>
;;                                  #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION SB-PCL::%DOCUMENTATION>
;;                                  #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION SB-PCL::SAFE-P>
;;                                  #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION SB-PCL::FINALIZED-P>
;;                                  #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION SB-PCL::%CLASS-PRECEDENCE-LIST>
;;                                  #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION SB-PCL::CPL-AVAILABLE-P>
;;                                  #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION SB-PCL::CAN-PRECEDE-LIST>
;;                                  #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION SB-PCL::INCOMPATIBLE-SUPERCLASS-LIST>
;;                                  #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION SB-PCL::WRAPPER>
;;                                  #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION SB-PCL::PROTOTYPE>
;;                                  #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION SB-PCL::DIRECT-SLOTS>
;;                                  #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION SB-PCL::SLOTS>)
;; TYPE                          = NYXT:USER-CLASS
;; SLOTS                         = (#<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION NYXT:DEFAULT-MODES>
;;                                  #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION NYXT:ID>
;;                                  #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION NYXT:PROFILE>
;;                                  #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION NYXT:URL>
;;                                  #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION NYXT:URL-AT-POINT>
;;                                  #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION NYXT:TITLE>
;;                                  #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION NYXT:STYLE>
;;                                  #<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION NYXT:BUFFER-DELETE-HOOK>)
;; DIRECT-SLOTS                  = (#<SB-MOP:STANDARD-DIRECT-SLOT-DEFINITION NYXT:DEFAULT-MODES>
;;                                  #<SB-MOP:STANDARD-DIRECT-SLOT-DEFINITION NYXT:ID>
;;                                  #<SB-MOP:STANDARD-DIRECT-SLOT-DEFINITION NYXT:PROFILE>
;;                                  #<SB-MOP:STANDARD-DIRECT-SLOT-DEFINITION NYXT:URL>
;;                                  #<SB-MOP:STANDARD-DIRECT-SLOT-DEFINITION NYXT:URL-AT-POINT>
;;                                  #<SB-MOP:STANDARD-DIRECT-SLOT-DEFINITION NYXT:TITLE>
;;                                  #<SB-MOP:STANDARD-DIRECT-SLOT-DEFINITION NYXT:STYLE>
;;                                  #<SB-MOP:STANDARD-DIRECT-SLOT-DEFINITION NYXT:BUFFER-DELETE-HOOK>)
;; PROTOTYPE                     = NIL
;; WRAPPER                       = #<SB-KERNEL:LAYOUT (ID=3671) for NYXT:BUFFER {50428803}>
;; INCOMPATIBLE-SUPERCLASS-LIST  = NIL
;; CAN-PRECEDE-LIST              = (#<STANDARD-CLASS PROMPTER:PROMPTER> #<SB-PCL:SYSTEM-CLASS COMMON-LISP:T>
;;                                  #<SB-PCL::SLOT-CLASS SB-PCL::SLOT-OBJECT> #<STANDARD-CLASS COMMON-LISP:STANDARD-OBJECT>
;;                                  #<NYXT:INTERFACE-CLASS NYXT:RENDERER-BUFFER>)
;; CPL-AVAILABLE-P               = T
;; %CLASS-PRECEDENCE-LIST        = (#<NYXT:USER-CLASS NYXT:BUFFER> #<NYXT:INTERFACE-CLASS NYXT:RENDERER-BUFFER>
;;                                  #<STANDARD-CLASS COMMON-LISP:STANDARD-OBJECT> #<SB-PCL::SLOT-CLASS SB-PCL::SLOT-OBJECT>
;;                                  #<SB-PCL:SYSTEM-CLASS COMMON-LISP:T>)
;; FINALIZED-P                   = T
;; ...

etc.

What would be good for this workflow, actually, is using the function that represents the field as the field name. E.g., use find-class instead of class-binding in

CLASS-BINDING     = #<NYXT:USER-CLASS NYXT:BUFFER>