diff --git a/src/tui/editor.zig b/src/tui/editor.zig index 92fe573..6054cac 100644 --- a/src/tui/editor.zig +++ b/src/tui/editor.zig @@ -4518,7 +4518,9 @@ pub const Editor = struct { return error.InvalidGotoColumnArgument; const root = self.buf_root() catch return; const primary = self.get_primary(); - try primary.cursor.move_to(root, primary.cursor.row, @intCast(if (column < 1) 0 else column - 1), self.metrics); + column = if (column < 1) 0 else column - 1; + column = try root.pos_to_width(primary.cursor.row, column, self.metrics); + try primary.cursor.move_to(root, primary.cursor.row, column, self.metrics); self.clamp(); } pub const goto_column_meta: Meta = .{ .arguments = &.{.integer} }; diff --git a/src/tui/editor_gutter.zig b/src/tui/editor_gutter.zig index 44ddd33..f2eb17c 100644 --- a/src/tui/editor_gutter.zig +++ b/src/tui/editor_gutter.zig @@ -24,8 +24,8 @@ plane: Plane, parent: Widget, lines: u32 = 0, -rows: u32 = 1, -row: u32 = 1, +view_rows: u32 = 1, +view_top: u32 = 1, line: usize = 0, linenum: bool, relative: bool, @@ -81,7 +81,7 @@ fn diff_symbols_clear(self: *Self) void { pub fn handle_event(self: *Self, _: tp.pid_ref, m: tp.message) tp.result { if (try m.match(.{ "E", "update", tp.more })) return self.diff_update() catch |e| return tp.exit_error(e, @errorReturnTrace()); - if (try m.match(.{ "E", "view", tp.extract(&self.lines), tp.extract(&self.rows), tp.extract(&self.row) })) + if (try m.match(.{ "E", "view", tp.extract(&self.lines), tp.extract(&self.view_rows), tp.extract(&self.view_top) })) return self.update_width(); if (try m.match(.{ "E", "pos", tp.extract(&self.lines), tp.extract(&self.line), tp.more })) return self.update_width(); @@ -150,8 +150,8 @@ pub fn render(self: *Self, theme: *const Widget.Theme) bool { pub fn render_none(self: *Self, theme: *const Widget.Theme) void { var pos: usize = 0; - var linenum = self.row + 1; - var rows = self.rows; + var linenum = self.view_top + 1; + var rows = self.view_rows; var diff_symbols = self.diff_symbols.items; while (rows > 0) : (rows -= 1) { if (linenum > self.lines) return; @@ -165,8 +165,8 @@ pub fn render_none(self: *Self, theme: *const Widget.Theme) void { pub fn render_linear(self: *Self, theme: *const Widget.Theme) void { var pos: usize = 0; - var linenum = self.row + 1; - var rows = self.rows; + var linenum = self.view_top + 1; + var rows = self.view_rows; var diff_symbols = self.diff_symbols.items; while (rows > 0) : (rows -= 1) { if (linenum > self.lines) return; @@ -188,15 +188,15 @@ pub fn render_linear(self: *Self, theme: *const Widget.Theme) void { } pub fn render_relative(self: *Self, theme: *const Widget.Theme) void { - const row: isize = @intCast(self.row + 1); + const row: isize = @intCast(self.view_top + 1); const line: isize = @intCast(self.line + 1); var pos: usize = 0; var linenum: isize = row - line; - var abs_linenum = self.row + 1; - var rows = self.rows; + var abs_linenum = self.view_top + 1; + var rows = self.view_rows; var diff_symbols = self.diff_symbols.items; while (rows > 0) : (rows -= 1) { - if (pos > self.lines - @as(u32, @intCast(row))) return; + if (self.lines > @as(u32, @intCast(row)) and pos > self.lines - @as(u32, @intCast(row))) return; self.plane.set_style(if (linenum == 0) theme.editor_gutter_active else theme.editor_gutter); const val = @abs(if (linenum == 0) line else linenum); @@ -260,7 +260,7 @@ fn render_diagnostics(self: *Self, theme: *const Widget.Theme) void { fn render_diagnostic(self: *Self, diag: *const ed.Diagnostic, theme: *const Widget.Theme) void { const row = diag.sel.begin.row; - if (!(self.row < row and row < self.row + self.rows)) return; + if (!(self.view_top < row and row < self.view_top + self.view_rows)) return; const style_ = switch (diag.get_severity()) { .Error => theme.editor_error, .Warning => theme.editor_warning, @@ -273,7 +273,7 @@ fn render_diagnostic(self: *Self, diag: *const ed.Diagnostic, theme: *const Widg .Information => "", .Hint => "", }; - const y = row - self.row; + const y = row - self.view_top; self.plane.cursor_move_yx(@intCast(y), 0) catch return; var cell = self.plane.cell_init(); _ = self.plane.at_cursor_cell(&cell) catch return; @@ -284,7 +284,7 @@ fn render_diagnostic(self: *Self, diag: *const ed.Diagnostic, theme: *const Widg fn primary_click(self: *const Self, y_: i32) error{Exit}!bool { const y = self.editor.plane.abs_y_to_rel(y_); - var line = self.row + 1; + var line = self.view_top + 1; line += @intCast(y); if (line > self.lines) line = self.lines; try command.executeName("goto_line", command.fmt(.{line}));