Chording support for vim mode (#53)
* initial experimental success * refined chording * add default value * refactor chording from switch to if * revert change introduced when debugging * remove unnecessary try * added configuration option
This commit is contained in:
parent
2f3487fff0
commit
b70da1918c
2 changed files with 50 additions and 0 deletions
|
@ -8,6 +8,7 @@ gutter_line_numbers_relative: bool = false,
|
||||||
vim_normal_gutter_line_numbers_relative: bool = true,
|
vim_normal_gutter_line_numbers_relative: bool = true,
|
||||||
vim_visual_gutter_line_numbers_relative: bool = true,
|
vim_visual_gutter_line_numbers_relative: bool = true,
|
||||||
vim_insert_gutter_line_numbers_relative: bool = false,
|
vim_insert_gutter_line_numbers_relative: bool = false,
|
||||||
|
vim_insert_chording_keybindings: bool = true,
|
||||||
enable_terminal_cursor: bool = false,
|
enable_terminal_cursor: bool = false,
|
||||||
enable_terminal_color_scheme: bool = builtin.os.tag != .windows,
|
enable_terminal_color_scheme: bool = builtin.os.tag != .windows,
|
||||||
highlight_current_line: bool = true,
|
highlight_current_line: bool = true,
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
const tp = @import("thespian");
|
const tp = @import("thespian");
|
||||||
|
const std = @import("std");
|
||||||
|
|
||||||
const key = @import("renderer").input.key;
|
const key = @import("renderer").input.key;
|
||||||
const mod = @import("renderer").input.modifier;
|
const mod = @import("renderer").input.modifier;
|
||||||
|
@ -21,6 +22,14 @@ input: ArrayList(u8),
|
||||||
last_cmd: []const u8 = "",
|
last_cmd: []const u8 = "",
|
||||||
leader: ?struct { keypress: u32, modifiers: u32 } = null,
|
leader: ?struct { keypress: u32, modifiers: u32 } = null,
|
||||||
commands: Commands = undefined,
|
commands: Commands = undefined,
|
||||||
|
last_key: KeyPressEvent = .{},
|
||||||
|
|
||||||
|
pub const KeyPressEvent = struct {
|
||||||
|
keypress: u32 = 0,
|
||||||
|
modifiers: u32 = std.math.maxInt(u32),
|
||||||
|
egc: u32 = 0,
|
||||||
|
timestamp_ms: i64 = 0,
|
||||||
|
};
|
||||||
|
|
||||||
pub fn create(allocator: Allocator) !tui.Mode {
|
pub fn create(allocator: Allocator) !tui.Mode {
|
||||||
const self: *Self = try allocator.create(Self);
|
const self: *Self = try allocator.create(Self);
|
||||||
|
@ -82,6 +91,46 @@ fn mapPress(self: *Self, keypress: u32, egc: u32, modifiers: u32) !void {
|
||||||
key.LALT, key.RALT => return self.cmd("enable_jump_mode", .{}),
|
key.LALT, key.RALT => return self.cmd("enable_jump_mode", .{}),
|
||||||
else => {},
|
else => {},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (tui.current().config.vim_insert_chording_keybindings) {
|
||||||
|
|
||||||
|
//reset chord if enough time has passed
|
||||||
|
const chord_time_window_ms = 750;
|
||||||
|
if (std.time.milliTimestamp() - self.last_key.timestamp_ms > chord_time_window_ms) {
|
||||||
|
self.last_key = .{};
|
||||||
|
}
|
||||||
|
|
||||||
|
//chording
|
||||||
|
if (self.last_key.keypress == 'j' and self.last_key.modifiers == 0 and keypress == 'k' and modifiers == 0) {
|
||||||
|
try self.cmd("delete_backward", .{});
|
||||||
|
try self.cmd("enter_mode", command.fmt(.{"vim/normal"}));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (self.last_key.keypress == 'k' and self.last_key.modifiers == 0 and keypress == 'j' and modifiers == 0) {
|
||||||
|
try self.cmd("delete_backward", .{});
|
||||||
|
try self.cmd("enter_mode", command.fmt(.{"vim/normal"}));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (self.last_key.keypress == 'f' and self.last_key.modifiers == 0 and keypress == 'j' and modifiers == 0) {
|
||||||
|
try self.cmd("delete_backward", .{});
|
||||||
|
try self.cmd("enter_mode", command.fmt(.{"vim/normal"}));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (self.last_key.keypress == 'j' and self.last_key.modifiers == 0 and keypress == 'f' and modifiers == 0) {
|
||||||
|
try self.cmd("delete_backward", .{});
|
||||||
|
try self.cmd("enter_mode", command.fmt(.{"vim/normal"}));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//record current key event
|
||||||
|
self.last_key = .{
|
||||||
|
.keypress = keypress,
|
||||||
|
.modifiers = modifiers,
|
||||||
|
.egc = egc,
|
||||||
|
.timestamp_ms = std.time.milliTimestamp(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
return switch (modifiers) {
|
return switch (modifiers) {
|
||||||
mod.CTRL => switch (keynormal) {
|
mod.CTRL => switch (keynormal) {
|
||||||
'E' => self.cmd("open_recent", .{}),
|
'E' => self.cmd("open_recent", .{}),
|
||||||
|
|
Loading…
Add table
Reference in a new issue