From ec3bba2aff545967018847ae3a5836ff6bec8f4d Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Thu, 20 Feb 2025 20:51:09 +0100 Subject: [PATCH] feat: let mini modes inherit gutter line number modes --- src/keybind/keybind.zig | 7 ++++--- src/tui/editor_gutter.zig | 33 +++++++++++++++++++++++++-------- src/tui/mainview.zig | 2 +- 3 files changed, 30 insertions(+), 12 deletions(-) diff --git a/src/keybind/keybind.zig b/src/keybind/keybind.zig index 5eb3cc9..236a53f 100644 --- a/src/keybind/keybind.zig +++ b/src/keybind/keybind.zig @@ -78,7 +78,7 @@ pub const Mode = struct { mode: []const u8, name: []const u8 = "", - line_numbers: LineNumbers = .absolute, + line_numbers: LineNumbers = .inherit, keybind_hints: *const KeybindHints, cursor_shape: ?CursorShape = null, selection_style: SelectionStyle, @@ -365,7 +365,7 @@ const BindingSet = struct { syntax: KeySyntax = .flow, on_match_failure: OnMatchFailure = .ignore, name: []const u8, - line_numbers: LineNumbers = .absolute, + line_numbers: LineNumbers = .inherit, cursor_shape: ?CursorShape = null, selection_style: SelectionStyle, insert_command: []const u8 = "", @@ -383,7 +383,7 @@ const BindingSet = struct { syntax: KeySyntax = .flow, on_match_failure: OnMatchFailure = .insert, name: ?[]const u8 = null, - line_numbers: LineNumbers = .absolute, + line_numbers: LineNumbers = .inherit, cursor: ?CursorShape = null, inherit: ?[]const u8 = null, selection: ?SelectionStyle = null, @@ -663,6 +663,7 @@ const BindingSet = struct { }; pub const LineNumbers = enum { + inherit, absolute, relative, }; diff --git a/src/tui/editor_gutter.zig b/src/tui/editor_gutter.zig index 04bae89..53ae8fe 100644 --- a/src/tui/editor_gutter.zig +++ b/src/tui/editor_gutter.zig @@ -27,7 +27,7 @@ view_rows: u32 = 1, view_top: u32 = 1, line: usize = 0, linenum: bool, -relative: bool, +mode: ?LineNumberMode = null, render_style: DigitStyle, highlight: bool, symbols: bool, @@ -48,7 +48,7 @@ pub fn create(allocator: Allocator, parent: Widget, event_source: Widget, editor .plane = try Plane.init(&(Widget.Box{}).opts(@typeName(Self)), parent.plane.*), .parent = parent, .linenum = tui.config().gutter_line_numbers, - .relative = tui.config().gutter_line_numbers_relative, + .mode = if (tui.config().gutter_line_numbers_relative) .relative else null, .render_style = tui.config().gutter_line_numbers_style, .highlight = tui.config().highlight_current_line_gutter, .symbols = tui.config().gutter_symbols, @@ -113,7 +113,7 @@ pub fn receive(self: *Self, _: tp.pid_ref, m: tp.message) error{Exit}!bool { fn update_width(self: *Self) void { if (!self.linenum) return; const width = int_width(self.lines); - self.width = if (self.relative and width > 4) 4 else @max(width, 2); + self.width = if (self.mode == .relative and width > 4) 4 else @max(width, 2); self.width += if (self.symbols) 3 else 1; } @@ -125,6 +125,24 @@ inline fn get_width(self: *Self) usize { return if (self.linenum) self.width else if (self.symbols) 3 else 1; } +fn get_numbering_mode(self: *const Self) LineNumberMode { + return self.mode orelse switch (if (tui.input_mode()) |mode| mode.line_numbers else .absolute) { + .relative => .relative, + .inherit => if (tui.input_mode_outer()) |mode| from_mode_enum(mode.line_numbers) else .absolute, + .absolute => .absolute, + }; +} + +const LineNumberMode = enum { relative, absolute }; + +fn from_mode_enum(mode: anytype) LineNumberMode { + return switch (mode) { + .relative => .relative, + .inherit => .absolute, + .absolute => .absolute, + }; +} + pub fn render(self: *Self, theme: *const Widget.Theme) bool { const frame = tracy.initZone(@src(), .{ .name = "gutter render" }); defer frame.deinit(); @@ -134,11 +152,10 @@ pub fn render(self: *Self, theme: *const Widget.Theme) bool { self.plane.set_style(theme.editor_gutter); _ = self.plane.fill(" "); if (self.linenum) { - const relative = self.relative or if (tui.input_mode()) |mode| mode.line_numbers == .relative else false; - if (relative) - self.render_relative(theme) - else - self.render_linear(theme); + switch (self.get_numbering_mode()) { + .relative => self.render_relative(theme), + .absolute => self.render_linear(theme), + } } else { self.render_none(theme); } diff --git a/src/tui/mainview.zig b/src/tui/mainview.zig index 7928ad8..d781da1 100644 --- a/src/tui/mainview.zig +++ b/src/tui/mainview.zig @@ -590,7 +590,7 @@ const cmds = struct { if (self.widgets.get("editor_gutter")) |gutter_widget| { const gutter = gutter_widget.dynamic_cast(@import("editor_gutter.zig")) orelse return; gutter.linenum = ln; - gutter.relative = lnr; + gutter.mode = if(lnr) .relative else null; } } pub const gutter_mode_next_meta = .{ .description = "Next gutter mode" };