kovidgoyal/kitty · warning

Send text: {val} is invalid ({msg}), ignoring

Error message

Send text: {val} is invalid ({msg}), ignoring

What it means

deprecated send_text lines must have at least 3 parts: mode, shortcut, and text. The abort helper logs 'Send text: {val} is invalid (Incomplete), ignoring' (message placeholders may render literally depending on logging formatting).

Source

Thrown at kitty/options/utils.py:1899

    macos_show_window_title_in = ans.get('macos_show_window_title_in', 'all')
    if to_bool(val):
        if macos_show_window_title_in == 'none':
            macos_show_window_title_in = 'menubar'
        elif macos_show_window_title_in == 'window':
            macos_show_window_title_in = 'all'
    else:
        if macos_show_window_title_in == 'all':
            macos_show_window_title_in = 'window'
        elif macos_show_window_title_in == 'menubar':
            macos_show_window_title_in = 'none'
    ans['macos_show_window_title_in'] = macos_show_window_title_in


def deprecated_send_text(key: str, val: str, ans: dict[str, Any]) -> None:
    parts = val.split(' ')

    def abort(msg: str) -> None:
        log_error(f'Send text: {val} is invalid ({msg}), ignoring')

    if len(parts) < 3:
        return abort('Incomplete')
    mode, sc = parts[:2]
    text = ' '.join(parts[2:])
    key_str = f'{sc} send_text {mode} {text}'
    for k in parse_map(key_str):
        ans['map'].append(k)


def deprecated_adjust_line_height(key: str, x: str, opts_dict: dict[str, Any]) -> None:
    fm = {'adjust_line_height': 'cell_height', 'adjust_baseline': 'baseline', 'adjust_column_width': 'cell_width'}[key]
    mtype = getattr(ModificationType, fm)
    if x.endswith('%'):
        ans = float(x[:-1].strip())
        if ans < 0:
            log_error(f'Percentage adjustments of {key} must be positive numbers')
            return

View on GitHub (pinned to 6d5d0c4406)

Solutions

  1. Use the modern map syntax: map <shortcut> send_text <mode> <text...>.
  2. Remove legacy send_text lines.
  3. Ensure mode, shortcut, and text tokens are all present if you must keep legacy syntax.

Example fix

# before
send_text all

# after
map ctrl+enter send_text all some text
Defensive patterns

Strategy: validation

Validate before calling

def valid_legacy_send_text(val: str) -> bool:
    return len(val.split(' ')) >= 3

Type guard

def is_send_text_complete(val: str) -> bool:
    return len(val.split(' ')) >= 3

Prevention

When it happens

Trigger: A send_text line like 'send_text all' (2 tokens) or fewer; legacy syntax with missing text portion.

Common situations: Migrating very old kitty configs that used send_text with different arity; truncated paste of a config line.

Related errors


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