From 9ab1b78a530f02d6d55560d8732149a9304eff8e Mon Sep 17 00:00:00 2001 From: Miguel Granero Date: Sun, 25 Jan 2026 17:43:24 +0100 Subject: [PATCH 1/2] feat: fix blame by offsetting current line with changes Reappied. see #468 --- src/tui/editor.zig | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/tui/editor.zig b/src/tui/editor.zig index 43456f0..c13be2a 100644 --- a/src/tui/editor.zig +++ b/src/tui/editor.zig @@ -1475,11 +1475,38 @@ pub const Editor = struct { _ = self.plane.putc(&cell) catch {}; } + inline fn get_delta_lines_until_row(self: *const Self, row: usize) ?i32 { + var delta_lines: i32 = 0; + + for (self.changes.items) |change| { + if (change.line > row) + break; + + if (change.kind == .insert) + if (row >= change.line and row < change.line + change.lines) + return null; + + switch (change.kind) { + .insert => delta_lines -= @intCast(change.lines), + .delete => delta_lines += @intCast(change.lines), + else => {}, + } + } + + return delta_lines; + } + fn render_blame(self: *Self, theme: *const Widget.Theme, hl_row: ?usize, cell_map: CellMap) !void { const cursor = self.get_primary().cursor; const pos = self.screen_cursor(&cursor) orelse return; const buffer = self.buffer orelse return; - const commit = buffer.get_vcs_blame(cursor.row) orelse return; + + // Get delta line from HEAD version with diffs + const casted_row: i32 = @intCast(cursor.row); + const delta = self.get_delta_lines_until_row(cursor.row) orelse return; + const head_line: i32 = delta + casted_row; + if (head_line < 0) return; + const commit = buffer.get_vcs_blame(@intCast(head_line)) orelse return; var buf: std.Io.Writer.Allocating = .init(self.allocator); defer buf.deinit(); From 6603e60951d7d002d317c4e89da2bcbf05d37b88 Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Wed, 28 Jan 2026 18:13:55 +0100 Subject: [PATCH 2/2] refactor: minor simplification --- src/tui/editor.zig | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/tui/editor.zig b/src/tui/editor.zig index c13be2a..934b61e 100644 --- a/src/tui/editor.zig +++ b/src/tui/editor.zig @@ -1475,8 +1475,10 @@ pub const Editor = struct { _ = self.plane.putc(&cell) catch {}; } - inline fn get_delta_lines_until_row(self: *const Self, row: usize) ?i32 { - var delta_lines: i32 = 0; + /// Get delta line from HEAD version with diffs + inline fn get_delta_lines_until_row(self: *const Self, row_: usize) ?usize { + const row: isize = @intCast(row_); + var delta_lines: isize = 0; for (self.changes.items) |change| { if (change.line > row) @@ -1493,7 +1495,8 @@ pub const Editor = struct { } } - return delta_lines; + const head_line = delta_lines + row; + return if (head_line < 0) null else @intCast(head_line); } fn render_blame(self: *Self, theme: *const Widget.Theme, hl_row: ?usize, cell_map: CellMap) !void { @@ -1501,12 +1504,8 @@ pub const Editor = struct { const pos = self.screen_cursor(&cursor) orelse return; const buffer = self.buffer orelse return; - // Get delta line from HEAD version with diffs - const casted_row: i32 = @intCast(cursor.row); - const delta = self.get_delta_lines_until_row(cursor.row) orelse return; - const head_line: i32 = delta + casted_row; - if (head_line < 0) return; - const commit = buffer.get_vcs_blame(@intCast(head_line)) orelse return; + const blame_row = self.get_delta_lines_until_row(cursor.row) orelse return; + const commit = buffer.get_vcs_blame(blame_row) orelse return; var buf: std.Io.Writer.Allocating = .init(self.allocator); defer buf.deinit();