Compare commits

...

9 commits

6 changed files with 57 additions and 112 deletions

View file

@ -52,12 +52,8 @@
["ctrl+shift+tab", "previous_tab"],
["ctrl+page_down", "next_tab"],
["ctrl+page_up", "previous_tab"],
["ctrl+kp_page_down", "next_tab"],
["ctrl+kp_page_up", "previous_tab"],
["ctrl+shift+page_down", "move_tab_next"],
["ctrl+shift+page_up", "move_tab_previous"],
["ctrl+shift+kp_page_down", "move_tab_next"],
["ctrl+shift+kp_page_up", "move_tab_previous"],
["ctrl+shift+e", "switch_buffers"],
["alt+shift+v", "clipboard_history"],
["ctrl+0", "reset_fontsize"],
@ -107,20 +103,12 @@
["ctrl+enter", "smart_insert_line_after"],
["ctrl+end", "move_buffer_end"],
["ctrl+home", "move_buffer_begin"],
["ctrl+kp_end", "move_buffer_end"],
["ctrl+kp_home", "move_buffer_begin"],
["ctrl+up", "move_scroll_up"],
["ctrl+down", "move_scroll_down"],
["ctrl+kp_up", "move_scroll_up"],
["ctrl+kp_down", "move_scroll_down"],
["alt+page_up", "move_scroll_page_up"],
["alt+page_down", "move_scroll_page_down"],
["alt+kp_page_up", "move_scroll_page_up"],
["alt+kp_page_down", "move_scroll_page_down"],
["ctrl+left", "move_word_left"],
["ctrl+right", "move_word_right"],
["ctrl+kp_left", "move_word_left"],
["ctrl+kp_right", "move_word_right"],
["ctrl+shift+\\", "goto_bracket"],
["ctrl+backspace", "delete_word_left"],
["ctrl+delete", "delete_word_right"],
@ -137,16 +125,10 @@
["ctrl+shift+enter", "smart_insert_line_before"],
["ctrl+shift+end", "select_buffer_end"],
["ctrl+shift+home", "select_buffer_begin"],
["ctrl+shift+kp_end", "select_buffer_end"],
["ctrl+shift+kp_home", "select_buffer_begin"],
["ctrl+shift+up", "select_scroll_up"],
["ctrl+shift+down", "select_scroll_down"],
["ctrl+shift+kp_up", "select_scroll_up"],
["ctrl+shift+kp_down", "select_scroll_down"],
["ctrl+shift+left", "select_word_left"],
["ctrl+shift+right", "select_word_right"],
["ctrl+shift+kp_left", "select_word_left"],
["ctrl+shift+kp_right", "select_word_right"],
["ctrl+shift+space", "selections_reverse"],
["alt+j", "join_next_line"],
["alt+n", "goto_next_file_or_diagnostic"],
@ -164,12 +146,8 @@
["alt+R", ["shell_execute_insert", "openssl", "rand", "-hex", "4"]],
["alt+left", "jump_back"],
["alt+right", "jump_forward"],
["alt+kp_left", "jump_back"],
["alt+kp_right", "jump_forward"],
["alt+up", "pull_up"],
["alt+down", "pull_down"],
["alt+kp_up", "pull_up"],
["alt+kp_down", "pull_down"],
["alt+enter", "insert_line"],
["alt+f10", "gutter_mode_next"],
["alt+shift+f10", "gutter_style_next"],
@ -180,12 +158,8 @@
["alt+shift+i", "add_cursors_to_line_ends"],
["alt+shift+left", "expand_selection"],
["alt+shift+right", "shrink_selection"],
["alt+shift+kp_left", "expand_selection"],
["alt+shift+kp_right", "shrink_selection"],
["alt+home", "select_prev_sibling"],
["alt+end", "select_next_sibling"],
["alt+kp_home", "select_prev_sibling"],
["alt+kp_end", "select_next_sibling"],
["alt+{", "expand_selection"],
["alt+}", "shrink_selection", true],
["alt+[", "select_prev_sibling", true],
@ -193,32 +167,20 @@
["alt+a", "select_all_siblings"],
["alt+shift+home", "move_scroll_left"],
["alt+shift+end", "move_scroll_right"],
["alt+shift+kp_home", "move_scroll_left"],
["alt+shift+kp_end", "move_scroll_right"],
["alt+shift+up", "add_cursor_up"],
["alt+shift+down", "add_cursor_down"],
["alt+shift+kp_up", "add_cursor_up"],
["alt+shift+kp_down", "add_cursor_down"],
["alt+shift+f12", "goto_type_definition"],
["shift+f3", "goto_prev_match"],
["shift+f10", "toggle_syntax_highlighting"],
["shift+f12", "references"],
["shift+left", "select_left"],
["shift+right", "select_right"],
["shift+kp_left", "select_left"],
["shift+kp_right", "select_right"],
["shift+up", "select_up"],
["shift+down", "select_down"],
["shift+kp_up", "select_up"],
["shift+kp_down", "select_down"],
["shift+home", "smart_select_begin"],
["shift+end", "select_end"],
["shift+kp_home", "smart_select_begin"],
["shift+kp_end", "select_end"],
["shift+page_up", "select_page_up"],
["shift+page_down", "select_page_down"],
["shift+kp_page_up", "select_page_up"],
["shift+kp_page_down", "select_page_down"],
["shift+enter", "smart_insert_line_before"],
["shift+backspace", "delete_backward"],
["ctrl+shift+k", "delete_line"],
@ -243,22 +205,13 @@
["backspace", "smart_delete_backward"],
["left", "move_left"],
["right", "move_right"],
["kp_left", "move_left"],
["kp_right", "move_right"],
["up", "move_up"],
["down", "move_down"],
["kp_up", "move_up"],
["kp_down", "move_down"],
["home", "smart_move_begin"],
["ctrl+k home", "move_begin"],
["end", "move_end"],
["kp_home", "smart_move_begin"],
["ctrl+k kp_home", "move_begin"],
["kp_end", "move_end"],
["page_up", "move_page_up"],
["page_down", "move_page_down"],
["kp_page_up", "move_page_up"],
["kp_page_down", "move_page_down"],
["tab", "indent"],
["ctrl+shift+a", "enter_mode", "select"],
@ -314,30 +267,16 @@
["right", "select_right"],
["ctrl+left", "select_word_left"],
["ctrl+right", "select_word_right"],
["kp_left", "select_left"],
["kp_right", "select_right"],
["ctrl+kp_left", "select_word_left"],
["ctrl+kp_right", "select_word_right"],
["up", "select_up"],
["down", "select_down"],
["kp_up", "select_up"],
["kp_down", "select_down"],
["home", "select_begin"],
["end", "select_end"],
["kp_home", "select_begin"],
["kp_end", "select_end"],
["ctrl+home", "select_buffer_begin"],
["ctrl+end", "select_buffer_end"],
["ctrl+kp_home", "select_buffer_begin"],
["ctrl+kp_end", "select_buffer_end"],
["page_up", "select_page_up"],
["page_down", "select_page_down"],
["alt+page_up", "select_scroll_page_up"],
["alt+page_down", "select_scroll_page_down"],
["kp_page_up", "select_page_up"],
["kp_page_down", "select_page_down"],
["alt+kp_page_up", "select_scroll_page_up"],
["alt+kp_page_down", "select_scroll_page_down"],
["ctrl+b", "move_to_char", "select_to_char_left"],
["ctrl+t", "move_to_char", "select_to_char_right"],
["shift+space", "enter_mode", "normal"],
@ -378,8 +317,6 @@
["q", "quit"],
["up", "home_menu_up"],
["down", "home_menu_down"],
["kp_up", "home_menu_up"],
["kp_down", "home_menu_down"],
["enter", "home_menu_activate"]
]
},
@ -404,8 +341,6 @@
["ctrl+escape", "palette_menu_cancel"],
["ctrl+up", "palette_menu_up"],
["ctrl+down", "palette_menu_down"],
["ctrl+kp_up", "palette_menu_up"],
["ctrl+kp_down", "palette_menu_down"],
["ctrl+enter", "palette_menu_activate"],
["ctrl+backspace", "overlay_delete_word_left"],
["ctrl+shift+e", "palette_menu_up"],
@ -424,16 +359,10 @@
["escape", "palette_menu_cancel"],
["up", "palette_menu_up"],
["down", "palette_menu_down"],
["kp_up", "palette_menu_up"],
["kp_down", "palette_menu_down"],
["page_up", "palette_menu_pageup"],
["page_down", "palette_menu_pagedown"],
["kp_page_up", "palette_menu_pageup"],
["kp_page_down", "palette_menu_pagedown"],
["home", "palette_menu_top"],
["end", "palette_menu_bottom"],
["kp_home", "palette_menu_top"],
["kp_end", "palette_menu_bottom"],
["enter", "palette_menu_activate"],
["shift+enter", "palette_menu_activate_alternate"],
["tab", "palette_menu_complete"],
@ -512,12 +441,8 @@
["shift+tab", "mini_mode_reverse_complete_file"],
["up", "mini_mode_reverse_complete_file"],
["down", "mini_mode_try_complete_file"],
["kp_up", "mini_mode_reverse_complete_file"],
["kp_down", "mini_mode_try_complete_file"],
["left", "mini_mode_delete_to_previous_path_segment"],
["right", "mini_mode_try_complete_file_forward"],
["kp_left", "mini_mode_delete_to_previous_path_segment"],
["kp_right", "mini_mode_try_complete_file_forward"],
["tab", "mini_mode_try_complete_file"],
["escape", "mini_mode_cancel"],
["enter", "mini_mode_select"],
@ -549,8 +474,6 @@
["shift+f3", "goto_prev_match"],
["up", "select_prev_file"],
["down", "select_next_file"],
["kp_up", "select_prev_file"],
["kp_down", "select_next_file"],
["f3", "goto_next_match"],
["f15", "goto_prev_match"],
["f9", "theme_prev"],
@ -585,8 +508,6 @@
["shift+f3", "goto_prev_match"],
["up", "mini_mode_history_prev"],
["down", "mini_mode_history_next"],
["kp_up", "mini_mode_history_prev"],
["kp_down", "mini_mode_history_next"],
["f3", "goto_next_match"],
["f15", "goto_prev_match"],
["f9", "theme_prev"],

