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 20

View on GitHub (pinned to c073383b5d)

Solutions

  1. Use a supported setting name such as TypingSpeed, WaitTimeout, WaitPattern, LoopOffset, WindowBar, MarginFill or CursorBlink
  2. Check spelling and casing of the setting name
  3. 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.