kovidgoyal/kitty · warning · ErrNoLexer

No lexer available for this format

Error message

No lexer available for this format

What it means

ErrNoLexer is returned by HighlightFile (and the highlight API) in tools/highlight when no chroma lexer can be resolved for the given file/format. The API uses chroma to syntax-highlight text; it first resolves a lexer by filename or format name (honoring SyntaxAliases() and TextForPath()); if chroma has no match, this sentinel error is returned so callers can fall back to plain, unhighlighted output.

Source

Thrown at tools/highlight/api.go:13

package highlight

import (
	"errors"
	"fmt"

	"github.com/alecthomas/chroma/v2"
	"github.com/kovidgoyal/kitty/tools/utils"
)

var _ = fmt.Print

var ErrNoLexer = errors.New("No lexer available for this format")

type StyleResolveData interface {
	StyleName() string
	UseLightColors() bool
	SyntaxAliases() map[string]string
	TextForPath(string) (string, error)
}

type Highlighter interface {
	HighlightFile(path string, srd StyleResolveData) (highlighted_string string, err error)
	Sanitize(string) string
}

func NewHighlighter(sanitize func(string) string) Highlighter {
	if sanitize == nil {
		sanitize = func(text string) string { return utils.ReplaceControlCodes(text, "    ", "\n") }
	}
	return &highlighter{sanitize: sanitize, tokens_map: make(map[string][]chroma.Token)}

View on GitHub (pinned to 6d5d0c4406)

Solutions

  1. Handle ErrNoLexer explicitly and fall back to plain text rendering (errors.Is(err, highlight.ErrNoLexer))
  2. Pass an explicit lexer/format (or add an entry to SyntaxAliases) so resolution succeeds
  3. Verify the format string matches a chroma lexer name (see chroma's lexers registry)

Example fix

// before
text, err := highlight.HighlightFile(f, ..., srd)
if err != nil { return err } // unknown extension aborts preview

// after
text, err := highlight.HighlightFile(f, ..., srd)
if errors.Is(err, highlight.ErrNoLexer) {
    text, err = plainFallback(f) // render without highlighting
}
if err != nil { return err }
Defensive patterns

Strategy: type-guard

Validate before calling

// pre-check lexer availability before highlighting
import "github.com/alecthomas/chroma/v2/lexers"

func hasLexer(path, format string, aliases map[string]string) bool {
    if a, ok := aliases[format]; ok { format = a }
    if format != "" && lexers.Get(format) != nil { return true }
    return lexers.Match(path) != nil
}

Type guard

func isNoLexer(err error) bool {
    return errors.Is(err, highlight.ErrNoLexer)
}

Try / catch

text, err := highlight.HighlightFile(...)
if errors.Is(err, highlight.ErrNoLexer) {
    text = plainRender(...)  // graceful degradation
    err = nil
}

Prevention

When it happens

Trigger: Calling HighlightFile with a file whose extension/first-line yields no chroma lexer, or a format string that isn't a registered lexer name and isn't covered by the StyleResolveData's syntax aliases; e.g. highlighting a file with an unknown extension like .xyz123.

Common situations: Previewing or echoing files with exotic or extensionless names in kitten tools (e.g. `kitten icat`-adjacent previews, `kitten diff` on unusual files); custom format strings that don't map to chroma lexer names; a syntax alias map missing an entry for a newly supported format.

Related errors


AI-assisted analysis of kovidgoyal/kitty@6d5d0c4406 (2026-08-27). Data as JSON: /api/errors/d9d0a8cfaeb2bfe9. Report an issue: GitHub.