{"record":{"id":"33209c21df2ad3cb","repo":"kovidgoyal/kitty","slug":"unknown-action-func-check-if-map-action-acti","errorCode":null,"errorMessage":"Unknown action: {func}. Check if map action: {action} is valid","messagePattern":"Unknown action: (.+?)\\. Check if map action: (.+?) is valid","errorType":"validation","errorClass":"KeyError","httpStatus":null,"severity":"error","filePath":"kitty/conf/utils.py","lineNumber":530,"sourceCode":"\n    def pretty(self) -> str:\n        ans = self.func\n        for x in self.args:\n            ans += f' {x}'\n        return ans\n\n\ndef parse_kittens_func_args(action: str, args_funcs: dict[str, KeyFunc[tuple[str, Any]]]) -> KeyAction:\n    parts = action.strip().split(' ', 1)\n    func = parts[0]\n    if len(parts) == 1:\n        return KeyAction(func, ())\n    rest = parts[1]\n\n    try:\n        parser = args_funcs[func]\n    except KeyError as e:\n        raise KeyError(f'Unknown action: {func}. Check if map action: {action} is valid') from e\n\n    try:\n        func, args = parser(func, rest)\n    except Exception:\n        raise ValueError(f'Unknown key action: {action}')\n\n    if not isinstance(args, (list, tuple)):\n        args = (args,)\n\n    return KeyAction(func, tuple(args))\n\n\nKittensKeyDefinition = tuple[ParsedShortcut, KeyAction]\nKittensKeyMap = dict[ParsedShortcut, KeyAction]\n\n\ndef parse_kittens_key(val: str, funcs_with_args: dict[str, KeyFunc[tuple[str, Any]]]) -> KittensKeyDefinition | None:\n    from ..key_encoding import parse_shortcut","sourceCodeStart":512,"sourceCodeEnd":548,"githubUrl":"https://github.com/kovidgoyal/kitty/blob/6d5d0c440603ad9bdf6dcd599f73f6dde21acb44/kitty/conf/utils.py#L512-L548","documentation":"parse_kittens_func_args looks up the map action's function name in the args_funcs registry; an unknown name raises KeyError with a hint to check whether the map action is valid. This is for kitten map actions inside kitten config files.","triggerScenarios":"A map line in a kitten's config using an action name that the kitten's option parser does not register, e.g. `map ctrl+x does_not_exist` inside a custom kitten conf.","commonSituations":"Typos in action names, actions only available in newer kitten versions, or using global kitty actions in a kitten context.","solutions":["Check the kitten's documented actions and fix the name","Update kitty/kitten to a version providing that action","Use launch/--type=kitten syntax for actions not natively supported"],"exampleFix":"# before\nmap ctrl+e send_text all not_a_real_action\n# after\nmap ctrl+e close_window","handlingStrategy":"validation","validationCode":"known_actions = set(args_funcs)  # from the kitten's option parser\nif action_name not in known_actions:\n    raise ValueError(f'unknown kitten action {action_name}; known: {sorted(known_actions)}')","typeGuard":"def is_known_kitten_action(args_funcs: dict, name: str) -> bool:\n    return name in args_funcs","tryCatchPattern":"try:\n    parse_kittens_func_args(action)\nexcept KeyError as e:\n    if 'Unknown action' in str(e):\n        drop_or_rename_map_line(action)\n    else:\n        raise","preventionTips":["Cross-check map action names against the kitten's docs","Test kitten configs after upgrading kitty"],"tags":["kitty","keybinding","kitten","config","keyerror"],"backgroundTag":"unknown-config-key","analyzedSha":"6d5d0c440603ad9bdf6dcd599f73f6dde21acb44","analyzedAt":"2026-08-27T14:20:20.142Z","schemaVersion":2},"datasetVersion":"2026-08-27T19:17:21.184Z"}