Jump to content

Displaying all grob properties and their actual values

From LilyPond wiki
Revision as of 08:19, 3 December 2025 by Lemzwerg (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Sometimes you may want to know all properties and their values for a certain grob. The here provided function is a possibility. Afaict, following comment is not true (any more?), will delete soon --Harm: Known limitation: it doesn't work for NoteHead. The output (written to stdout) is something like the following.

#<Grob ChordName >:

GROB-INTERFACE

       X-extent:
       (0.0 . 5.087352755905512)
       ...

...

CHORD-NAME-INTERFACE

        begin-of-line-visible:
        ()

FONT-INTERFACE

        font:
        ((typewriter . LilyPond Monospace) (sans . LilyPond Sans Serif) ...)
        font-encoding:
        ()
        ...

...

for the example below.

\version "2.24"

#(define (supported-properties iface)
  (let ((iface-info (hashq-get-handle (ly:all-grob-interfaces) iface)))
    (last iface-info)))

#(define print-all-grob-properties-key-values
  (grob-transformer 'after-line-breaking
   (lambda (grob orig) 
    (let ((ifaces (assoc-get 'interfaces (ly:grob-property grob 'meta))))
      (format #t "\n~a:\n" grob)
      (for-each
        (lambda (iface)
          (format #t "\n~a\n" (string-upcase (symbol->string iface)))
            (for-each
              (lambda (p)
                (format #t "\n\t~a:\n\t~a" p 
                  (if (eq? p 'after-line-breaking)
                      orig
                      (ly:grob-property grob p))))
              (supported-properties iface)))
        ifaces)
      orig))))
      
grobPropertiesInfo =
#(define-music-function (grob-name)(symbol?)
#{
  \override $grob-name . after-line-breaking =
    #print-all-grob-properties-key-values
#})
 
\new ChordNames
  \chordmode {
    \grobPropertiesInfo #'ChordName
    c1:m7
  }