View file

@ -47,16 +47,12 @@
["alt+;", "flip_selections"],
["alt+o", "expand_selection"],
["alt+up", "expand_selection"],
["alt+kp_up", "expand_selection"],
["alt+i", "shrink_selection"],
["alt+down", "shrink_selection"],
["alt+kp_down", "shrink_selection"],
["alt+p", "select_prev_sibling"],
["alt+left", "select_prev_sibling"],
["alt+kp_left", "select_prev_sibling"],
["alt+n", "select_next_sibling"],
["alt+right", "select_next_sibling"],
["alt+kp_right", "select_next_sibling"],
["alt+e", "move_parent_node_end"],
["alt+b", "move_parent_node_start"],
@ -97,7 +93,6 @@
["?", "rfind"],
["N", "goto_prev_match"],
["*", "search_selection"],
["kp_multiply", "search_selection"],
["~", "switch_case"],
["`", "to_lower"],
@ -133,8 +128,6 @@
["home", "move_begin"],
["end", "move_end"],
["kp_home", "move_begin"],
["kp_end", "move_end"],
["v", "enter_mode", "select"],
@ -206,7 +199,6 @@
["] space", "add_newline_below"],
["/", "find"],
["kp_divide", "find"],
["n", "goto_next_match"],
["u", "undo"],
@ -226,8 +218,6 @@
["page_up", "move_scroll_page_up"],
["page_down", "move_scroll_page_down"],
["kp_page_up", "move_scroll_page_up"],
["kp_page_down", "move_scroll_page_down"],
["space F", "find_file"],
["space S", "workspace_symbol_picker"],
@ -327,10 +317,6 @@
["alt+down", "shrink_selection"],
["alt+left", "select_prev_sibling"],
["alt+right", "select_next_sibling"],
["alt+kp_up", "expand_selection"],
["alt+kp_down", "shrink_selection"],
["alt+kp_left", "select_prev_sibling"],
["alt+kp_right", "select_next_sibling"],
["alt+e", "extend_parent_node_end"],
["alt+b", "extend_parent_node_start"],
@ -387,7 +373,6 @@
["N", "extend_search_next"],
["*", "search_selection"],
["kp_multiply", "search_selection"],
["r", "replace"],
["P", "paste_clipboard_before"],
@ -420,18 +405,12 @@
["down", "select_down"],
["up", "select_up"],
["right", "select_right_helix"],
["kp_left", "select_left_helix"],
["kp_down", "select_down"],
["kp_up", "select_up"],
["kp_right", "select_right_helix"],
["%", "select_all"],
["`", "switch_to_lowercase"],
["home", "extend_to_line_start"],
["end", "extend_to_line_end"],
["kp_home", "extend_to_line_start"],
["kp_end", "extend_to_line_end"],
["v", "enter_mode", "normal"],
["g g", "goto_line_vim"],
@ -503,7 +482,6 @@
["] space", "add_newline_below"],
["/", "find"],
["kp_divide", "find"],
["n", "add_next_match_helix"],
["u", "undo"],

