{"record":{"id":"99c2a3bc3901cc93","repo":"kovidgoyal/kitty","slug":"unknown-action-func","errorCode":null,"errorMessage":"Unknown action: {func}","messagePattern":"Unknown action: (.+?)","errorType":"validation","errorClass":"KeyError","httpStatus":null,"severity":"error","filePath":"kitty/options/utils.py","lineNumber":1254,"sourceCode":"\ndef symbol_map(val: str) -> Iterable[tuple[tuple[int, int], str]]:\n    yield from symbol_map_parser(val)\n\n\ndef narrow_symbols(val: str) -> Iterable[tuple[tuple[int, int], int]]:\n    for x, y in symbol_map_parser(val, min_size=1):\n        yield x, int(y or 1)\n\n\ndef parse_key_action(action: str, action_type: MapType = MapType.MAP) -> KeyAction:\n    parts = action.strip().split(maxsplit=1)\n    func = parts[0]\n    if len(parts) == 1:\n        return KeyAction(func, ())\n    rest = parts[1]\n    parser = func_with_args.get(func)\n    if parser is None:\n        raise KeyError(f'Unknown action: {func}')\n    func, args = parser(func, rest)\n    return KeyAction(func, tuple(args))\n\n\nclass ActionAlias(NamedTuple):\n    name: str\n    value: str\n    replace_second_arg: bool = False\n\n\nclass AliasMap:\n    def __init__(self) -> None:\n        self.aliases: dict[str, list[ActionAlias]] = {}\n\n    def append(self, name: str, aa: ActionAlias) -> None:\n        self.aliases.setdefault(name, []).append(aa)\n\n    def update(self, aa: 'AliasMap') -> None:","sourceCodeStart":1236,"sourceCodeEnd":1272,"githubUrl":"https://github.com/kovidgoyal/kitty/blob/6d5d0c440603ad9bdf6dcd599f73f6dde21acb44/kitty/options/utils.py#L1236-L1272","documentation":"When a key action in a map line has arguments (a second token), kitty looks up a parser for the action name in func_with_args. An unregistered name raises KeyError with this message.","triggerScenarios":"map lines like 'map f1 someunknownaction arg' where someunknownaction is not a known kitty action; misspelled action names (e.g. 'send_text2', 'launchh') or actions from a newer/older kitty version.","commonSituations":"Typos in action names, using actions removed in upgrades, or passing args to an action that takes none so it isn't in the parser table.","solutions":["Correct the action name via 'kitty --debug-keyboard' or docs listing","If the action takes no arguments, remove the extra argument so it isn't parsed via func_with_args","Check action availability in your kitty version (run kitty +list-actions)"],"exampleFix":"# before\nmap f1 new_window_with_profile default\n# after\nmap f1 launch --type=window","handlingStrategy":"type-guard","validationCode":"from kittens.tui.loop import func_with_args  # or kitty's action registry\ndef action_exists(name: str) -> bool:\n    return name in func_with_args or name in known_no_arg_actions","typeGuard":"def is_known_action(name: str, registry: dict) -> bool:\n    return name in registry","tryCatchPattern":"try:\n    ka = parse_key_action(val)\nexcept KeyError as e:\n    if 'Unknown action' in str(e):\n        log.warning(f'skipping unknown action: {e}')\n    raise","preventionTips":["Validate action names against `kitty +list-actions` output"],"tags":["kitty","config","keybindings","action-not-found"],"backgroundTag":"unknown-action-name","analyzedSha":"6d5d0c440603ad9bdf6dcd599f73f6dde21acb44","analyzedAt":"2026-08-27T14:20:20.142Z","schemaVersion":2},"datasetVersion":"2026-08-27T19:17:21.184Z"}