elisp: Splicing into Lists
14.4.3 Splicing into Lists
--------------------------
The ‘:inline’ feature lets you splice a variable number of elements into
the middle of a ‘list’ or ‘vector’ customization type. You use it by
adding ‘:inline t’ to a type specification which is contained in a
‘list’ or ‘vector’ specification.
Normally, each entry in a ‘list’ or ‘vector’ type specification
describes a single element type. But when an entry contains ‘:inline
t’, the value it matches is merged directly into the containing
sequence. For example, if the entry matches a list with three elements,
those become three elements of the overall sequence. This is analogous
to ‘,@’ in a backquote construct (Backquote).
For example, to specify a list whose first element must be ‘baz’ and
whose remaining arguments should be zero or more of ‘foo’ and ‘bar’, use
this customization type:
(list (const baz) (set :inline t (const foo) (const bar)))
This matches values such as ‘(baz)’, ‘(baz foo)’, ‘(baz bar)’ and ‘(baz
foo bar)’.
When the element-type is a ‘choice’, you use ‘:inline’ not in the
‘choice’ itself, but in (some of) the alternatives of the ‘choice’. For
example, to match a list which must start with a file name, followed
either by the symbol ‘t’ or two strings, use this customization type:
(list file
(choice (const t)
(list :inline t string string)))
If the user chooses the first alternative in the choice, then the
overall list has two elements and the second element is ‘t’. If the
user chooses the second alternative, then the overall list has three
elements and the second and third must be strings.