View file

@ -435,11 +435,22 @@ pub const Binding = struct {
if (self.key_events.len == 0) return .match_impossible;
for (self.key_events, 0..) |key_event, i| {
if (match_key_events.len <= i) return .match_possible;
if (!(key_event.eql(match_key_events[i]) or key_event.eql_unshifted(match_key_events[i])))
if (!keyevents_eql(key_event, match_key_events[i]))
return .match_impossible;
}
return if (self.key_events.len == match_key_events.len) .matched else .match_possible;
}
fn keyevents_eql(lhs: KeyEvent, rhs: KeyEvent) bool {
if (lhs.eql(rhs) or lhs.eql_unshifted(rhs)) return true;
if (input.map_non_input_kp_key_to_regular_key(rhs.key)) |key| {
var mapped = rhs;
mapped.key = key;
mapped.key_unshifted = key;
if (lhs.eql(mapped) or lhs.eql_unshifted(mapped)) return true;
}
return false;
}
};
pub const KeybindHints = std.StringHashMapUnmanaged([]u8);

View file

@ -29,7 +29,9 @@ pub const mouse = struct {
/// Does this key represent input?
pub fn is_non_input_key(w: Key) bool {
return switch (w) {
vaxis.Key.insert...vaxis.Key.iso_level_5_shift => true,
vaxis.Key.insert...vaxis.Key.f34 => true,
// skip kp_0 to kp_separator (which are between f34 and kp_left)
vaxis.Key.kp_left...vaxis.Key.iso_level_5_shift => true,
vaxis.Key.enter => true,
vaxis.Key.tab => true,
vaxis.Key.escape => true,
@ -247,6 +249,16 @@ pub const utils = struct {
vaxis.Key.kp_insert => "kp_insert",
vaxis.Key.kp_delete => "kp_delete",
vaxis.Key.kp_begin => "kp_begin",
vaxis.Key.kp_0 => "kp_0",
vaxis.Key.kp_1 => "kp_1",
vaxis.Key.kp_2 => "kp_2",
vaxis.Key.kp_3 => "kp_3",
vaxis.Key.kp_4 => "kp_4",
vaxis.Key.kp_5 => "kp_5",
vaxis.Key.kp_6 => "kp_6",
vaxis.Key.kp_7 => "kp_7",
vaxis.Key.kp_8 => "kp_8",
vaxis.Key.kp_9 => "kp_9",
vaxis.Key.media_play => "media_play",
vaxis.Key.media_pause => "media_pause",
vaxis.Key.media_play_pause => "media_play_pause",
@ -449,3 +461,20 @@ fn map_key_to_unshifed_legacy(keypress_shifted: Key, mods: Mods) struct { Key, M
else => .{ keypress_shifted, mods },
};
}
pub fn map_non_input_kp_key_to_regular_key(key_: Key) ?Key {
return switch (key_) {
vaxis.Key.kp_enter => vaxis.Key.enter,
vaxis.Key.kp_left => vaxis.Key.left,
vaxis.Key.kp_right => vaxis.Key.right,
vaxis.Key.kp_up => vaxis.Key.up,
vaxis.Key.kp_down => vaxis.Key.down,
vaxis.Key.kp_page_up => vaxis.Key.page_up,
vaxis.Key.kp_page_down => vaxis.Key.page_down,
vaxis.Key.kp_home => vaxis.Key.home,
vaxis.Key.kp_end => vaxis.Key.end,
vaxis.Key.kp_insert => vaxis.Key.insert,
vaxis.Key.kp_delete => vaxis.Key.delete,
else => null,
};
}

View file

@ -314,6 +314,7 @@ pub const Editor = struct {
selection_drag_initial: ?Selection = null,
target_column: ?Cursor = null,
filter_: ?struct {
arg0: ?[]const u8,
before_root: Buffer.Root,
work_root: Buffer.Root,
begin: Cursor,
@ -6209,7 +6210,10 @@ pub const Editor = struct {
};
const reversed = sel.is_reversed();
sel.normalize();
var arg0: []const u8 = &.{};
_ = cmd.match(.{ tp.extract(&arg0), tp.more }) catch {};
self.filter_ = .{
.arg0 = try self.allocator.dupe(u8, arg0),
.before_root = root,
.work_root = root,
.begin = sel.begin,
@ -6222,7 +6226,7 @@ pub const Editor = struct {
const state = &self.filter_.?;
var buf: [1024]u8 = undefined;
const json = try cmd.to_json(&buf);
self.logger.print("filter: start {s}", .{json});
std.log.debug("filter: start {s}", .{json});
var sp = try tp.subprocess.init(self.allocator, cmd, "filter", .Pipe);
defer {
sp.close() catch {};
@ -6232,7 +6236,7 @@ pub const Editor = struct {
var writer = sp.writer(&sp_buf);
try state.before_root.write_range(sel, &writer.interface, null, self.metrics);
try writer.interface.flush();
self.logger.print("filter: sent", .{});
std.log.debug("filter: sent", .{});
state.work_root = try state.work_root.delete_range(sel, buf_a_, null, self.metrics);
}
@ -6251,7 +6255,7 @@ pub const Editor = struct {
}
fn filter_error(self: *Self, bytes: []const u8) !void {
self.logger.print("filter: ERR: {s}", .{bytes});
std.log.err("filter: ERR: {s}", .{bytes});
if (tui.config().ignore_filter_stderr) return;
defer self.filter_deinit();
if (self.need_save_after_filter) |info| {
@ -6263,7 +6267,8 @@ pub const Editor = struct {
fn filter_not_found(self: *Self) !void {
defer self.filter_deinit();
self.logger.print_err("filter", "executable not found", .{});
if (self.filter_) |*state|
std.log.err("executable '{?s}' not found", .{state.arg0});
if (self.need_save_after_filter) |info| {
try self.save();
if (info.then) |then|
@ -6280,7 +6285,7 @@ pub const Editor = struct {
const primary = self.get_primary();
if (state.whole_file) |buf| {
if (buf.items.len == 0) {
self.logger.print_err("filter", "empty filter result", .{});
std.log.err("filter: no output from filter", .{});
return;
}
const old_hash = blk: {
@ -6309,9 +6314,9 @@ pub const Editor = struct {
if (state.old_primary_reversed) sel.reverse();
primary.cursor = sel.end;
}
self.logger.print("filter: done (bytes:{d} chunks:{d})", .{ state.bytes, state.chunks });
std.log.debug("filter: done (bytes:{d} chunks:{d})", .{ state.bytes, state.chunks });
if (state.no_changes) {
self.logger.print("filter: no changes", .{});
std.log.warn("filter: no changes", .{});
} else {
try self.update_buf_and_eol_mode(state.work_root, state.eol_mode, state.utf8_sanitized);
primary.cursor.clamp_to_buffer(state.work_root, self.metrics);
@ -6328,6 +6333,7 @@ pub const Editor = struct {
fn filter_deinit(self: *Self) void {
const state = if (self.filter_) |*s| s else return;
if (state.arg0) |arg0| self.allocator.free(arg0);
if (state.whole_file) |*buf| buf.deinit(self.allocator);
self.filter_ = null;
}

View file

@ -617,8 +617,8 @@ fn render(self: *Self) void {
switch (self.hint_mode) {
.prefix => if (self.config_.enable_prefix_keyhints)
@import("keyhints.zig").render_current_key_event_sequence(self.allocator, .no_keypad, self.current_theme()),
.all => @import("keyhints.zig").render_current_input_mode(self.allocator, .no_keypad, self.current_theme()),
@import("keyhints.zig").render_current_key_event_sequence(self.allocator, .all, self.current_theme()),
.all => @import("keyhints.zig").render_current_input_mode(self.allocator, .all, self.current_theme()),
.none => {},
}