{"record":{"id":"e7627783496704c8","repo":"kovidgoyal/kitty","slug":"screen-too-short-need-at-least-2-rows","errorCode":null,"errorMessage":"Screen too short, need at least 2 rows","messagePattern":"Screen too short, need at least 2 rows","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"kittens/diff/ui.go","lineNumber":361,"sourceCode":"\tif self.diff_map != nil && self.collection != nil && self.terminal_capabilities_received {\n\t\terr := self.render_diff()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif self.max_scroll_pos.Less(self.scroll_pos) {\n\t\t\tself.scroll_pos = self.max_scroll_pos\n\t\t}\n\t}\n\tself.draw_screen()\n\treturn nil\n}\n\nfunc (self *Handler) render_diff() (err error) {\n\tif self.screen_size.columns < 8 {\n\t\treturn fmt.Errorf(\"Screen too narrow, need at least 8 columns\")\n\t}\n\tif self.screen_size.rows < 2 {\n\t\treturn fmt.Errorf(\"Screen too short, need at least 2 rows\")\n\t}\n\tself.logical_lines, err = render(self.collection, self.diff_map, self.screen_size, self.largest_line_number, self.images_resized_to)\n\tif err != nil {\n\t\treturn err\n\t}\n\tlast := self.logical_lines.Len() - 1\n\tself.max_scroll_pos.logical_line = last\n\tif last > -1 {\n\t\tself.max_scroll_pos.screen_line = len(self.logical_lines.At(last).screen_lines) - 1\n\t} else {\n\t\tself.max_scroll_pos.screen_line = 0\n\t}\n\tself.logical_lines.IncrementScrollPosBy(&self.max_scroll_pos, -self.screen_size.num_lines+1)\n\tif self.current_search != nil {\n\t\tself.current_search.search(self.logical_lines)\n\t}\n\treturn nil\n}","sourceCodeStart":343,"sourceCodeEnd":379,"githubUrl":"https://github.com/kovidgoyal/kitty/blob/6d5d0c440603ad9bdf6dcd599f73f6dde21acb44/kittens/diff/ui.go#L343-L379","documentation":"The height counterpart of the width check in Handler.render_diff: the terminal must have at least 2 rows or rendering is aborted. One row is needed for content and one for the status line, so a single-row terminal cannot display anything.","triggerScenarios":"Resizing the kitty window to a single row (or zero rows) while the diff kitten runs; maximizing the font size so the window fits fewer than 2 rows; embedding the kitten in a 1-row pane under tmux or a tiling WM.","commonSituations":"Extreme font-size increases via kitty shortcuts; tiling layouts stacking windows vertically until kitty is one line tall; scripted launches into pseudo-terminals sized 80x1.","solutions":["Increase the window height to at least 2 rows.","Reduce the font size if a large font made rows effectively disappear.","Fix tiling layouts or tmux pane sizes that starve kitty of vertical space."],"exampleFix":"# before\nstty rows 1; kitty +kitten diff a b\n\n# after\nstty rows 24; kitty +kitten diff a b","handlingStrategy":"validation","validationCode":"// Go: check rows before launching\nif term.IsTerminal(os.Stdout.Fd()) {\n    _, h, err := term.GetSize(int(os.Stdout.Fd()))\n    if err == nil && h < 2 {\n        return errors.New(\"terminal shorter than 2 rows; increase height\")\n    }\n}","typeGuard":null,"tryCatchPattern":"Catch the 'Screen too short' error in resize paths, keep the previous rendered frame, and retry rendering on the next resize event once rows >=2; never propagate it as fatal.","preventionTips":["Give the kitty window at least 2 rows (content + status line).","Bound font-size increases so extreme resizes can't drop below 2 rows.","Debounce resize events and only re-render when size meets the minimums."],"tags":["kitty","diff-kitten","terminal-size","resize","ui"],"backgroundTag":"terminal-too-small","analyzedSha":"6d5d0c440603ad9bdf6dcd599f73f6dde21acb44","analyzedAt":"2026-08-27T14:20:20.142Z","schemaVersion":2},"datasetVersion":"2026-08-27T19:17:21.184Z"}