charmbracelet/vhs · error · parser.Error
Unknown setting: ${literal}
Error message
Unknown setting: ${literal} What it means
Fires in parseSet when the first argument after Set is not a recognized setting token (token.IsSetting fails). The value after an unknown name is still consumed, but cmd.Options is left empty and the error is recorded. It is a generic whitelist guard over the supported setting names.
Source
Thrown at parser/parser.go:450
}
}
cmd.Args = p.peek.Literal
p.nextToken()
return cmd
}
// parseSet parses a set command.
// A set command takes a setting name and a value.
//
// Set <setting> <value>
func (p *Parser) parseSet() Command {
cmd := Command{Type: token.SET}
if token.IsSetting(p.peek.Type) {
cmd.Options = p.peek.Literal
} else {
p.errors = append(p.errors, NewError(p.peek, "Unknown setting: "+p.peek.Literal))
}
p.nextToken()
switch p.cur.Type {
case token.WAIT_TIMEOUT:
cmd.Args = p.parseTime()
case token.WAIT_PATTERN:
cmd.Args = p.peek.Literal
_, err := regexp.Compile(p.peek.Literal)
if err != nil {
p.errors = append(p.errors, NewError(p.peek, "Invalid regexp pattern: "+p.peek.Literal))
}
p.nextToken()
case token.LOOP_OFFSET:
cmd.Args = p.peek.Literal
p.nextToken()
// Allow LoopOffset without '%'
// Set LoopOffset 20View on GitHub (pinned to c073383b5d)
Solutions
- Use a supported setting name such as TypingSpeed, WaitTimeout, WaitPattern, LoopOffset, WindowBar, MarginFill or CursorBlink
- Check spelling and casing of the setting name
- Remove the Set line if the setting does not exist in this vhs version
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at parser/parser.go:450 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of charmbracelet/vhs@c073383b5d (2026-09-02).
Data as JSON: /api/errors/538a0c111ffce306.
Report an issue: GitHub.