From 4fcde7b861bff4a60cdd1f7226b7bba4555239fd Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Wed, 18 Feb 2026 14:14:47 +0100 Subject: [PATCH] fix: scroll_cursor_min_border_distance should always be read from config And fix an off-by-one issue causing the distance at the bottom of the view to be one line less than the top. close #506 --- src/buffer/View.zig | 6 +++--- src/tui/editor.zig | 14 +++++++------- src/tui/tui.zig | 1 + 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/buffer/View.zig b/src/buffer/View.zig index a11e54e..1d5a89b 100644 --- a/src/buffer/View.zig +++ b/src/buffer/View.zig @@ -9,7 +9,7 @@ col: usize = 0, rows: usize = 0, cols: usize = 0, -const scroll_cursor_min_border_distance = 5; +pub var scroll_cursor_min_border_distance: usize = 5; const scroll_cursor_min_border_distance_mouse = 1; const Self = @This(); @@ -65,7 +65,7 @@ inline fn is_at_top(self: *const Self) bool { inline fn is_at_bottom(self: *const Self, root: Buffer.Root) bool { if (root.lines() < self.rows) return true; - return self.row >= root.lines() - scroll_cursor_min_border_distance; + return self.row >= root.lines() -| scroll_cursor_min_border_distance; } pub inline fn is_visible(self: *const Self, cursor: *const Cursor) bool { @@ -96,7 +96,7 @@ inline fn to_cursor_bottom(self: *const Self, root: Buffer.Root) Cursor { fn clamp_row(self: *Self, cursor: *const Cursor, abs: bool, bottom_offset: usize) void { const top_min_border_distance: usize = if (abs) scroll_cursor_min_border_distance_mouse else scroll_cursor_min_border_distance; - const bottom_min_border_distance: usize = top_min_border_distance + bottom_offset; + const bottom_min_border_distance: usize = top_min_border_distance + bottom_offset + 1; if (cursor.row < top_min_border_distance) { self.row = 0; return; diff --git a/src/tui/editor.zig b/src/tui/editor.zig index dc6e089..eaf6319 100644 --- a/src/tui/editor.zig +++ b/src/tui/editor.zig @@ -2987,7 +2987,7 @@ pub const Editor = struct { } pub fn update_scroll_dest_abs(self: *Self, dest: usize) void { - const scroll_cursor_min_border_distance = tui.config().scroll_cursor_min_border_distance; + const scroll_cursor_min_border_distance = Buffer.View.scroll_cursor_min_border_distance; const root = self.buf_root() catch return; const max_view = if (root.lines() <= scroll_cursor_min_border_distance) 0 else root.lines() - scroll_cursor_min_border_distance; self.scroll_dest = @min(dest, max_view); @@ -3057,7 +3057,7 @@ pub const Editor = struct { pub const scroll_view_center_meta: Meta = .{ .description = "Scroll cursor to center of view" }; pub fn scroll_view_center_cycle(self: *Self, _: Context) Result { - const scroll_cursor_min_border_distance = tui.config().scroll_cursor_min_border_distance; + const scroll_cursor_min_border_distance = Buffer.View.scroll_cursor_min_border_distance; const cursor_row = self.get_primary().cursor.row; return if (cursor_row == self.view.row + scroll_cursor_min_border_distance) self.scroll_view_bottom(.{}) @@ -3069,14 +3069,14 @@ pub const Editor = struct { pub const scroll_view_center_cycle_meta: Meta = .{ .description = "Scroll cursor to center/top/bottom of view" }; pub fn scroll_view_top(self: *Self, _: Context) Result { - const scroll_cursor_min_border_distance = tui.config().scroll_cursor_min_border_distance; + const scroll_cursor_min_border_distance = Buffer.View.scroll_cursor_min_border_distance; return self.scroll_view_offset(scroll_cursor_min_border_distance); } pub const scroll_view_top_meta: Meta = .{}; pub fn scroll_view_bottom(self: *Self, _: Context) Result { - const scroll_cursor_min_border_distance = tui.config().scroll_cursor_min_border_distance; - return self.scroll_view_offset(if (self.view.rows > scroll_cursor_min_border_distance) self.view.rows - scroll_cursor_min_border_distance else 0); + const scroll_cursor_min_border_distance = Buffer.View.scroll_cursor_min_border_distance; + return self.scroll_view_offset(if (self.view.rows > scroll_cursor_min_border_distance) self.view.rows -| scroll_cursor_min_border_distance + 1 else 0); } pub const scroll_view_bottom_meta: Meta = .{}; @@ -6386,7 +6386,7 @@ pub const Editor = struct { const cursor = sel.begin; const range_height = sel.end.row - sel.begin.row + 1; const view_height = self.view.rows; - const scroll_cursor_min_border_distance = tui.config().scroll_cursor_min_border_distance; + const scroll_cursor_min_border_distance = Buffer.View.scroll_cursor_min_border_distance; const offset = if (range_height > view_height - @min(view_height, scroll_cursor_min_border_distance * 2)) scroll_cursor_min_border_distance else @@ -6416,7 +6416,7 @@ pub const Editor = struct { primary.cursor = cursor; const range_height = sel.end.row - sel.begin.row + 1; const view_height = self.view.rows; - const scroll_cursor_min_border_distance = tui.config().scroll_cursor_min_border_distance; + const scroll_cursor_min_border_distance = Buffer.View.scroll_cursor_min_border_distance; const offset = if (range_height > view_height - @min(view_height, scroll_cursor_min_border_distance * 2)) scroll_cursor_min_border_distance else diff --git a/src/tui/tui.zig b/src/tui/tui.zig index c80fdde..1e9d216 100644 --- a/src/tui/tui.zig +++ b/src/tui/tui.zig @@ -177,6 +177,7 @@ fn init(allocator: Allocator) InitError!*Self { tp.env.get().set("follow_directory_symlinks", conf.follow_directory_symlinks); tp.env.get().set("log_ignored_links", conf.log_ignored_links); tp.env.get().num_set("maximum_symlink_depth", @intCast(conf.maximum_symlink_depth)); + Buffer.View.scroll_cursor_min_border_distance = conf.scroll_cursor_min_border_distance; var self = try allocator.create(Self); // don't destroy