{"record":{"id":"aba65f7c51f368db","repo":"kovidgoyal/kitty","slug":"rest-is-not-a-valid-scroll-to-mark-destination","errorCode":null,"errorMessage":"{rest} is not a valid scroll_to_mark destination","messagePattern":"(.+?) is not a valid scroll_to_mark destination","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"kitty/options/utils.py","lineNumber":472,"sourceCode":"        raise ValueError(f'{rest} is not a valid marker specification')\n    ftype, spec = parts\n    parts = list(shlex_split(spec))\n    return func, list(parse_marker_spec(ftype, parts))\n\n\n@func_with_args('scroll_to_mark')\ndef scroll_to_mark(func: str, rest: str) -> FuncArgsType:\n    parts = rest.split()\n    if not parts or not rest:\n        return func, [True, 0]\n    if len(parts) == 1:\n        q = parts[0].lower()\n        if q in ('prev', 'previous', 'next'):\n            return func, [q != 'next', 0]\n        try:\n            return func, [True, max(0, min(int(q), 3))]\n        except Exception:\n            raise ValueError(f'{rest} is not a valid scroll_to_mark destination')\n    return func, [parts[0] != 'next', max(0, min(int(parts[1]), 3))]\n\n\n@func_with_args('mouse_selection')\ndef mouse_selection(func: str, rest: str) -> FuncArgsType:\n    cmap = getattr(mouse_selection, 'code_map', None)\n    if cmap is None:\n        cmap = {\n            'normal': defines.MOUSE_SELECTION_NORMAL,\n            'extend': defines.MOUSE_SELECTION_EXTEND,\n            'move-end': defines.MOUSE_SELECTION_MOVE_END,\n            'move_end': defines.MOUSE_SELECTION_MOVE_END,\n            'rectangle': defines.MOUSE_SELECTION_RECTANGLE,\n            'word': defines.MOUSE_SELECTION_WORD,\n            'line': defines.MOUSE_SELECTION_LINE,\n            'line_from_begin': defines.MOUSE_SELECTION_LINE_FROM_BEGIN,\n            'line_from_point': defines.MOUSE_SELECTION_LINE_FROM_POINT,\n            'word_and_line_from_point': defines.MOUSE_SELECTION_WORD_AND_LINE_FROM_POINT,","sourceCodeStart":454,"sourceCodeEnd":490,"githubUrl":"https://github.com/kovidgoyal/kitty/blob/6d5d0c440603ad9bdf6dcd599f73f6dde21acb44/kitty/options/utils.py#L454-L490","documentation":"scroll_to_mark raises this when its destination argument is neither prev/previous/next nor an integer in 0..3. The parser accepts a direction word or a mark column index clamped to 0-3; anything else fails int() and raises ValueError.","triggerScenarios":"map f1 scroll_to_mark home or toggle_marker-style specs; any non-numeric, non-keyword first token. Also when two tokens are given and parts[1] is not an int.","commonSituations":"Typo'd keywords ('backward', 'up'), or assuming arbitrary column numbers/out-of-range formats work.","solutions":["Use prev, previous, next, or an integer 0-3","For multi-token form use e.g. scroll_to_mark next 1"],"exampleFix":"# before\nmap f1 scroll_to_mark home\n# after\nmap f1 scroll_to_mark next","handlingStrategy":"validation","validationCode":"def valid_scroll_dest(q: str) -> bool:\n    return q.lower() in ('prev','previous','next') or (q.isdigit() and 0 <= int(q) <= 3)","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Restrict destinations to prev/next or integers 0-3","Avoid free-form user input in scroll_to_mark bindings"],"tags":["kitty","config","terminal","markers"],"backgroundTag":"config-value-validation-failed","analyzedSha":"6d5d0c440603ad9bdf6dcd599f73f6dde21acb44","analyzedAt":"2026-08-27T14:20:20.142Z","schemaVersion":2},"datasetVersion":"2026-08-27T19:17:21.184Z"}