feat: add support in keybind module for looking up key sequence prefix matches
This is the initial part of some sort of which-key like function.
This commit is contained in:
parent
11d6770913
commit
a6e1087773
1 changed files with 21 additions and 1 deletions
|
|
@ -72,13 +72,15 @@ const Handler = struct {
|
||||||
opts.insert_command
|
opts.insert_command
|
||||||
else
|
else
|
||||||
"insert_chars";
|
"insert_chars";
|
||||||
|
const bindings = try get_mode_binding_set(mode_name, insert_command);
|
||||||
self.* = .{
|
self.* = .{
|
||||||
.allocator = allocator,
|
.allocator = allocator,
|
||||||
.bindings = try get_mode_binding_set(mode_name, insert_command),
|
.bindings = bindings,
|
||||||
};
|
};
|
||||||
return .{
|
return .{
|
||||||
.allocator = allocator,
|
.allocator = allocator,
|
||||||
.input_handler = EventHandler.to_owned(self),
|
.input_handler = EventHandler.to_owned(self),
|
||||||
|
.bindings = bindings,
|
||||||
.keybind_hints = self.bindings.hints(),
|
.keybind_hints = self.bindings.hints(),
|
||||||
.mode = try allocator.dupe(u8, mode_name),
|
.mode = try allocator.dupe(u8, mode_name),
|
||||||
.name = self.bindings.name,
|
.name = self.bindings.name,
|
||||||
|
|
@ -130,6 +132,7 @@ pub const Mode = struct {
|
||||||
mode: []const u8,
|
mode: []const u8,
|
||||||
name: []const u8 = "",
|
name: []const u8 = "",
|
||||||
line_numbers: LineNumbers = .inherit,
|
line_numbers: LineNumbers = .inherit,
|
||||||
|
bindings: *const BindingSet,
|
||||||
keybind_hints: *const KeybindHints,
|
keybind_hints: *const KeybindHints,
|
||||||
cursor_shape: ?CursorShape = null,
|
cursor_shape: ?CursorShape = null,
|
||||||
selection_style: SelectionStyle,
|
selection_style: SelectionStyle,
|
||||||
|
|
@ -173,6 +176,11 @@ pub const Mode = struct {
|
||||||
self.deinit_command = null;
|
self.deinit_command = null;
|
||||||
self.initialized = false;
|
self.initialized = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn current_key_event_sequence_bindings(self: *const Mode, allocator: std.mem.Allocator) error{OutOfMemory}![]const Binding {
|
||||||
|
if (globals.current_sequence.items.len == 0) return &.{};
|
||||||
|
return self.bindings.get_matches_for_key_event_sequence(allocator, globals.current_sequence.items);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const NamespaceMap = std.StringHashMapUnmanaged(Namespace);
|
const NamespaceMap = std.StringHashMapUnmanaged(Namespace);
|
||||||
|
|
@ -768,6 +776,18 @@ const BindingSet = struct {
|
||||||
globals.current_sequence.clearRetainingCapacity();
|
globals.current_sequence.clearRetainingCapacity();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Retreive bindings that will match a key event sequence
|
||||||
|
pub fn get_matches_for_key_event_sequence(self: *const @This(), allocator: std.mem.Allocator, sequence: []const KeyEvent) error{OutOfMemory}![]const Binding {
|
||||||
|
var matches: std.ArrayListUnmanaged(Binding) = .{};
|
||||||
|
for (self.press.items) |*binding| switch (binding.match(sequence)) {
|
||||||
|
.matched, .match_possible => {
|
||||||
|
(try matches.addOne(allocator)).* = binding.*;
|
||||||
|
},
|
||||||
|
.match_impossible => {},
|
||||||
|
};
|
||||||
|
return matches.toOwnedSlice(allocator);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
pub const LineNumbers = enum {
|
pub const LineNumbers = enum {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue