diff --git a/src/tui/editor.zig b/src/tui/editor.zig index 81ebdad..4d5d2ab 100644 --- a/src/tui/editor.zig +++ b/src/tui/editor.zig @@ -542,9 +542,8 @@ pub const Editor = struct { tp.extract_cbor(&cursels_cbor), })) return error.RestoreStateMatch; - self.insert_triggers.deinit(self.allocator); + self.clear_event_triggers(); self.insert_triggers = .fromOwnedSlice(insert_triggers); - self.delete_triggers.deinit(self.allocator); self.delete_triggers = .fromOwnedSlice(delete_triggers); self.refresh_tab_width(); if (op == .open_file) @@ -614,8 +613,7 @@ pub const Editor = struct { for (self.diagnostics.items) |*d| d.deinit(self.allocator); self.diagnostics.deinit(self.allocator); self.completions.deinit(self.allocator); - self.insert_triggers.deinit(self.allocator); - self.delete_triggers.deinit(self.allocator); + self.clear_event_triggers(); if (self.syntax) |syn| syn.destroy(tui.query_cache()); self.cancel_all_tabstops(); self.cursels.deinit(self.allocator); @@ -6234,9 +6232,31 @@ pub const Editor = struct { }; } + fn clear_event_triggers(self: *Self) void { + self.insert_triggers.deinit(self.allocator); + self.delete_triggers.deinit(self.allocator); + self.insert_triggers = .empty; + self.delete_triggers = .empty; + } + + pub fn update_completion_triggers(self: *Self) void { + self.clear_event_triggers(); + if (self.file_type) |ft| if (ft.language_server) |ls| if (ls.len > 0) { + const lsp_arg0 = ls[0]; + const info = (tui.mainview() orelse return).lsp_info.table.get(lsp_arg0) orelse return; + self.add_completion_triggers(info.trigger_characters.items); + }; + } + fn add_default_symbol_triggers(self: *Self) void { + const chars: []const []const u8 = &.{"."}; + self.add_completion_triggers(chars); + } + + fn add_completion_triggers(self: *Self, triggers: []const []const u8) void { const id = command.get_name_id("completion"); - self.add_symbol_trigger('.', id, .insert) catch {}; + for (triggers) |char| if (char.len > 0) + self.add_symbol_trigger(char[0], id, .insert) catch {}; } pub fn add_symbol_trigger(self: *Self, char: u8, command_: command.ID, event: TriggerEvent) error{OutOfMemory}!void { diff --git a/src/tui/lsp_info.zig b/src/tui/lsp_info.zig index d44039a..6659804 100644 --- a/src/tui/lsp_info.zig +++ b/src/tui/lsp_info.zig @@ -3,6 +3,10 @@ table: Table, const Table = std.StringHashMapUnmanaged(Info); +pub const Info = struct { + trigger_characters: std.ArrayList([]const u8) = .empty, +}; + pub fn init(allocator: std.mem.Allocator) @This() { return .{ .allocator = allocator, @@ -60,10 +64,6 @@ pub fn add(self: *@This(), lsp_arg0: []const u8, iter: *[]const u8) error{ Inval return value; } -pub const Info = struct { - trigger_characters: std.ArrayList([]const u8) = .empty, -}; - pub fn write_state(self: *@This(), writer: *std.Io.Writer) error{WriteFailed}!void { try cbor.writeArrayHeader(writer, self.table.count()); var iter = self.table.iterator(); diff --git a/src/tui/mainview.zig b/src/tui/mainview.zig index da49c62..fbc94f7 100644 --- a/src/tui/mainview.zig +++ b/src/tui/mainview.zig @@ -1994,3 +1994,9 @@ pub fn vcs_content_update(self: *Self, m: tp.message) void { editor.vcs_content_update() catch {}; } } + +pub fn trigger_characters_update(self: *Self, m: tp.message) void { + self.lsp_info.add_from_event(m.buf) catch return; + const editor = self.get_active_editor() orelse return; + editor.update_completion_triggers(); +} diff --git a/src/tui/tui.zig b/src/tui/tui.zig index 416dc60..d0e0a74 100644 --- a/src/tui/tui.zig +++ b/src/tui/tui.zig @@ -534,7 +534,7 @@ fn receive_safe(self: *Self, from: tp.pid_ref, m: tp.message) !void { return if (mainview()) |mv| mv.vcs_content_update(m); if (try m.match(.{ "PRJ", "triggerCharacters", tp.more })) - return if (mainview()) |mv| mv.lsp_info.add_from_event(m.buf); + return if (mainview()) |mv| mv.trigger_characters_update(m); if (try m.match(.{ "PRJ", tp.more })) // drop late project manager query responses return;