{"record":{"id":"67e90f5b6b48cc1f","repo":"kovidgoyal/kitty","slug":"invalid-characters-in-visual-window-select-charact-67e90f","errorCode":null,"errorMessage":"Invalid characters in visual_window_select_characters: {x} Contains identical numbers or alphabets, case insensitive. Ignoring.","messagePattern":"Invalid characters in visual_window_select_characters: (.+?) Contains identical numbers or alphabets, case insensitive\\. Ignoring\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"warning","filePath":"kitty/options/utils.py","lineNumber":820,"sourceCode":"\n\ndef resize_debounce_time(x: str) -> tuple[float, float]:\n    parts = x.split(maxsplit=1)\n    if len(parts) == 1:\n        return positive_float(parts[0]), 0.5\n    return positive_float(parts[0]), positive_float(parts[1])\n\n\ndef visual_window_select_characters(x: str) -> str:\n    import string\n\n    valid_characters = string.digits + string.ascii_uppercase + \"-=[]\\\\;',./`\"\n    ans = x.upper()\n    ans_chars = set(ans)\n    if not ans_chars.issubset(set(valid_characters)):\n        raise ValueError(f'Invalid characters in visual_window_select_characters: {x} Only numbers (0-9) and alphabets (a-z,A-Z) are allowed. Ignoring.')\n    if len(ans_chars) < len(x):\n        raise ValueError(f'Invalid characters in visual_window_select_characters: {x} Contains identical numbers or alphabets, case insensitive. Ignoring.')\n    return ans\n\n\ndef tab_separator(x: str) -> str:\n    for q in '\\'\"':\n        if x.startswith(q) and x.endswith(q):\n            x = x[1:-1]\n            if not x:\n                return ''\n            break\n    if not x.strip():\n        x = ('\\xa0' * len(x)) if x else default_tab_separator\n    return x\n\n\ndef tab_bar_edge(x: str) -> int:\n    match x.lower():\n        case 'top':","sourceCodeStart":802,"sourceCodeEnd":838,"githubUrl":"https://github.com/kovidgoyal/kitty/blob/6d5d0c440603ad9bdf6dcd599f73f6dde21acb44/kitty/options/utils.py#L802-L838","documentation":"The second check in visual_window_select_characters: after uppercasing, duplicate characters (case-insensitive) are rejected because len(set) < len(input). Each character must uniquely identify a window.","triggerScenarios":"visual_window_select_characters aA0123... — 'a' and 'A' collapse to the same label.","commonSituations":"Adding both cases of a letter, or duplicate characters from merging config snippets.","solutions":["Remove duplicate characters (remember comparison is case-insensitive)","Dedupe before writing the value"],"exampleFix":"# before\nvisual_window_select_characters aAbB01\n# after\nvisual_window_select_characters ab01","handlingStrategy":"validation","validationCode":"def unique_vwsc(x: str) -> bool:\n    return len(set(x.upper())) == len(x)","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Dedupe case-insensitively before setting","Treat 'a' and 'A' as the same character"],"tags":["kitty","config","window-management"],"backgroundTag":"config-value-validation-failed","analyzedSha":"6d5d0c440603ad9bdf6dcd599f73f6dde21acb44","analyzedAt":"2026-08-27T14:20:20.142Z","schemaVersion":2},"datasetVersion":"2026-08-27T19:17:21.184Z"}