From 2726dc3fb8bfb266d22d4887415b2eede4f2493c Mon Sep 17 00:00:00 2001 From: Arian Date: Wed, 19 Feb 2025 13:38:45 -0800 Subject: [PATCH 1/4] Set php's default LSP to intelephense --- src/syntax/src/file_types.zig | 1 + 1 file changed, 1 insertion(+) diff --git a/src/syntax/src/file_types.zig b/src/syntax/src/file_types.zig index 2b397ec..683fde5 100644 --- a/src/syntax/src/file_types.zig +++ b/src/syntax/src/file_types.zig @@ -389,6 +389,7 @@ pub const php = .{ .extensions = .{"php"}, .comment = "//", .injections = "tree-sitter-php/queries/injections.scm", + .language_server = .{"intelephense", "--stdio"}, }; pub const purescript = .{ From eb569157a8afc53467956e49779643dd7e9c6b56 Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Thu, 20 Feb 2025 20:48:08 +0100 Subject: [PATCH 2/4] feat(vim): add N vim mode binding for goto_prev_match --- src/keybind/builtin/vim.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/keybind/builtin/vim.json b/src/keybind/builtin/vim.json index 3871c22..12ad456 100644 --- a/src/keybind/builtin/vim.json +++ b/src/keybind/builtin/vim.json @@ -40,6 +40,7 @@ ["V", ["enter_mode", "visual line"], ["select_line_vim"]], ["n", "goto_next_match"], + ["N", "goto_prev_match"], ["0", "move_begin"], ["^", "smart_move_begin"], ["$", "move_end"], 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 3/4] 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" }; From b9cc3936c8ac78443254ed14fd9ed7b23413e388 Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Thu, 20 Feb 2025 21:09:44 +0100 Subject: [PATCH 4/4] refactor: BREAKING merge gutter_line_numbers and gutter_line_numbers_relative config options into an enum --- src/config.zig | 9 +++++++-- src/main.zig | 7 +++++++ src/tui/editor_gutter.zig | 22 ++++++++-------------- src/tui/mainview.zig | 24 ++++++++---------------- 4 files changed, 30 insertions(+), 32 deletions(-) diff --git a/src/config.zig b/src/config.zig index 8f74b58..8f011f4 100644 --- a/src/config.zig +++ b/src/config.zig @@ -3,8 +3,7 @@ const builtin = @import("builtin"); frame_rate: usize = 60, theme: []const u8 = "default", input_mode: []const u8 = "flow", -gutter_line_numbers: bool = true, -gutter_line_numbers_relative: bool = false, +gutter_line_numbers_mode: ?LineNumberMode = null, gutter_line_numbers_style: DigitStyle = .ascii, gutter_symbols: bool = true, enable_terminal_cursor: bool = true, @@ -34,3 +33,9 @@ pub const DigitStyle = enum { subscript, superscript, }; + +pub const LineNumberMode = enum { + none, + relative, + absolute, +}; diff --git a/src/main.zig b/src/main.zig index ef2d734..c4a440a 100644 --- a/src/main.zig +++ b/src/main.zig @@ -619,6 +619,13 @@ fn config_eql(comptime T: type, a: T, b: T) bool { } switch (@typeInfo(T)) { .Bool, .Int, .Float, .Enum => return a == b, + .Optional => |info| { + if (a == null and b == null) + return true; + if (a == null or b == null) + return false; + return config_eql(info.child, a.?, b.?); + }, else => {}, } @compileError("unsupported config type " ++ @typeName(T)); diff --git a/src/tui/editor_gutter.zig b/src/tui/editor_gutter.zig index 53ae8fe..21297c0 100644 --- a/src/tui/editor_gutter.zig +++ b/src/tui/editor_gutter.zig @@ -17,6 +17,7 @@ const MessageFilter = @import("MessageFilter.zig"); const tui = @import("tui.zig"); const ed = @import("editor.zig"); const DigitStyle = @import("config").DigitStyle; +const LineNumberMode = @import("config").LineNumberMode; allocator: Allocator, plane: Plane, @@ -26,7 +27,6 @@ lines: u32 = 0, view_rows: u32 = 1, view_top: u32 = 1, line: usize = 0, -linenum: bool, mode: ?LineNumberMode = null, render_style: DigitStyle, highlight: bool, @@ -47,8 +47,7 @@ pub fn create(allocator: Allocator, parent: Widget, event_source: Widget, editor .allocator = allocator, .plane = try Plane.init(&(Widget.Box{}).opts(@typeName(Self)), parent.plane.*), .parent = parent, - .linenum = tui.config().gutter_line_numbers, - .mode = if (tui.config().gutter_line_numbers_relative) .relative else null, + .mode = tui.config().gutter_line_numbers_mode, .render_style = tui.config().gutter_line_numbers_style, .highlight = tui.config().highlight_current_line_gutter, .symbols = tui.config().gutter_symbols, @@ -111,7 +110,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; + if (self.mode == .none) return; const width = int_width(self.lines); self.width = if (self.mode == .relative and width > 4) 4 else @max(width, 2); self.width += if (self.symbols) 3 else 1; @@ -122,7 +121,7 @@ pub fn layout(self: *Self) Widget.Layout { } inline fn get_width(self: *Self) usize { - return if (self.linenum) self.width else if (self.symbols) 3 else 1; + return if (self.mode != .none) self.width else if (self.symbols) 3 else 1; } fn get_numbering_mode(self: *const Self) LineNumberMode { @@ -133,8 +132,6 @@ fn get_numbering_mode(self: *const Self) LineNumberMode { }; } -const LineNumberMode = enum { relative, absolute }; - fn from_mode_enum(mode: anytype) LineNumberMode { return switch (mode) { .relative => .relative, @@ -151,13 +148,10 @@ pub fn render(self: *Self, theme: *const Widget.Theme) bool { self.plane.home(); self.plane.set_style(theme.editor_gutter); _ = self.plane.fill(" "); - if (self.linenum) { - switch (self.get_numbering_mode()) { - .relative => self.render_relative(theme), - .absolute => self.render_linear(theme), - } - } else { - self.render_none(theme); + switch (self.get_numbering_mode()) { + .none => self.render_none(theme), + .relative => self.render_relative(theme), + .absolute => self.render_linear(theme), } if (self.symbols) self.render_diagnostics(theme); diff --git a/src/tui/mainview.zig b/src/tui/mainview.zig index d781da1..98795f6 100644 --- a/src/tui/mainview.zig +++ b/src/tui/mainview.zig @@ -572,25 +572,17 @@ const cmds = struct { pub fn gutter_mode_next(self: *Self, _: Ctx) Result { const config = tui.config_mut(); - var ln = config.gutter_line_numbers; - var lnr = config.gutter_line_numbers_relative; - if (ln and !lnr) { - ln = true; - lnr = true; - } else if (ln and lnr) { - ln = false; - lnr = false; - } else { - ln = true; - lnr = false; - } - config.gutter_line_numbers = ln; - config.gutter_line_numbers_relative = lnr; + const mode: ?@import("config").LineNumberMode = if (config.gutter_line_numbers_mode) |mode| switch(mode) { + .absolute => .relative, + .relative => .none, + .none => null, + } else .relative; + + config.gutter_line_numbers_mode = mode; try tui.save_config(); if (self.widgets.get("editor_gutter")) |gutter_widget| { const gutter = gutter_widget.dynamic_cast(@import("editor_gutter.zig")) orelse return; - gutter.linenum = ln; - gutter.mode = if(lnr) .relative else null; + gutter.mode = mode; } } pub const gutter_mode_next_meta = .{ .description = "Next gutter mode" };